Сеть из виртуальных машин openSUSE 11.1 на VirtualBox 3.0.4
Раздел : Система. Администрирование
Опубликовано Greenif [09/09/2009]
В это статье описываю решение сразу двух проблем:
Клонирование образов VirtualBox *.vdi
Настройка сети.

И так, что имеется , так сказать исходные данные:
ADSL modem в режиме роутера с ip адресом 192.168.2.1
Реальная машина(хост) с ip адресом 192.168.2.2
Одна виртуальная машина openSUSE 11.1.vdi

Задача:
Получить несколько виртуальных машин с настроенной сетью между собой, хостом, модем и так что бы все это бегало в интернет.
Для начала сделаем резервную копию виртуального образа.
Далее нужно подготовить виртуальный образ для клонирования. Если этого не сделать то при загрузке клона вылезут грабли, так как при клонировании VirtualBox изменит серийный номера виртуального жесткого диска. Система просто не загрузиться.
По этому в основных загрузочных файлах, системы на виртуальной машине, нам нужно поменять ссылки на устройства на универсальные типа /dev/sda3 вместо
/dev/disk/by-id/ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part3

Для того что бы узнать какая ссылка какому ID отвечает, выполним:

ls /dev/disk/by-id/ -l

увидим что то в духе:

lrwxrwxrwx 1 root root 9 Сен 8 22:59 ata-Hitachi_HDP725050GLA360_GEA530RE0JG7RA -> ../../sdc
lrwxrwxrwx 1 root root 10 Сен 8 22:59 ata-Hitachi_HDP725050GLA360_GEA530RE0JG7RA-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 9 Сен 8 22:59 ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW -> ../../sda
lrwxrwxrwx 1 root root 10 Сен 8 22:59 ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Сен 8 22:59 ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Сен 8 22:59 ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part3 -> ../../sda3


Теперь открываем файл /etc/fstab. У меня это так:

kdesu kwrite /etc/fstab

и заменяем:

/dev/disk/by-id/ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part1 swap swap defaults 0 0
/dev/disk/by-id/ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part3 / ext3 acl,user_xattr 1 1
/dev/disk/by-id/ata-Hitachi_HDT721010SLA360_STF607MH1JV7LW-part2 /home ext3 defaults

на:

/dev/sda1 swap swap defaults 0 0
/dev/sda3 / ext3 acl,user_xattr 1 1
/dev/sda2 /home ext3 defaults


С fstab закончили, теперь нужно подправить параметры загрузки grub.

kdesu yast2 bootloader

По аналогии с fstab заменяем ссылки на устройства.
И не забываем сохранить конфигурацию.
Выключаем виртуальную машину.
Образ готов к клонированию.

Теперь создадим клон виртуальной машины.
Почему просто не скопировать vdi файл. По тому что VirtualBox будет ругаться что у него уже зарегистрирован диск с таким серийным номером. Этого ограничения данной прекрасной программы мне никак не понять. Ведь оно мне стоил почти целого дня моей жизни.
И так:

VBoxManage clonevdi OpenSUSE.vdi OpenSUSEclone.vdi

По окончанию процесса получаем новый образ готовый к использованию.
Теперь с помощью замечательного GUI VirtualBox создаем новую виртуальную машину с использованием существующего жесткого диска OpenSUSEclone.vdi. Ну тут думаю ничего объяснять не надо.
Если в подготовке все было сделано правильно, машина загрузиться без проблем.

Теперь, на хосте, настроим мост между сетевым интерфейсом VirtualBox vboxnet0 и нашей локальной сетью eth0. У вас должен был появиться сетевой адаптер VirtualBox vboxnet0. Если нет запустите виртуальную машину и он появиться, скорее всего есть более элегантный способ, но я его не знаю.
Для настройки моста есть два пути первый красивы и очевидный, но у него один недостаток — все настройки слетят при перезапуске сети. В второй менее красивый за то должен работать постоянно, он предпочтительнее. Yast здесь работать не будет, потому что он читает настройки интерфейсов из каталога /etc/sysconfig/network, а там нет настроек для vboxnet0 и он просто не увидит этот интерфейс.
Первый вариант:
ifconfig eth0 0.0.0.0 //Удаляем IP адрес eth0
ifconfig vboxnet0 0.0.0.0 //Удаляем IP адрес vboxnet0
brctl addbr br0 // Создаем мост br0
brctl addif br0 eth0 //Добавляем интерфейс eth0 в мост br0
brctl addif br0 vboxnet0 //Добавляем интерфейс vboxnet0 в мост br0
ifconfig br0 192.168.2.10 up //Назначаем адрес мосту и запускаем его.

Второй вариант:
Из каталога /etc/sysconfig/network копироуем в любой другой каталог файл настройки сетевого интерфейса eth0, файл ifcfg-eth0. После чего изменяем его содержимое на:
DEVICE=eth0
STARTMODE=onboot
BOOTPROTO=static
IPADDR='0.0.0.0'
BROADCAST='0.0.0.0'
REMOTE_IPADDR=
MTU=1500
ETHTOOL_OPTIONS=
USERCONTROL=no
Этот наверное не самый красивый вариант этого файла в данном случае, но рабочий.

Создаем файл настройки моста ifcfg-br0
BOOTPROTO=static
BRIDGE=yes
BRIDGE_FORWARDDELAY='0'
BRIDGE_PORTS='vboxnet0 eth0'
BRIDGE_STP=on
IPADDR='192.168.2.10/24'
BROADCAST='192.168.2.255'
NETWORK='192.168.2.0'
MTU='1500'
ETHTOOL_OPTIONS=''
REMOTE_IPADDR=''
STARTMODE=auto
USERCONTROL=no

Пере запускаем сеть:

/etc/init.d/network restart

Для работы сети этого должно быть достаточно, для того что бы работал интернет необходимо еще указать шлюз и DNS. Как это сделать описано в следующем разделе.

Теперь настроим сеть в виртуальных машинах. Для этого их следует выключить. Открыть свойства виртуальной машины, раздел «Сеть». Включить первый сетевой адаптер, если он выключен. Установить «Тип подключения» «Сетевой мост», «Имя» «br0». Имя моста берем из предыдущего раздела. И это проделываем для всех виртуальных машин. Далее включаем машины. И настраиваем сеть. В принципе если в модеме включен DHCP, то но может раздать IP адреса автоматически, но я эту возможность не использовал, настроив сеть в ручную. Так как мост работает на втором уровне модели OSI он абсолютно прозрачен для IP протокола. По этому адреса виртуальных машин назначаем из той же под сети в которой расположен хост и модем, например192.168.2.21 , 192.168.2.22 и т. д. Думаю понятно, что у каждой виртуальной машины IP адрес должен быть уникальным.
Все что нам нужно настроить в сети, на виртуальной машине это адрес, DNS и шлюз. В качестве двух последних выступает модем. Можно использовать yast, например:

kdesu yast2 lan

А можно прописать в ручную, в каталоге /etc/sysconfig/network:
!!!Следующие два параметра общие для всех машин включая хост.!!!
Указываем содержимое файла routes
default 192.168.2.1 - -
И все больше в нем ничего быть не должно. Это для определения шлюза по умолчанию.

В файле config находим параметр NETCONFIG_DNS_STATIC_SERVERS и устанавливаем его значения.
NETCONFIG_DNS_STATIC_SERVERS="192.168.2.1"
Это DNS.

Ну и наконец прописываем параметры интерфейса. Имя файла может отличаться от имени интерфейса, у меня на пример в процессе экспериментов на одной виртуальной машине имя адаптера eth0, а на второй eth1. Хотя они клоны.
И так, содержимое файла ifcfg-eth0 на одной из виртуальных машин:

BOOTPROTO='static'
IPADDR='192.168.2.21/24'
NETMASK='255.255.255.0'
NETWORK='192.168.2.0'
BROADCAST='192.168.2.255'
NAME='MCP55 Ethernet'
MTU='1500'
ETHTOOL_OPTIONS=''
REMOTE_IPADDR=''
STARTMODE=onboot
USERCONTROL=no

Некоторые параметры можно не указывать:

NETMASK='255.255.255.0'
NETWORK='192.168.2.0'
BROADCAST='192.168.2.255'
NAME='MCP55 Ethernet'
MTU='1500'

Это дело вкуса. Мое мнение что так очевиднее.

Пере запускаем сеть в начале на хосте, а потом на всех виртуальных машинах:

/etc/init.d/network restart

Должно работать.

Проверяем работу сети с помощью ping
ping 192.168.2.1
ping 192.168.2.10
ping 192.168.2.21
ping 192.168.2.22
ping opensuse.ru

Если не получиться обращайтесь, чем смогу помогу.