Pull to refresh

Ubuntu, KVM, libvirt и Hetzner

Reading time 6 min
Views 23K
По мотивам Роутим IPv4 и IPv6 в KVM на примере Hetzner решил описать свой howto по созданию и организации виртуальных машин.



Задача: на выделенном сервере максимально изолировать приложения и отделить от них БД. Для этого понадобятся две виртуальные машины (app1, db1). В дальнейшем другие приложения можно помещать в аналогичные app1 контейнеры.

На пакете DS3000 выдается один IP (1.1.1.1) и подсеть (2.2.2.0/29). Итого в сети имеем маску 255.255.255.248 и 6 адресов.

В документации hetzner-а предлагался вариант с созданием для каждого адреса своего бриджа, что позволило бы выдать все 6 адресов виртуальным машинам. Однако я ленив, и решил таки пожертвовать одним из адресов ради простоты реализации.

В Ubuntu для виртуализации используется KVM, и для управления виртуальными машинами я использовал рекомендуемый libvirt.

Для установки потребуется инсталляционный образ. Также стоит заранее подумать как будут расположены диски виртуальной машины — либо в файлах, либо это будут настоящие разделы диска, либо же это будут логические тома LVM-а. Я предпочел LVM, поскольку с его помощью можно легко сделать снапшот диска, увеличить либо уменьшить его.

Для начала я подправил и добавил виртуальные сети, которые предоставляет libvirt.
Поначалу доступна только сеть default (/etc/libvirt/qemu/networks/default.xml). После всех правок она у меня приняла следующий вид:

<network><br> <name>default</name><br> <bridge name="virbr0" /><br> <forward mode="nat"/><br> <ip address="192.168.122.1" netmask="255.255.255.0"><br>    <dhcp><br>     <range start="192.168.122.2" end="192.168.122.254" /><br>    </dhcp><br> </ip><br></network><br><br>* This source code was highlighted with Source Code Highlighter.


Я также добавил и две другие сети — одну приватную, в которой будет находиться сервер БД, и одну для выданной hetzner-ом подсети 2.2.2.0/29:

/etc/libvirt/qemu/networks/private.xml

<network><br> <name>private</name><br> <forward mode='nat'/><br> <bridge name='virbr1' stp='on' forwardDelay='0' /><br> <ip address='192.168.123.1' netmask='255.255.255.0'><br>    <dhcp><br>     <range start='192.168.123.2' end='192.168.123.254' /><br>    </dhcp><br> </ip><br></network><br><br>* This source code was highlighted with Source Code Highlighter.


/etc/libvirt/qemu/networks/hetzner.xml

<network><br> <name>hetzner</name><br> <bridge name="virbr2" /><br> <forward mode="route" dev="eth0"/><br> <ip address="2.2.2.1" netmask="255.255.255.248"><br>    <dhcp><br>     <range start="2.2.2.2" end="2.2.2.7" /><br>    </dhcp><br> </ip><br></network><br><br>* This source code was highlighted with Source Code Highlighter.


Далее стягиваем установочный образ:

cd /srv && wget swtsrv.informatik.uni-mannheim.de/pub/linux/distributions/ubuntu-release/10.04.1/ubuntu-10.04.1-server-amd64.iso


Делаем два LV для виртуальной машины — один под систему, второй под swap:

lvcreate -L 10G -n vm01-sys sysvg
lvcreate -L 2G -n vm01-swap sysvg


Создавать диск под свап и под систему — мое предпочтение, совсем не обязательное к повторению. Ничто не мешает сделать один раздел на 12GB.

Отлично. Теперь надо создать саму машину:

virt-install --name=vm01 \
    --ram=256 \
    --vcpus=2 \
    --disk path=/dev/sysvg/vm01-sys \
    --disk path=/dev/sysvg/vm01-swap \
    --accelerate \
    --noautoconsole \
    --connect=qemu:///system \
    --vnc \
    --hvm \
    --os-type=linux \
    --cdrom=/srv/ubuntu-10.04.1-server-amd64.iso \
    --network network:hetzner


После этого идем в /etc/libvirt/qemu и видим/правим vm01.xml:

<domain type='kvm'><br> <name>vm01</name><br> <uuid>...</uuid><br> <memory>262144</memory><br> <currentMemory>262144</currentMemory><br> <vcpu>2</vcpu><br> <os><br>    <type arch='x86_64' machine='pc'>hvm</type><br>    <boot dev='hd'/><br> </os><br> <features><br>    <acpi/><br>    <apic/><br>    <pae/><br> </features><br> <clock offset='utc'/><br> <on_poweroff>destroy</on_poweroff><br> <on_reboot>restart</on_reboot><br> <on_crash>restart</on_crash><br> <devices><br>    <emulator>/usr/bin/kvm</emulator><br>    <disk type='block' device='disk'><br>     <source dev='/dev/sysvg/vm01-sys'/><br>     <target dev='sda' bus='scsi'/><br>    </disk><br>    <disk type='block' device='disk'><br>     <source dev='/dev/sysvg/vm01-swap'/><br>     <target dev='sdb' bus='scsi'/><br>    </disk><br>    <disk type='file' device='cdrom'><br>     <source file='/srv/ubuntu-10.04.1-server-amd64.iso'/><br>     <target dev='hda' bus='ide'/><br>     <readonly/><br>    </disk><br>    <interface type="network"><br>     <source network="hetzner" /><br>     <mac address='00:11:22:33:44:55'/><br>    </interface><br>    <serial type='pty'><br>     <target port='0'/><br>    </serial><br>    <console type='pty'><br>     <target port='0'/><br>    </console><br>    <input type='mouse' bus='ps2'/><br>    <graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/><br> </devices><br></domain><br><br>* This source code was highlighted with Source Code Highlighter.


Для загрузки с диска либо в vnc надо будет нажать f12 для выбора устройства, либо исправить boot dev='hd' на boot dev='cdrom'.

Также видим мак-адрес. Можно прописать в самой машине статический адрес, а можно в настройках сети прописать привязку для DHCP. Для этого понадобится в /etc/libvirt/qemu/networks/hetzner.xml добавить в секцию dhcp следующую строку:

<host mac="00:11:22:33:44:55" name="vm01" ip="2.2.2.2" /><br><br>* This source code was highlighted with Source Code Highlighter.


Далее неплохо бы рестартануть libvirt:

service libvirt-bin restart


и прицепиться шеллом (virsh) к libvirt-у дабы запустить сети и машинки:

# virsh -c qemu:///system
virsh# net-start hetzner
virsh# net-start private
virsh# start vm01


Запустится стандартный инсталлятор. Прицепиться к консоли машинки можно по VNC. Однако VNC изначально слушает на 127.0.0.1:59**. Потому нехитрым туннелированием через ssh пробрасываем порт на свой компьютер:

ssh user@host -L5901:localhost:5900


и коннектимся в VNC на 127.0.0.1:5901 или display:1.

Нетрудно догадаться что для следующей виртуальной машины vnc будет слушать на порту 5901 и т.д.

Для установки второй машинки повторяем все действия для vm02, с той лишь разницей что она будет в network:private.

Чтобы не повторять действия, можно воспользоваться утилитой virt-clone:

virt-clone -o vm01 -n vm02 -f /dev/sysvg/vm02-sys -f /dev/sysvg/vm02-swap


Однако мне после этого пришлось все же вручную при помощи dd скопировать содержимое vm01-sys в vm02-sys.

Также надо не забыть в hostname изменить имя второй машинки, и в /etc/udev/rules.d/70-persistent-net.rules удалить запись о сетевушке, дабы вторая сетевушка с другим MAC-адресом и там стала eth0.

Для добавления машин/сетей в автозапуск в консоли virsh выполните net-autostart network_name / autostart vmname.

Примечание: управлять машинками можно из того же virsh. Чтобы их корректно останавливать не забывайте ставить пакет acpi в гостевых машинах, чтобы они ловили shutdown.

Примечание: уже может быть запущен dns-сервер, который слушает на udp 0.0.0.0:67. Так вот, сеть по net-start не запустится, ибо dnsmasq не сможет занять указанный порт. Потому правим настройки системного DNS до попытки поднять виртуальную сеть.

Примечание: если вы сделали в инсталляторе таблицу разделов на диске виртуальной машины, то чтобы на host-системе смонтировать надо будет замаппить разделы при помощи kpartx:

kpartx -a /dev/sysvg/vm02-sys


Найти замапленные устройства разделов можно будет в /dev/mapper/sysvg--vm02-sys*.
Tags:
Hubs:
+13
Comments 10
Comments Comments 10

Articles