20 янв. 2014 г.

Windows Server 2003 в KVM под CentOS

Для некоторых наших заказчиков Microsoft Windows Server 2003(R2) по-прежнему является актуальной ОС. Понятно, что это происходит не от хорошей жизни, ведь даже расширенная поддержка заканчивается в 2015-м году. Работа критичного для бизнеса legacy-софта приводит к ситуации, когда эту антикварную ОС необходимо переносить на новый сервер. Оборудование 5-8-летней давности начинает выходить из строя, ремонт является нецелесообразным, но как быть с поддержкой Windows Server 2003/2003R2 на современных платформах Supermicro?
Таблица совместимости с ОС обнадеживает: для большинства популярных 1- и 2-процессорных плат X9 заявлена поддержка Server 2003 (не уточняется — обычной или R2) Enterprise в 32бит и 64бит (x86_64) вариантах. Хуже обстоят дела с бюджетными однопроцессорными платами на чипсетах C202/204/222/224/226 под Xeon E3-1200/v2/v3 - именно платформы на их основе чаще всего выбирают в качестве замены отслуживших свое старых серверов. Для X10SLM во всех вариантах поддержка Windows Server 2003 не заявлена, и вас ждет BSOD при попытке установить ОС.
Проблема номер два — дополнительные контроллеры. Для сетевых карт Intel драйверы выходят, а вот с RAID/HBA ситуация сложнее: Adaptec by PMC не обновляет драйверы под Server 2003 с 2011 года.
Остается виртуализация как способ решения проблемы с поддержкой современного оборудования. Причем зачастую ситуация складывается так, что она должна быть бесплатной и относительно простой в администрировании: старые приложения есть, средств на переписывание / переход на новую версию / другой продукт нет, едва хватило на скромный сервер за $1000, а сама ситуация в большинстве случаев возникает в небольших организациях с начинающими системными администраторами. Тут есть три варианта:
  • ESXi. В версии 5.5 решили отказаться от лимита в 32ГБ RAM в бесплатном варианте. Не будет Storage IO control и Network IO control (лимиты на использование ресурсов сети и дисковой подсистемы). Но главный минус в нашем случае — поддержка бюджетного оборудования. Никакие программные RAID'ы (все чипсетные контроллеры Intel являются таковыми) не поддерживаются. Не поддерживаются некоторые сетевые карты, например, i217LM в платах X10SLM.
  • Hyper-V и бесплатный Hyper-V Server. Неплохой вариант для Windows-администраторов, но только для гостевых Server 2003(R2) поддерживается не больше 2-х vCPU.
  • KVM. О нем и пойдет сегодня речь. В бесплатном одиночном варианте это будет CentOS 6.4 или 6.5 в качестве стабильной платформы (но можно использовать другой клон RHEL, например, Oracle Linux или Scientific Linux). Паравиртуальные драйверы для дисковой подсистемы и сети для Server 2003(R2) существуют и поддерживаются, есть управление лимитами ресурсов через cgroups (что поможет вам обеспечить для приоритетных ВМ нужное количество ресурсов по CPU/памяти/сети/IOPS или пропускной способности дисковой подсистемы). Миграция работающих виртуальных машин между хостами тоже поддерживается. Управление осуществляется через консоль (напрямую или при помощи virsh) или через virt-manager — примитивный в сравнении с SC VMM и vSphere Client, но достаточный для скромных задач.
Xen сложен в освоении для начинающих. Применяется сейчас, в основном, для размещения паравиртуализованных Linux-ВМ.
Настольные гипервизоры (Virtualbox, VMware Workstation) стоит использовать только в тех случаях, когда вам неинтересны производительность и сколь-нибудь продолжительный аптайм, то есть для обучения и тестирования.

Первоначальная установка

За основу взяты статьи "Установка и настройка KVM под управлением CentOS 6" на Хабре и "KVM Virtualization in RHEL 6 Made Easy " от инженеров Dell. Итак, приступим.
Устанавливаем 64-битную (x86_64) CentOS 6.5 в минимальном варианте, для этого будет достаточно носителя minimal или netinstall. Ставим необходимые пакеты:
yum install kvm libvirt policycoreutils-python virt-install virt-manager bridge-utils
Можно добавить еще screen для повышения удобства в работе с консолью.
Запускаем сервис libvirtd и добавляем его в автозагрузку:
service libvirtd start
chkconfig libvirtd on
Проверяем возможность подключения к KVM через virsh:
virsh sysinfo
На выходе мы должны получить длинный xml-файл:

  
    American Megatrends Inc.
    3.0a
    12/04/2013
    3.10
  
  
    Supermicro
    X9DRi-LN4+/X9DR3-LN4+
    0123456789
    0123456789
 ...

Сеть

Для особо критичных к производительности сети сценариев можно использовать SR-IOV. Но начнем с классического простого варианта, которых подходит для решения задачи (если у вас арендованный ДЦ с ограничием на один MAC и все нужно прятать за NAT'ом) — доступ через мост. В данном примере для доступа к серверу использовался единственный интерфейс eth0 с IP 192.168.0.161/24 и шлюзом 192.168.0.199. Редактируем конфигурационный файл интерфейса eth0 и создаем еще один для моста br0:
vi /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="static"
IPADDR="192.168.0.161"
GATEWAY="192.168.0.199"
DNS1="212.45.0.3"
DNS2="212.45.2.5"
MTU="1500"
NETMASK="255.255.255.0"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="no"
NAME="System br0"
vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="none"
HOSTNAME="centos-nc.localdomain"
HWADDR="00:25:90:86:86:B0"
IPV6INIT="no"
MTU="1500"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
NAME="System eth0"
BRIDGE="br0"
Перезапускаем сеть:
service network restart
Настраиваем iptables. Нужно разрешить форвардинг трафика через мост:
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
service iptables save
service iptables restart
Для внешнего доступа к консоли ВМ через VNC нужно открыть соответствующие порты:
iptables -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 5900:5903,6000:6003 -j ACCEPT
service iptables save
service iptables restart

Storage pool'ы (хранилище для ВМ)

Образы дисков виртуальных машин хранятся в storage pool'ах, где могут использоваться блочные устройства хоста (тома LVM, LUN'ы с блочных СХД), файлы (RAW или, например, в формате qcow2) или сетевы ФС (NFS или кластерные ФС, например, GFS2).
Самым оптимальным с точки зрения производительности является прямое использование блочных устройств для размещения ВМ. Отдавать само блочное устройство целиком не стоит (например,
/dev/sdd ), так как гостевая ОС начнет создавать на нем разделы или LVM группы, хост начнет их определять и ничего хорошего из этого не выйдет. Так что использовать нужно разделы или тома LVM.
Использовать файлы тоже можно, в большинстве случаев это удобнее. Например, формат qcow2 позволяет легко использовать thin-provisioning, снапшоты, шифрование и сжатие, но ценой некоторого снижения производительности.
В данном примере мы добавляем в пул каталог
/mnt/kvm-00 , куда смонтирована файловая система ext4 на LVM-томе
/dev/vg00/lv-kvm-00 объемом в 40ГиБ.
Добавляем метку SELinux, чтобы libvirt мог использовать каталог для размещения ВМ:
semanage fcontext -a -t virt_image_t /mnt/kvm-00

Добавляем каталог в пул, инициализируем его, запускаем и включаем автозапуск:
virsh pool-define-as guest_images_dir dir - - - - "/mnt/kvm-00"
[root@centos-nc ~]# virsh pool-build guest_images_dir
Pool guest_images_dir built

[root@centos-nc ~]# virsh pool-start guest_images_dir
Pool guest_images_dir started

[root@centos-nc ~]# virsh pool-autostart guest_images_dir
Pool guest_images_dir marked as autostarted
Вывод информации о пуле:
[root@centos-nc ~]# virsh pool-info guest_images_dir
Name:           guest_images_dir
UUID:           a39bfd16-9690-83f8-9095-aca0c1ef5b45
State:          running
Persistent:     yes
Autostart:      yes
Capacity:       39.37 GiB
Allocation:     175.88 MiB
Available:      39.20 GiB

Установка ОС

Перед установкой нам понадобится дистрибутив с паравиртуальными драйверами Virtio. Паравиртуальные драйверы позволяют гипервизору не тратить ресурсы на эмуляцию работы реальными физическими устройствами, например, с ethernet-контроллером Intel E1000. Вместо этого гипервизор предоставляет ОС т.н. паравиртуальные устройства, которые обеспечивают существенное снижение накладных расходов при передаче данных или дополнительный функционал. Для гостевых Windows в KVM есть следующие устройства:
  • virtio-scsi — SCSI контроллер.
  • virtio-net — Ethernet контроллер. Некоторое время назад в Windows были проблемы со стабильной работой virtio-net, но сейчас все наладилось.
  • virtio-serial — последовательный интерфейс. Можно использовать в качестве последовательной консоли, например.
  • virtio memory balloon — позволяет оптимизировать количество выделяемой для ВМ памяти. При наличии свободной памяти в ВМ она может быть отдана обратно хосту, т.е. гостевая ОС использует ровно столько памяти, сколько ей действительно нужно в определенный момент времени. Естественно, что такая технология требует наличия драйвера и специального сервиса, взаимодействующего с гипервизором. Для Windows Server 2003 memory balloon поддерживается, но связываться с его настройкой стоит лишь при условии тесного размещения ВМ

ISO образ с драйверами можно взять тут. Кроме него понадобится дискета с драйвером
virtio-scsi , ведь Windows Server 2003 ничего не знает о таком устройстве. Дискету можно взять тут, драйвер не последней версии, но можно обновить потом с ISO.
Приступаем к установке. Сделать это можно при помощи скрипта
virt-install .
virt-install --connect qemu:///system --arch=x86_64 \
-n win_srv_2003r2 -r 2048 --vcpus=2 \
--disk pool=guest_images_dir,size=30,bus=virtio,cache=writethrough \
--cdrom==/mnt/kvm-dist/ru_win_srv_2003_r2_enterprise_with_sp2_vl_cd1_X13-46484.iso \
--disk path=/mnt/kvm-dist/virtio-win-0.1-74.iso,device=cdrom,perms=ro \
--disk path=/mnt/kvm-dist/virtio-win-drivers-20120712-1.vfd,device=floppy \
--graphics vnc,listen=0.0.0.0,keymap=ru,password=Q123q \
--noautoconsole --os-type windows --os-variant win2k3 \
--network=bridge:br0,model=virtio
Расшифровка:
  • Создаем ВМ с двумя vCPU и 2ГБ памяти
  • диском на 30ГБ, подключенным к паравиртуальному контроллеру, используется кэш хоста на чтение (cache=writethrough ). Еще можно использовать writeback , что небезопасно, или отключить совсем (none ), если используется NFS
  • Добавляем установочный CD-ROM
  • CD с драверами virtio и дискету
  • VNC-консоль с паролем
  • выбор типа и выпуска ОС
  • сетевая карточка virtio с подключеним к мосту br0

Не забудьте, что нужно успеть подключиться по VNC и нажать F6 для добавления драйвера.
После окончания установки скрипт virt-install завершится:
Starting install...
Allocating 'win_srv_2003r2.img'                                                         |  30 GB     00:00
Creating domain...                                                                      |    0 B     00:00
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Starting domain...                                                                      |    0 B     00:00
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Guest installation complete... restarting guest.
И управлять ВМ можно будет через virsh или, если нужен GUI, через virt-manager , в том числе и с Windows-ПК, но об этом ниже.

Windows Server 2003 и выравнивание разделов

Проблема с выравниванием успела в свое набить оскомину всем. Вот краткая суть: при стандартной разбивке диска в Windows Server 2003 и старше раздел начинался на 64-м секторе (так исторически сложилось еще с тех времен, когда параметры геометрии HDD имели какой-то смысл). Это никого не волновало до тех пор, пока все работало на физических серверах с дисками с 512 байтовыми секторами. При работе с RAID появляется проблема в виде размера страйпа, который не делится на 31,5КиБ, что приводит к очевидному последствию в виде снижения производительности (например, запись блока размером 8киБ может привести к необходимости обращения к двум разным страйпам массива). Виртуализация добавляет несколько уровней абстракции: диск ВМ -> файловая система хоста -> диск хоста -> физические диски.
Современные ОС (например, Windows, начиная с Server 2008, или RHEL, начиная с 6) используют по умолчанию смещение в 2048 секторов (1024КиБ). В Windows Server 2003 Service Pack 1 в утилите
diskpart появилась возможность задать смещение при создании разделов. В итоге, решение будет простым: системный диск можно не трогать, а под полезную нагрузку добавлять отдельный виртуальный диск и создавать на нем разделы с правильным смещением:
  1. Запустить diskpart
  2. Выбрать диск командой select disk <номер_диска> (list disk выводит список дисков)
  3. Создать раздел со смещением в 1024КиБ: create partition primary align=1024

Virt-manager

Virt-manager — GUI для управления виртуализацией через libvirt. На сервере с KVM не должно быть ничего лишнего. Так что запускать там X-сервер (и оконные менеджеры или тем более тяжеловесные GNOME или KDE) не стоит. Тут можно воспользоваться сетевыми возможностями X11. Для nix систем все тривиально, для Windows понадобятся PuTTY и Xming:
  1. В PuTTY включаем Enable X11 Forwarding
  2. Включаем X11 Forwarding на хосте (файл /etc/ssh/sshd_config ):
    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost yes
    
  3. Ставим дополнительные пакеты xorg-x11-xauth и liberation-sans-fonts
  4. На удаленном ПК запускаем Xming, подключаемся к серверу и запускаем virt-manager

  • Если шрифты мелковаты, то подредактировать ярлык запуска Xming, добавив значение DPI, например: "C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow -dpi 108