Posterous theme by Cory Watilo

Filed under: OpenVZ

OpenVZ on Ubuntu 8.10

Только-что закончил эксперименты с OpenVZ на Ubuntu 8.10 (intrepid). Успешно. Итак, задача: создать виртуальную (для начала одну) машину с Ubuntu 8.10, которая будет доступна в локальной сети. Хост-система - Ubuntu 8.10, выступает в роли роутера для локальной сети, имеет на себе DHCP-сервер. Настройки сети виртуальная машинка должна получать по DHCP, роутиться другим роутером (два провайдера). Задача осложняется тем, что из intrepid убрали поддержку виртуализации посредством OpenVZ и сделали упор на KVM. Так как имеем машинку на базе AMD Duron (900MHz) то приходится выкручиваться. Опыт, как говорится, бесценен. Пару слов о состоянии виртуализации в Ubuntu:
  • KVM. В 8.10 сделали упор на KVM, который требует аппаратной поддержки виртуализации процессором. В данном случае процессор устаревший, так что KVM отпадает.
  • VServer. Выглядит неплохо, но у меня не удалось при помощи make-kpkg собрать ядро (2.6.27-15, наиболее близкое к имеющемуся в 8.10 - 2.6.27-11).
  • OpenVZ. Неплохое решение, но ядро с поддержкой виртуализации было в 8.04, в 8.10 от него отказались в пользу KVM.
  • Xen. Не горел желанием использовать решения полной виртуализации, так как вируализировать оборудование мне не требовалось - это дополнительные накладные расходы. Вроде бы поддержка есть... но, как оказалось, лишь в качестве гостевой ОС (DomU - гостевая, Dom0 - хост-система). А сервером (Dom0) - увы. В 8.04 было ядро умеющее быть сервером.
  • VMWare Server. Также полная виртуализация, тяжеловесное решение. Но хорошо тем, что не требует хаков с ядром.
Итогом чтения доки стала установка VMWare Server, и обошлось без косяков. Но снес его через несколько часов. Во-первых, одновременно с VMWare Server нельзя пользоваться комплектом netatalk. Во-вторых, теперь у VMWare Server появилась вебморда. И все бы ничего, если б не ее тормознутость. Посмотрев список процессов - sun-jre, apache-tomcat. Не знаю у кого как, но на столь небыстрой машинке вебморда тормозила и лагала безбожно. Некогда был Remote Console, но я так и не смог его найти. Таким образом я пришел к OpenVZ. Для начала я прописал в /etc/apt/sources.list репозиторий от 8.04: [cc lang="text"] deb http://de.archive.ubuntu.com/ubuntu/ hardy main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-updates main restricted universe multiverse deb http://de.archive.ubuntu.com/ubuntu/ hardy-backports main restricted universe multiverse [/cc] Далее - по учебнику: [cc lang="text"] apt-get install linux-openvz vzctl [/cc] Получил ядро linux-image-2.6.24-23-openvz и проверил, что пакет linux-restricted-modules-openvz потянул за собой linux-restricted-modules-common. Пользуясь aptitude установил версию 2.6.24.16-23.56. Так как сервер уже работал роутером, то изменений в /etc/sysctl.conf я не вносил - более-менее с рекомендациями мои значения совпали. Со странички шаблонов стянул ubuntu-8.10-x86.tar.gz: [cc lang="text"] cd /var/lib/vz/template/cache && wget http://download.openvz.org/template/precreated/ubuntu-8.10-x86.tar.gz [/cc] Затем создал виртуальный контейнер [cc lang="text"] vzctl create 101 --ostemplate ubuntu-8.10-x86 --config vps.basic [/cc] задал виртуальной машине hostname [cc lang="text"] vzctl set 101 --hostname gretchin --save [/cc] и добавил запуск этой VPS вместе с запуском OpenVZ (/etc/init.d/vz) [cc lang="text"] vzctl set 101 --onboot yes --save [/cc] Чудесно. На данный момент имеем виртуальную машину без сети. Для того чтоб она была видна в локальной сети нужно соорудить bridge. Для этого понадобится пакет bridge-utils: [cc lang="text"] apt-get install bridge-utils [/cc] Теперь подправил /etc/network/interfaces: [cc lang="text"] auto lo iface lo inet loopback #Inet iface auto eth0 iface eth0 inet dhcp #eth1 - LAN auto br0 iface br0 inet static address 192.168.1.1 netmask 255.255.255.0 bridge_ports eth1 [/cc] Заодно подправил интерфейс в /etc/default/dhcp3-server: [cc lang="bash"] INTERFACES="br0" [/cc] Затем применил настройки: [cc lang="text"] /etc/init.d/network restart [/cc] ...и лишился сети. Сам не понял что и как, но после ребута роутера и сидения перед его консолью все заработало самостоятельно. Хм. Добавил сетевой интерфейс в виртуальную машину: [cc lang="text"] vzctl set 101 --netif_add eth0 --save [/cc] В vzctl версии >3.0.22 можно указать еще и bridge, к которому присоединяться. Но в ubuntu 8.10 версия 3.0.22, и поэтому пришлось дописывать небольшой скрипт. А заодно исправить мелкий баг. Итак, в /etc/vz/conf/101.conf нужно дописать [cc lang="bash"] CONFIG_CUSTOMIZED="yes" VZHOSTBR="br0" [/cc] Теперь создадим скрипт /etc/vz/bin/vznetaddbr [cc lang="bash"] mkdir /etc/vz/bin touch /etc/vz/bin/vznetaddbr chmod 700 /etc/vz/bin/vznetaddbr [/cc] с таким содержимым [cc lang="bash"] #!/bin/bash # /etc/vz/bin/vznetaddbr # a script to add virtual network interfaces (veth-s) in a CT to a bridge on CT0 CONFIGFILE=/etc/vz/conf/$VEID.conf . $CONFIGFILE VZHOSTIF=`echo $NETIF |sed 's/^.*host_ifname=\(.*\),.*$/\1/g'` if [ ! -n "$VZHOSTIF" ]; then echo "According to $CONFIGFILE CT$VEID has no veth interface configured." exit 1 fi if [ ! -n "$VZHOSTBR" ]; then echo "According to $CONFIGFILE CT$VEID has no bridge interface configured." exit 1 fi echo "Adding interface $VZHOSTIF to bridge $VZHOSTBR on CT0 for CT$VEID" /sbin/ifconfig $VZHOSTIF 0 echo 1 > /proc/sys/net/ipv4/conf/$VZHOSTIF/proxy_arp echo 1 > /proc/sys/net/ipv4/conf/$VZHOSTIF/forwarding /usr/sbin/brctl addif $VZHOSTBR $VZHOSTIF exit 0 [/cc] и затем создадим /etc/vz/vznet.conf со следующим содержимым: [cc lang="bash"] #!/bin/bash EXTERNAL_SCRIPT="/etc/vz/bin/vznetaddbr" [/cc] Теперь про баг (устраненный в 3.0.23): в процессе старта при наличии vznet.conf вызывается скрипт /usr/sbin/vznetcfg. Так как в debian/ubuntu используется dash (/bin/sh), то там по чистой случайности нету команды source, а оттого ошибка появляется на строке 20: [cc lang="bash"] [ -f "$VZNETCFG" ] && source "$VZNETCFG" [/cc] Решение - заменить на [cc lang="bash"] [ -f "$VZNETCFG" ] && ."$VZNETCFG" [/cc] Заменить можно через sed (I'm loving it!): [cc lang="bash"] cp -p /usr/sbin/vznetcfg /usr/sbin/vznetcfg.orig sed -i 's/source "$VZNETCFG"/\. "$VZNETCFG"/' /usr/sbin/vznetcfg [/cc] Соответственно теперь выполним [cc lang="bash"] vzctl stop 101 vzctl start 101 brctl show [/cc] В конце мы должны увидеть нечто похожее на veth101.0: [cc lang="text"] bridge name bridge id STP enabled interfaces br0 8000.00024494a7ac no eth1 veth101.0 [/cc] Если все удалось - то можно смело идти в виртуальную машину [cc lang="bash"] vzctl enter 101 [/cc] и делать все чего хочется. По поводу роутинга через другого провайдера: подсмотрев в ifconfig -a внутри виртуальной машинки мак-адрес сетевого интерфейса достаточно в /etc/dhcp3/dhcpd.conf на хост-машине (я же говорил - она еще и роутер) прописать что-то вроде: [cc lang="text"] host gretchin { hardware ethernet 00:18:51:80:8A:D9; fixed-address 192.168.1.101; server-name "gretchin"; option routers 192.168.1.2; } [/cc] где 192.168.1.2 - второй роутер в той же сети. По материалам:
  1. help.ubuntu.com
  2. ubuntuforums.org
  3. Howtoforge
  4. forum.openvz.org
  5. Gentoo Wiki
  6. OpenVZ-Users-Guide.pdf
PS: не забывайте про GNU Screen. Это избавляет от многих проблем, особенно при конфигурации сети.