Сеть в виртуальной машине на OpenVZ
by Bozaro on Мар.15, 2009, under Ubuntu, Без рубрики
В догонку к посту Установка OpenVZ на Ubuntu Linux решил описать результаты копаний по поводу настройки сети в виртуальной машине OpenVZ.
Итого в vzctl можно добавить сетевой интерфейс следующими способами:
- vzctl set 101 –ipadd 192.168.0.1 –save
Данный способ добавляет виртуальной машине интерфейс точка-тока с хост-машиной. В общем целом для простых случаев этого достаточно, но данный способ, к примеру, не позволяет работать с broadcast-ами (он не подходит, если на виртуальную машину нужно установить Samba или DHCP-cервер). - vzctl set 101 –netdev_add eth0 –save
Тут все тоже достаточно просто. Указанный сетевой интерфейс переносится в виртуальную машину. То есть он будет доступен только в указанной виртуальной машине (в хост-машине или нескольких виртуальных машинах его использовать нельзя).
Так же данный способ не работает если попытаться перебросить в виртуальную машину VLAN-интерфейс. - vzctl set 101 –netif_add eth0 –save
vzctl set 101 –netif_add eth0,00:18:51:d8:04:98,veth101.0,00:18:51:0f:a6:ab
Самое интересное – данный способ создает пару интерфейсов (один в виртуальной машине – eth0, и один в хост-машине – veth101.0), но аргумент для указания моста в версии 3.0.22 еще отсутствует.
Речь далее пойдет о 3-ем способе.
При старте интерфейса нужно принудительно добавить его в интерфес моста. Описание этого процесса было взято из статьи: OpenVZ on Ubuntu 8.10 с небольшими правками (мне надо было иметь возможность указать разные мосты для разных интерфейсов), но суть та же.
Разница в реализации следующая:
- Соответствие моста и интерфейса я задавал через переменную:
VZBRIDGE="veth101.0,br0 veth101.1,br1"
- Скрипт /etc/vz/bin/vznetaddbr получился следующим:
#!/bin/bash CONFIGFILE=/etc/vz/conf/${VEID}.conf . $CONFIGFILE for iter in $VZBRIDGE; do IFACE=${iter%,*} BRIDGE=${iter#*,} if [ "$IFACE" == "$3" ]; then echo Adding interface $IFACE to bridge $BRIDGE /sbin/ifconfig $IFACE up /usr/sbin/brctl addif $BRIDGE $IFACE fi done