Только-что закончил эксперименты с
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 - второй роутер в той же сети.
По материалам:
-
help.ubuntu.com
-
ubuntuforums.org
-
Howtoforge
-
forum.openvz.org
-
Gentoo Wiki
-
OpenVZ-Users-Guide.pdf
PS: не забывайте про GNU Screen. Это избавляет от многих проблем, особенно при конфигурации сети.