Календарь на Май 2024 года: calendar2008.ru/2024/may/
Навигация
Главная »  Windows 

Запуск 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:
  • работает надёжно, в т.ч. с virtio,
  • проблем совместимости с XP не имеет (даже внешний вид может быть сделан таким же),
  • занимает в ОЗУ менее 800 мегабайт.

Верхнего лимита в 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 служат для переключения внутри окна между гостевой и управляющей консолью. Параметр "-net nic,model=virtio,..." создаст внутри ВМ сетевую карту неизвестного Windows типа, для которого мастер настройки оборудования предложит выбрать драйвер. Парный ему параметр "-net tap,..." создаст в хост-ОС сетевой интерфейс для связи с ВМ. Назначение IP-адресов, настройка DHCP и выхода во внешний мир через ProxyARP, NAT или Bridge не имеют прямого отношения к Windows, поэтому здесь не рассматриваются. Теперь про самое важное на данном этапе, т.е. про диски. HDC - это ISO-образ с дистрибутивом Windows. Имя файла взято из торрента в предыдущем разделе. С него внутри ВМ произойдет первая загрузка системы ("-boot order=d"). HDD - это ISO-образ с драйверами virtio. Скачивается с alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/ HDA - это пустой образ диска, на который будет устанавливаться система. Создан командой "kvm-img create -f qcow2 vm_10.img 50G". HDB - это пустой образ диска, созданный через "kvm-img create -f qcow2 temp.img 1G" с единственной целью - показать Windows устройство незнакомого типа, чтобы она затребовала драйвер для него. Установка в систему драйвера virtio для временного диска позволит переключить затем с IDE на virtio системный диск. После того, как установка системы и драйверов будет полностью завершена, в команде запуска следует убрать "-boot" и все строки "-drive", кроме первой, т.к. временный диск и ISO-образы станут не нужны (обратите внимание на добавленный "if=virtio"!):
kvm ... -drive "file=$HDA,index=0,media=disk,cache=writeback,if=virtio" ...
Про пользу virtio, варианты настройки сети и параметры командной строки kvm читайте в habrahabr.ru/post/167099/

Рекомендуемые настройки Windows


Во-первых, по умолчанию Windows создаёт при BSOD'ах полный дамп памяти. В лучшем случае, это существенно замедлит перезагрузку. В худшем, приведёт к полному зависанию. Во-вторых, автоматические обновления по умолчанию включены, и есть риск, что одно из них сделает работу под KVM нестабильной. Поэтому после завершения инсталляции в самую первую очередь (до установки драйверов!) рекомендуется зайти в Панель управления => Система:
  • Автоматическое обновление: Отключить
  • Дополнительно => Отчет об ошибках => Отключить
  • Дополнительно => Загрузка и восстановление => Параметры => Отказ системы => Запись отладочной информации => Малый дамп памяти (64КБ)

Настройки 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 (memory overcommitment manager) в хост-системе, меняющего объём ОЗУ для ВМ на основании запросов из неё,
  • VMM (менеджера виртуальной памяти) в гостевой ОС, взаимодействующего с MOM через виртуальный PCI-контроллер.

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 основных режима:
  • none - хост-система не кэширует файл-образ ни на чтение, ни на запись
  • writeback - запись выполняется немедленно, чтение кэшируется
  • writethrough - чтение и запись кэшируются

В разных версиях 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 и вызывать его Диспетчером заданий каждые несколько минут:
#include "EventLog.au3" Local $PingHost = "192.168.0.1" Local $Interface = "LAN" Ping($PingHost, 250) If @error = 0 Then Exit Local $hEventLog = _EventLog__Open("", "RestartNicOnPingFailure") Local $aEmpty[1] = [0] _EventLog__Report($hEventLog, 2, 0, 1, "", "Restart NIC " & Interface & " on failed ping to " & PingHost, $aEmpty) _EventLog__Close($hEventLog) RunWait("netsh interface set interface " & $Interface & " DISABLED", "", @SW_HIDE) RunWait("netsh interface set interface " & $Interface & " ENABLED", "", @SW_HIDE)
Вариант для CMD.EXE: rickosborne.org/blog/2007/02/stupid-windows-tricks-restart-network-adapter-when-it-hangs/ Подобное "решение" не везде может рассматриваться как удовлетворительное, но в ряде случаев его достаточно, чтобы свести негативный эффект к приемлемому минимуму, позволяющему дождаться выхода исправления вместо более кардинальных мер.



 

 Лицензирование Crystal Enterprise 10.
 Уменьшите объем памяти, занимаемой Linux.
 Как взломать парольную защиту Oracle или как ее обойти.
 Экзамен Tivoli 892: IBM Tivoli NetView V7.1.4 Implementation.
 Экзамен Tivoli 890 - IBM Tivoli Monitoring V6.1 Implementation.


Главная »  Windows 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.