Виртуализация KVM QEMU + libvirt на Gentoo Linux Hardened
Гипервизор
Установка ОС
Настройка ядра
Настройки касающиеся виртуализации
linux-3.8.12-hardened
[*] Virtualization ---> <M> Kernel-based Virtual Machine (KVM) support <M> KVM for Intel processors support <M> KVM for AMD processors support [*] Audit KVM MMU <M> Host kernel accelerator for virtio net (EXPERIMENTAL) Device Drivers ---> [*] Network device support ---> <*> MAC-VLAN support <*> MAC-VLAN based tap driver <M> Universal TUN/TAP device driver support [*] Networking support ---> Networking options ---> <M> 802.1d Ethernet Bridging [*] Network packet filtering framework (Netfilter) ---> [*] Advanced netfilter configuration Core Netfilter Configuration ---> <M> "physdev" match support Security options ---> Grsecurity ---> Virtualization Type (Host) Virtualization Hardware (EPT/RVI Processor Support) Virtualization Software (KVM) Required Priorities (Performance)
Настройка сети
На сервере 2 сетевые карты и я настраиваю их так:
- eth0 - интерфейс для хост машины
- eth1 - интерфейс для ВМ через br0
/etc/sysctl.conf
net.ipv4.ip_forward = 1
/etc/conf.d/net
##### eth0 ##### config_eth0="192.168.0.2 netmask 255.255.255.0" routes_eth0="default gw 192.168.0.1" dns_servers_eth0="192.168.0.1" ##### eth1 ##### config_eth1="null" ##### br0 ##### rc_net_br0_need="net.eth1" bridge_br0="eth1" config_br0="null"
Создать симлинки и добавить в автозагрузку
ln -s /etc/init.d/net.lo /etc/init.d/net.eth0 ln -s /etc/init.d/net.lo /etc/init.d/net.eth1 ln -s /etc/init.d/net.lo /etc/init.d/net.br0 rc-update add net.eth0 default rc-update add net.eth1 default rc-update add net.br0 default
У меня по умолчанию политики DROP
iptables -P FORWARD DROP
Что касается цепочки FORWARD, что бы разрешить трафик через интерфейсы входящие в мост, необходимо использовать модуль physdev
iptables -A FORWARD -m physdev --physdev-in vnet0 --physdev-out eth1 -j ACCEPT
Между ВМ
iptables -A FORWARD -m physdev --physdev-in vnet0 --physdev-out vnet1 -j ACCEPT
Установка QEMU + libvirt
/etc/portage/package.use
##### QEMU ##### app-emulation/qemu python vde app-emulation/libvirt python dev-libs/libxml2 python
/etc/portage/make.conf
##### QEMU ##### QEMU_USER_TARGETS="x86_64" QEMU_SOFTMMU_TARGETS="x86_64"
Установка QEMU
emerge app-emulation/qemu -av
Установка libvirt
emerge app-emulation/libvirt -av rc-update add libvirtd default
libvirtd - демон который управляет ВМ, к нему подключается консоль управления virsh
Для доступа к libvirtd через сокет, создадим отдельную группу
groupadd libvirt
/etc/libvirt/libvirtd.conf
unix_sock_group = "libvirt" unix_sock_ro_perms = "0770"
Рестарт
/etc/init.d/libvirtd restart
$ ls -la /var/run/libvirt/ drwxr-xr-x 3 root root 100 Jul 23 16:05 . drwxr-xr-x 8 root root 280 Jul 23 16:05 .. srwx------ 1 root libvirt 0 Jul 23 16:05 libvirt-sock srwxrwx--- 1 root libvirt 0 Jul 23 16:05 libvirt-sock-ro
При выключении мене нужно что бы гостевым машинам посылалась команда shutdown, что аналогично нажатию кнопки Power
/etc/conf.d/libvirtd
LIBVIRTD_KVM_SHUTDOWN="shutdown" LIBVIRTD_KVM_SHUTDOWN_MAXWAIT="600"
По умолчанию managedsave сохраняет дам памяти ВМ в /var/lib/libvirt/qemu/save/ и при загрузке libvirtd восстанавливает состояние ВМ
Программа virt-install является частью пакета virtinst и нужна для начальной установки настроек гостевых машин, она создает конфиг ВМ в /etc/libvirt/qemu
emerge app-emulation/virtinst -av
Создание папки где будут храниться образы ВМ
mkdir /mnt/data0/vm chmod 750 /mnt/data0/vm chown qemu:qemu /mnt/data0/vm
Гостевая ОС
Начнем создавать гостевую ОС
Создание ВМ
Создание образа диска
qemu-img create -f qcow2 -o preallocation=metadata /mnt/data0/vm/template_gentoo_amd64.qcow2 80G
Согласно тому же man qemu-img, предварительное размещение метаданных (-o preallocation=metadata) делает диск изначально немного больше, но обеспечивает лучшую производительность в те моменты, когда образу нужно расти. На самом деле, в данном случае эта опция позволяет избежать неприятного бага. Создаваемый образ изначально занимает меньше мегабайта места и по мере необходимости растёт до указанного размера. Гостевая система сразу должна видеть этот окончательный указанный размер, тем не менее, на этапе установки она может увидеть реальный размер файла. Естественно, устанавливаться на жёсткий диск размером 200 кбайт она откажется. Баг не специфичен для Ubuntu, проявляется ещё в RHEL, как минимум. Кроме типа образа впоследствии можно будет выбрать способ его подключения — IDE, SCSI или Virtio Disk. От этого выбора будет зависеть производительность дисковой подсистемы. Однозначно правильного ответа нет, выбирать нужно исходя из задачи, которая будет возложена на гостевую систему. Если гостевая система создаётся «на посмотреть», то сойдёт любой способ. Вообще, обычно именно I/O является узким местом виртуальной машины, поэтому при создании высоконагруженной системы к этому вопросу нужно отнестись максимально ответственно.
Создание ВМ. Загружаемся в Gentoo Minimal Install CD
virt-install --os-type=linux --machine=pc --name 03_template_gentoo_amd64 \ --vcpus 4 --ram 1024 --disk path=/mnt/data0/vm/template_gentoo_amd64.qcow2,format=qcow2,bus=virtio \ --network=bridge:br0,model=virtio \ --hvm --virt-type=kvm --accelerate \ --graphics vnc,listen=0.0.0.0,port=5903,keymap=en-us \ --noautoconsole \ --boot=cdrom,hd,menu=on --disk /mnt/data0/vm/install-amd64-minimal-20130711.iso,device=cdrom
Подключаем cdrom как disk, а не через опцию --cdrom, т.к. мы указываем путь к файлу, а не к устройству. В конфиге должен быть тип устройства file
<disk type='file' device='cdrom'>
Подключаемся по VNC и начинаем установку.
Несколько команд консоли virsh:
- list –all - показать все ВМ
- destroy <имя> - вырубить питание у ВМ
- edit <имя> - редактировать конфиг ВМ
- reset <имя> - аналогично кнопки Reset
- shutdown <имя> - аналогично кнопки Power
- undefine <имя> - удалить ВМ (только конфиг, образ диска остается)
Настройка ядра
Необходима поддержка драйверов virtio и видео карты cirrus
linux-3.8.12-hardened
Device Drivers ---> [*] Block devices ---> <*> Virtio block driver [*] Virtualization drivers ---> [ ] USB support ---> Virtio drivers ---> <*> PCI driver for virtio devices (EXPERIMENTAL) <*> Virtio balloon driver <*> Platform bus driver for memory mapped virtio devices (EXPERIMENTAL) [*] Memory mapped virtio devices parameter parsing [*] Network device support ---> [*] Ethernet driver support ---> <*> Virtio network driver (EXPERIMENTAL) Character devices ---> <*> Virtio console <*> VirtIO Random Number Generator support SCSI device support ---> [*] SCSI low-level drivers ---> <*> virtio-scsi support (EXPERIMENTAL) Graphics support ---> <M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---> <M> Cirrus driver for QEMU emulated device Security options ---> Grsecurity ---> Virtualization Type (Guest) Virtualization Software (KVM)
Virtio balloon driver - Динамическое выделение памяти для виртуальных машин
/etc/portage/make.conf
VIDEO_CARDS="cirrus"
Установка ACPID
Необходимо что бы ОС реагировала на нажатие кнопки Power
emerge sys-power/acpid -av rc-update add acpid default
Установка GRUB
grub grub> device (hd0) /dev/vda grub> root (hd0,0) grub> setup (hd0)
Завершающие настройки
Перезагружаемся, проверяем.
Извлекаем cdrom (применяется только когда ВМ выключена)
virsh # change-media 03_template_gentoo_amd64 hdc --eject
По умолчанию имена интерфейсов даются vnet0 и т.д., задать точное имя можно в конфиге
<interface type='bridge'> <mac address='52:54:00:12:69:64'/> <source bridge='br0'/> <target dev='ИМЯ_ИНТЕРФЕЙСА'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
Команды
Присоединить образ cd-rom
virsh # change-media <ИМЯ_ВМ> hdc /mnt/data0/vm/install-amd64-minimal-20130711.iso
Присоеденить диск
virsh # attach-disk <ИМЯ_ВМ> --source /mnt/data0/vm/template.qcow2 --target vdb --subdriver=qcow2
IO Tune
virsh # blkdeviotune <ИМЯ_ВМ> vda --write_bytes_sec $(expr 1024 \* 1024 \* 10)
Добавить сетевой интерфейс
virsh # attach-interface <ИМЯ_ВМ> --type bridge --source br0 --model virtio --persistent
http://wiki.gentoo.org/wiki/QEMU
http://wiki.gentoo.org/wiki/QEMU/Linux_guest
http://ru.wikibooks.org/wiki/%D0%A3%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9_%D0%BD%D0%B0_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%B5_libvirt
http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/libvirt
Обсуждение
app-emulation/libvirt
Проверка поддерживает ли система аппаратную виртуализацию Intel VT (vmx) или AMD-V (svm)