OpenVZ on Ubuntu 8.10

Итак, задача: создать виртуальную (для начала одну) машину с 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:

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

Далее - по учебнику:

apt-get install linux-openvz vzctl

Получил ядро 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:

Затем создал виртуальный контейнер

vzctl create 101 --ostemplate ubuntu-8.10-x86 --config vps.basic

задал виртуальной машине hostname

vzctl set 101 --hostname gretchin --save

и добавил запуск этой VPS вместе с запуском OpenVZ (/etc/init.d/vz)

vzctl set 101 --onboot yes --save

Чудесно. На данный момент имеем виртуальную машину без сети. Для того чтоб она была видна в локальной сети нужно соорудить bridge. Для этого понадобится пакет bridge-utils:

apt-get install bridge-utils

Теперь подправил /etc/network/interfaces:

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

Заодно подправил интерфейс в /etc/default/dhcp3-server:

INTERFACES="br0"

Затем применил настройки:

/etc/init.d/network restart

…и лишился сети. Сам не понял что и как, но после ребута роутера и сидения перед его консолью все заработало самостоятельно. Хм.

Добавил сетевой интерфейс в виртуальную машину:

vzctl set 101 --netif_add eth0 --save

В vzctl версии >3.0.22 можно указать еще и bridge, к которому присоединяться. Но в ubuntu 8.10 версия 3.0.22, и поэтому пришлось дописывать небольшой скрипт. А заодно исправить мелкий баг.

Итак, в /etc/vz/conf/101.conf нужно дописать

CONFIG_CUSTOMIZED="yes"
VZHOSTBR="br0"

Теперь создадим скрипт /etc/vz/bin/vznetaddbr

mkdir /etc/vz/bin
touch /etc/vz/bin/vznetaddbr
chmod 700 /etc/vz/bin/vznetaddbr

с таким содержимым

#!/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

и затем создадим /etc/vz/vznet.conf со следующим содержимым:

#!/bin/bash

EXTERNAL_SCRIPT="/etc/vz/bin/vznetaddbr"

Теперь про баг (устраненный в 3.0.23): в процессе старта при наличии vznet.conf вызывается скрипт /usr/sbin/vznetcfg. Так как в debian/ubuntu используется dash (/bin/sh), то там по чистой случайности нету команды source, а оттого ошибка появляется на строке 20:

[ -f "$VZNETCFG" ] && source "$VZNETCFG"

Решение - заменить на

[ -f "$VZNETCFG" ] && ."$VZNETCFG"

Заменить можно через sed (I’m loving it!):

cp -p /usr/sbin/vznetcfg /usr/sbin/vznetcfg.orig
sed -i 's/source "$VZNETCFG"/\. "$VZNETCFG"/' /usr/sbin/vznetcfg

Соответственно теперь выполним

vzctl stop 101
vzctl start 101
brctl show

В конце мы должны увидеть нечто похожее на veth101.0:

bridge name     bridge id               STP enabled     interfaces
br0             8000.00024494a7ac       no              eth1
                                                        veth101.0

Если все удалось - то можно смело идти в виртуальную машину

vzctl enter 101

и делать все чего хочется.

По поводу роутинга через другого провайдера: подсмотрев в ifconfig -a внутри виртуальной машинки мак-адрес сетевого интерфейса достаточно в /etc/dhcp3/dhcpd.conf на хост-машине (я же говорил - она еще и роутер) прописать что-то вроде:

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;
}

где 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. Это избавляет от многих проблем, особенно при конфигурации сети.

Источник: http://dmitry.shaposhnik.name/2009/03/01/openvz-on-ubuntu-810/

Комментарии

Отправить комментарий

CAPTCHA
Защита от роботов