Запуск Windows под Linux KVMИсточник: habrahabr IlyaEvseev
Задача: запустить некоторое количество виртуальных машин с Windows на типовом Линукс-сервере. Решение: любой современный Linux-дистрибутив, "родная" технология виртуализации KVM, Windows 2003 и настройки, описанные ниже. Выбор гостевой ОСWindows XP работает под Linux KVM неустойчиво. Основные ошибки - потребление 100% процессора процессом csrss.exe (вплоть до обрыва RDP-сессий) и BSOD с кодом IRQL_NOT_LESS_OR_EQUAL в HAL.DLL. Если удалось достичь стабильной работы, обязательно отключите автоматическую установку обновлений! По нашему опыту, для работы WinXP под KVM они стали главным источником проблем. Windows 7 работает нормально, но согласно счётчикам Proxmox, требует для работы более 3 гигабайт ОЗУ. Оптимальным вариантом оказалась 32-разрядная редакция Windows 2003 R2:
Верхнего лимита в 4 гигабайта памяти (без PAE) оказалось достаточно для всех возникавших задач. Для ознакомительных целей годится любой опубликованный на RuTracker дистрибутив, например, этот.
Первый запуск и virtio#!/bin/sh VM_ID="10" MACBASE="00:16:3e:ff:ff" HDA="vm_${VM_ID}.img" HDB="temp.img" HDC="w2k3_r2_ent_rus_x86/ru_win_srv_2003_r2_enterprise_with_sp2_vl_cd1_X13-46484.iso" HDD="virtio-win-0.1-52.iso" sudo kvm \ -enable-kvm \ -boot "menu=on,order=d" \ -m 1024M \ -balloon virtio \ -name "kvm_${VM_ID}" \ -drive "file=$HDA,index=0,media=disk,cache=writeback" \ -drive "file=$HDB,index=1,media=disk,cache=writeback,if=virtio" \ -drive "file=$HDC,index=2,media=cdrom,cache=writeback,readonly" \ -drive "file=$HDD,index=3,media=cdrom,cache=writeback,readonly" \ -net "nic,model=virtio,macaddr=${MACBASE}:${VM_ID}" \ -net "tap,ifname=tap${VM_ID},script=no,downscript=no" \ -vnc "0.0.0.0:${VM_ID}" Параметр "-vnc ..." имеет смысл только на сервере без GUI. По умолчанию KVM откроет окно через SDL. В обоих случаях Ctrl+Alt+Shift+1 и Ctrl+Alt+Shift+2 служат для переключения внутри окна между гостевой и управляющей консолью. Параметр " Теперь про самое важное на данном этапе, т.е. про диски. HDC - это ISO-образ с дистрибутивом Windows. Имя файла взято из торрента в предыдущем разделе. С него внутри ВМ произойдет первая загрузка системы (" HDD - это ISO-образ с драйверами virtio. Скачивается с alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/ HDA - это пустой образ диска, на который будет устанавливаться система. Создан командой " HDB - это пустой образ диска, созданный через " После того, как установка системы и драйверов будет полностью завершена, в команде запуска следует убрать "-boot" и все строки "-drive", кроме первой, т.к. временный диск и ISO-образы станут не нужны (обратите внимание на добавленный "
Рекомендуемые настройки WindowsВо-первых, по умолчанию Windows создаёт при BSOD'ах полный дамп памяти. В лучшем случае, это существенно замедлит перезагрузку. В худшем, приведёт к полному зависанию. Во-вторых, автоматические обновления по умолчанию включены, и есть риск, что одно из них сделает работу под KVM нестабильной. Поэтому после завершения инсталляции в самую первую очередь (до установки драйверов!) рекомендуется зайти в Панель управления => Система:
Настройки TCP/IP не являются обязательными, но немного повысят производительность, т.к. в виртуальной среде отсутствуют некоторые проблемы, которые нужно учитывать при передаче по физической сети. Описание: www.linux-kvm.org/page/WindowsGuestDrivers/kvmnet/registry Готовый REG-файл: svn1.sytes.net/linuxkvm/tune-guest-tcpip.reg После этого можете приступать к установке драйверов для диска (virt-stor) и сетевой карты (virt-net). После их установки в Диспетчере оборудования появятся "Red Hat VirtIO SCSI Controller", "Red Hat VirtIO SCSI Disk Device" и "Red Hat VirtIO Ethernet Adapter".
BallooningТрадиционный подход - сразу при запуске виртуальной машины (ВМ) выделять ей блок ОЗУ заданного размера, например, 512 мегабайт. Его недостаток - в те моменты, когда в памяти ВМ есть неиспользуемое пространство, в других ВМ и хост-системе её может не хватать. Memory ballooning - это механизм динамического (а) выделения хост-ОЗУ для ВМ по мере необходимости и (б) возвращения неиспользуемых блоков по мере освобождения. Благодаря ему становится возможным одновременно запускать множество ВМ, суммарный объём виртуального ОЗУ в которых больше объёма физического ОЗУ в хост-системе, при условии, что они не станут использовать максимально разрешённый объём все сразу. Благодаря этому память хост-системы распределяется между ВМ так же гибко, как между обычными процессами. Создание виртуальных ресурсов, превышающих физические по объёму, обозначается любимыми для многих хостеров терминами "overcommit" и "overselling". Для работы баллонинга требуется согласованная работа двух программных компонентов:
MOM в последних версиях KVM включается автоматически, старые требовали включать его с помощью "kvm… -balloon virtio" в командной строке. Гостевое устройство для связи с MOM диспетчер оборудования (devmgmt.msc) Windows увидит как "PCI standard RAM controller" неизвестного типа. В отличие от virt-stor и virt-net, драйвер к нему не будет предложено установить автоматически. Вместо этого, следует зайти в свойства устройства, на вкладке "Драйвер" выбрать обновление и вручную указать путь к balloon.inf на VirtIO CD (пруф). После этого устройство переименуется в "VirtIO Balloon Driver".
ACPIПо умолчанию Windows 2003 разрешает выключать себя единственным способом - ввести логин-пароль, выбрать Пуск => "Завершение работы", ввести примечание, нажать "OK". Разумеется, на VDS-ферме такой подход неприемлем. KVM (и QEMU) умеет эмулировать ACPI. Команда "system_powerdown" аналогична нажатию кнопки питания на физическом компьютере, но Windows её проигнорирует. Лечится следующим REG-файлом: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system] "ShutdownWithoutLogon"=dword:00000001 "DisableCAD"=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] "ShutdownWarningDialogTimeout"=dword:00000003 Он же в готовом для запуска виде: svn1.sytes.net/linuxkvm/win-acpi-kvm.reg Первоисточник с подробными объяснениями: umgum.com/acpi-windows2003-shutdown
КэшированиеЕсли образ гостевого диска хранится на VDS-ферме в виде файла, кэширование гостевых файлов может оказаться двойным - сначала их кэширует гостевая ОС при обращениях к виртуальному диску, затем ОС фермы при обращениях к физическому. Всего возможны 3 основных режима:
В разных версиях qemu/kvm и в разных ОС по умолчанию могут использоваться разные режимы. Например, Qemu до версии 1.2 использует writethrough, 1.2 перешёл на writeback, в Proxmox выбран cache=none. Все без исключения источники в Сети советуют не использовать writethrough как наиболее медленный. По субъективной оценке, для ВМ с Windows оптимален writeback, для ВМ с Linux и FreeBSD - none.
Зависания сетиЕдинственной серьёзной проблемой, которую однозначно вызывает ошибка в KVM, являются подвисания гостевой сети при интенсивном трафике: bugs.centos.org/view.php?id=5526 (кроме собственно описания ошибки, там же есть важные ссылки на другие багтрекеры). Рекомендации, предлагаемые участниками обсуждений (обновление qemu-kvm и ядра, изменение параметров командной строки, использование vhost-net), к сожалению, пока не сумели её решить. При каждом подвисании приходится заходить на консоль ВМ по VNC и выполнять сброс сетевого интерфейса, после чего трафик снова начинает ходить нормально. Автоматизировать данное действие в Windows можно с помощью AutoIt, если создать файл PingFailed_ResetNic.au3 и вызывать его Диспетчером заданий каждые несколько минут: Подобное "решение" не везде может рассматриваться как удовлетворительное, но в ряде случаев его достаточно, чтобы свести негативный эффект к приемлемому минимуму, позволяющему дождаться выхода исправления вместо более кардинальных мер. |