[[Виртуализация KVM QEMU + libvirt на Gentoo Linux Hardened]]

Gentoo

Виртуализация KVM QEMU + libvirt на Gentoo Linux Hardened

Гипервизор

Установка ОС

Установка Gentoo Linux

emerge sys-apps/iproute2 -av
emerge net-misc/bridge-utils -av

Настройка ядра

Настройки касающиеся виртуализации

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
У меня политики firewall'a 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"

Рестарт libvirtd

/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: 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

Обсуждение

Aleksey, 2014/04/14 21:47

app-emulation/libvirt

virt-host-validate
Ваш комментарий. Вики-синтаксис разрешён:
161 +14 = ?
 
howto/gentoo/gentoo_install_kvm.txt · Последние изменения: 2014/10/02 17:57 — lexa
Gentoo Linux Driven by DokuWiki