Виртуальные машины - безусловно удобное средство для пробы какого-нибудь программного продукта. Однако если он еще и распределенный, как в моем случае - Sun Grid Engine - требуется несколько виртуальных машин, и естественно хотелось бы клонировать их из одной проинсталлированной. Но после клонирования настройка сети превращается в маленькую головную боль, поэтому я написал эту памятку. В ней рассматривается случай для VirtualBox 4 и CentOS 5.6
Меняем MAC-адрес
После экспорта-импорта OVA-образа новая виртуальная машина получает такой же мак-адрес как и изначальная, так что необходимо сменить его. Это легко достигается посредством VBoxManage:
$ VBoxManage modifyvm CentOS --macaddress1 auto
Здесь цифра 1 обозначает номер виртуального интерфейса в VirtualBox.
В некоторых дистрибутивах (в частности, такая проблема проявлялась на Oracle Enterprise Linux 6 и Debian 5) после перезагрузки вы можете увидить интерфейс с новым макадресом под именем... eth1 вместо старого eth0. Связано это с тем, что в этих системах привязка имен устройств демоном udev ведется также и по мак-адресу:
[root@oel6 ~]# tail -5 /etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:4a:df:90",
ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:ba:ce:1d",
ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
В этом случае необходимо удалить устаревшую запись, а в новой сменить имя на eth0.
Меняем настройки IP
Основное дерево конфигурационных файлов в RedHat-подобных дистрибутивах хранится в директории /etc/sysconfig и управляется утилитами system-config-*. Для настройки сети, в частности, таких утилит целых три: system-config-network-cmd, предоставляющий коммандный интерфейс, system-config-network-tui, представляющий интерфейс на псевдографике и system-config-network-gui, полноценную графическую программу. Однако CLI мне представляется здесь крайне неочевидным (чего только стоят имена параметров DeviceList.Ethernet.eth0.bak.Device), а в TUI нет важной настройки - необходимость поднимать интерфейс при загрузке, поэтому я предпочитаю непосредственно редактировать текстовые конфиги.
Итак, топаем в /etc/sysconfig/network-scripts и редактируем файл ifcfg-<имя интерфейса>:
[root@centos-1 ~]# cd /etc/sysconfig/network-scripts
[root@centos-1 network-scripts]# vi ./ifcfg-eth0
Сразу удаляем строки HWADDR (MAC-адрес мы сменили!) и NM_CONTROLLED (NetworkManager не нужен). Для DHCP файл будет выглядеть следующим образом:
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
Для статического назначения IP:
DEVICE="eth0"
BOOTPROTO=static
NETWORK=192.168.50.0
NETMASK=255.255.255.0
IPADDR=192.168.50.124
GATEWAY=192.168.50.254
ONBOOT="yes"
Полный список параметров можно найти например здесь: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-networkscripts-interfaces.html
Меняем имя хоста и тестируем
Ну и напоследок, меняем имя хоста в /etc/hosts и параметр HOSTNAME в файле /etc/sysconfig/network:
[root@centos-1 sysconfig]# sed -i 's/HOSTNAME=centos-1/HOSTNAME=centos/g' /etc/sysconfig/network
[root@centos-1 sysconfig]# sed -i 's/centos-1/centos/g' /etc/hosts
Параметр -i в данном случае означет in-place редактирование указанного файла, "centos-1" - старое имя хоста, "centos" - новое.
Перезагружаем службу сети и имени хоста:
[root@centos-1 sysconfig]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0:
Determining IP information for eth0... done.
[ OK ]
Смена имени хоста требует перезагрузки системы, что мы собственно и делаем:
[root@centos-1 sysconfig]# init 6
Если в выводе команды service все статусы OK и зеленые, а после перезагрузки мы видим обновленное имя хоста, значит мы все сделали правильно.