QEmu и настройка сети

Наконец-то мне удалось настроить сеть. Сейчас я расскажу, каким образом это у меня получилось.

Во-первых, я решил включить виртуальную машину в реальную локальную Ethernet-сеть, объединив мостом tap-интерфейс и eth-интерфейс. Для настройки сетевого интерфейса и мостового объединения интерфейсов нам понадобятся два пакета - соответственно uml-utilities и bridge-utils. Установим их с помощью команды:

# aptitude install uml-utilities bridge-utils

Загрузим в ядро модули bridge и tun:

# modprobe bridge
# modprobe tun

В принципе подгружать эти модули совсем не обязательно, т.к. они автоматически будут загружены командами brctl и tunctl при необходимости. Тем не менее, я таким образом просто решил заранее удостовериться, что возможные дальнейшие ошибки не связаны с отсутствием модулей или невозможностью загрузить их в ядро.

Теперь отредактируем правила демона udev. При настройке эмулятора qemu я добавил в систему группу kqemu и дал ей права на доступ к устройству /dev/kqemu, создаваемому модулем ядра kqemu для более быстрой эмуляции виртуальной машины. Теперь нужно дать права на запись в устройство /dev/net/tun группе kqemu. Нужное нам правило находится в файле /etc/udev/rules.d/91-permissions.rules, в нём необходимо заменить такую строчку:

KERNEL=="tun",                  MODE="0666"

На следующую строчку:

KERNEL=="tun",                  MODE="0660",    GROUP="kqemu"

Затем нужно перезапустить udev, чтобы внесённые изменения вступили в силу:

# /etc/init.d/udev restart

По непонятным причинам это не оказало действия на устройство и я остановил и запустил udev снова, на сей раз отдельными командами:

# /etc/init.d/udev stop
# /etc/init.d/udev start

Теперь займёмся настройкой моста и сетевого интерфейса, в файле /etc/network/interfaces пропишем настройку моста br0 и виртуального интерфейса tap0:

auto tap0
iface tap0 inet static
  up ifconfig tap0 up
  down ifconfig tap0 down
  tunctl_user stupin

auto br0
iface br0 inet dhcp
  bridge_ports eth1 tap0
  bridge_fd 9
  bridge_hello 2
  bridge_maxage 12
  bridge_stp off

Строчка tunctl_user указывает имя пользователя, которому будет принадлежать этот интерфейс.

Теперь перезапустим настройку сети:

# /etc/init.d/networking restart

Если посмотреть список активных интерфейсов с помощью команды ifconfig, то можно увидеть 4 интерфейса: локальный петлевой интерфейс lo, интерфейс моста br0, получивший сетевые настройки по DHCP и два ненастроенных интерфейса: eth1 и tap0. eth1 соответствует реальной сетевой карте, а tap0 - виртуальному Ethernet-интерфейсу.

Теперь можно запустить виртуальную машину и настроить в ней сеть. К сожалению с помощью QEmulator'а нужные настройки через меню задать не получается, но зато можно воспользоваться, например, такой командой:

$ qemu -M pc -m 128 -no-kqemu -no-acpi -hda /home/stupin/netbsd-disk.bin -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 -boot c

Фактически я скопировал её из QEmulator'а и подправил опции для второго сетевого интерфейса, указав имя интерфейса, с которым должна быть связана виртуальная машина.

В виртуальной машине указываем получение настроек сетевого интерфейса по DHCP. Поскольку у меня в локальной сети настроен DHCP-сервер, я сразу же смог выйти в виртуальной машине в сеть.

При перезагрузке всплыли кое-какие проблемы. Система запускает с помощью сценария /etc/init.d/uml-utilities некий uml-switch. Сначала я подумал, что именно этот uml-switch заменяет группу-владельца устройства /dev/net/tun на группу uml-net, в результате чего запущенная виртуальная машина не может получить доступ к устройству и сеть не работает.

Тут можно было поступить несколькими способами. Во-первых, можно включить себя в группу uml-net, тогда проблема будет обойдена. Во-вторых, можно поменять группу-владельца в файле /etc/default/uml-utilities, указав нужную в переменной UML_SWITCH_USER. И наконец, можно просто отключить uml-switch, указав в переменной UML_SWITCH_START значение false. Я выбрал именно последний способ, поскольку я даже не знаю что такое uml-switch, то он мне вряд-ли нужен. Однако и это не повлияло на групповую принадлежность устройства /dev/net/tun!

Я был озадачен и лучшая мысль, которая пришла мне в голову - это прогрепать каталог /etc/ на упоминание слова tun. И поиск дал результат. В файле /etc/network/if-pre-up.d/uml-utilities обнаруились такие строчки:

#
# why the hell does this need to be done?
#
chown root:uml-net /dev/net/tun
chmod 660 /dev/net/tun

Действительно, какого чёрта это необходимо делать? Я потратил уйму времени на правильную настройку, а тут какой-то умник соорудил костыль, из-за которого у меня ничего не работает! Сносим эти строчки и пробуем перезагрузить машину снова. На этот раз после перезагрузки всё окончательно наладилось.

Обновлено 23 апреля 2009 года.

Написать автору