Ubuntu, KVM, libvirt и Hetzner

    По мотивам Роутим 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*.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 10

      +1
      Популярна эта тема сегодня...)

      Напоминаю, что линуксоидам извращаться с VNC не нужно — у нас есть virt-manager, который позволяет подключиться к виртуалке без всякого проброса портов.

      Так же VNC можно повесить на ip:* и запаролить (в том же virt-manager), дабы дать доступ по VNC к виртуалке другим пользователям.

        0
        Черт, промахнулся и ответил ниже.
        0
        У меня OS X, так что virt-manager как-то не катит.

        Кроме того, сервер удаленный и на нем virt-manager-ом не пахнет по причине отсутствия X11.
          0
          Ну я и написал специально — «линуксоидам» )

          вообще странно, что virt-manager так лениво портируют на другие платформы.
            0
            Когда я только вникал в libvirt я использовал virt-manager через ssh -X (у меня тоже OSX). Но голый VNC как-то пошустрее будет.
            0
            Раз уж тут собрались спецы по libvirt, спрошу. Можно ли мигрировать VM с одного физического хоста на другой, если нет общего хранилища? Везде ищу эту фичу и никак не могу найти.
              0
              Я отнюдь не спец по libvirt.

              Мигрировать влоб, похоже, не выйдет — таки понадобится сетевое хранилище.

              Но перенести машинку мне кажется вполне просто скопировав ее описание (host.xml / virsh dumpxml...) и перенеся вручную сами файлы либо используя netcat + dd перенести данные с раздела.
                0
                dd if=/dev/disk | ssh user@host «dd of=/dev/new_disk»
                вместо netcat, возможно размер блоков нужно указать, лень man смотреть.
                  0
                  Спасибо за совет! Но, имхо, по ssh вместо netcat оверхед будет больше.
                    0
                    Не намного, в любом случае все упрется в скорость дисковой подсистемы, либо в сеть.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое