Только-что закончил эксперименты с 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:
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
Далее – по учебнику:
Получил ядро 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:
Затем создал виртуальный контейнер
задал виртуальной машине hostname
и добавил запуск этой VPS вместе с запуском OpenVZ (/etc/init.d/vz)
Чудесно. На данный момент имеем виртуальную машину без сети. Для того чтоб она была видна в локальной сети нужно соорудить bridge. Для этого понадобится пакет bridge-utils:
Теперь подправил /etc/network/interfaces:
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:
Затем применил настройки:
…и лишился сети. Сам не понял что и как, но после ребута роутера и сидения перед его консолью все заработало самостоятельно. Хм.
Добавил сетевой интерфейс в виртуальную машину:
В vzctl версии >3.0.22 можно указать еще и bridge, к которому присоединяться. Но в ubuntu 8.10 версия 3.0.22, и поэтому пришлось дописывать небольшой скрипт. А заодно исправить мелкий баг.
Итак, в /etc/vz/conf/101.conf нужно дописать
VZHOSTBR="br0"
Теперь создадим скрипт /etc/vz/bin/vznetaddbr
touch /etc/vz/bin/vznetaddbr
chmod 700 /etc/vz/bin/vznetaddbr
с таким содержимым
# /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 со следующим содержимым:
EXTERNAL_SCRIPT="/etc/vz/bin/vznetaddbr"
Теперь про баг (устраненный в 3.0.23): в процессе старта при наличии vznet.conf вызывается скрипт /usr/sbin/vznetcfg. Так как в debian/ubuntu используется dash (/bin/sh), то там по чистой случайности нету команды source, а оттого ошибка появляется на строке 20:
Решение – заменить на
Заменить можно через sed (I’m loving it!):
sed -i 's/source "$VZNETCFG"/\. "$VZNETCFG"/' /usr/sbin/vznetcfg
Соответственно теперь выполним
vzctl start 101
brctl show
В конце мы должны увидеть нечто похожее на veth101.0:
br0 8000.00024494a7ac no eth1
veth101.0
Если все удалось – то можно смело идти в виртуальную машину
и делать все чего хочется.
По поводу роутинга через другого провайдера: подсмотрев в ifconfig -a внутри виртуальной машинки мак-адрес сетевого интерфейса достаточно в /etc/dhcp3/dhcpd.conf на хост-машине (я же говорил – она еще и роутер) прописать что-то вроде:
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 – второй роутер в той же сети.
По материалам:
PS: не забывайте про GNU Screen. Это избавляет от многих проблем, особенно при конфигурации сети.
> но ядро с поддержкой
> виртуализации было в 8.04,
> в 8.10 от него отказались
> в пользу KVM.
Скорее, мы (OpenVZ) не успели сделать для них ядро.
Кстати, если вы как юзер зафайлите им баг о том, что вам очень не хватает OpenVZ ядра — то, возможно, с ним будет лучше в будущих версиях.
Kir Kolyshkin
March 3rd, 2009
Могу сказать что я пока только подхожу к внедрению виртуализации и изолированых контейнеров.
Когда-то работал с VPS на базе OpenVZ, и был жутко недоволен. Но я полагаю это были особенности натройки хостера. Практика покажет.
dm
March 4th, 2009
и был жутко недоволен. Но я полагаю это были особенности наcтройки хостера
Там проблема в том, что большинство людей, начинающих использовать OpenVZ (включая даже и хостеров), не знают про user beancounters — что смотреть, как регулировать. Буквально всем и каждому надо объяснять и рассказывать. Поэтому у нас на вики много информации на сей счёт, начать можно с http://wiki.openvz.org/Resource_shortage, который как раз написан наиболее простым языком и предлагает наиболее простые решения.
Kir Kolyshkin
March 6th, 2009
Спасибо, обязательно посмотрю.
dm
March 6th, 2009