Настройка сети при работе с QEMU в QNX(english version)Эмулятор аппаратного обеспечения
QEMU предоставляет широкие возможности сетевой конфигурации. Этому способствует и большой набор эмулируемых сетевых контроллеров (NE2000, Intel 82551, Intel 82557B, Intel 82559ER, Realtek RTL8139, Intel E1000 и т.д.), что позволяет ожидать работу с сетью подавляющего большинства гостевых систем. Думаю, что будет сложно найти развитую операционную систему, в которой отсутствует поддержка NE2000 или RTL8139. Также немалую роль в работе сети играют и гибкие варианты конфигурации сети, сетевого взаимодействия между гостевыми и хост системами. В данной заметке будут рассмотрены различные варианты конфигурации сети при работе QEMU в QNX хост. Также стоит отметить, что дополнительную информацию по этому вопросу можно найти в сети, стоит учитывать, что сетевая подсистема QNX6 очень похожа на NetBSD.
Примечание 1. Во всех примерах для демонстрации работы сети в качестве гостевой системы будет использоваться установочный диск Archlinux (archlinux-2009.08-netinstall-i686.iso). Но точно также можно настраивать сеть и в других гостевых ОС, например, Windows, QNX 4.25 или NetBSD, с учётом их специфики. Хост система представляет собой QNX Neutrino 6.4.1, аналогично можно использовать QNX 6.4.0 или QNX 6.5.0.Примечание 2. В примерах приняты следующие соглашения об условных обозначениях:
- [QNX] -- команда выполняется в QNX хост системе;
- [ARCH] -- команда выполняется в гостевой системе, в нашем случае в Archlinux.Пользовательский режим работы сетиСамый простой способ соединения гостевой системы с хост системой это пользовательский (user) режим. В этом режиме QEMU обеспечивает:
- виртуальную сеть (10.0.2.0)
- сетевой экран, блокирующий любые входящие соединения
- сервер DHCP (10.0.2.2)
- шлюз (10.0.2.2)
DHCP сервер автоматически выдаёт адрес 10.0.2.15, при поступлении DHCP запроса от гостевой системы. Если хост система (QNX) имеет выход в интернет, то и гостевая система также получает доступ в глобальную сеть. Никаких дополнительных настроек не требуется.
1.
[QNX] Запускаем виртуальную машину:
# qemu -net user -net nic -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
2.
[ARCH] Настраиваем сетевой интерфейс:
Примечание. В различных операционных системах настройка сетевого интерфейса средствами DHCP может выполняться различными способами. Например, в QNX следует выполнить следующую команду: 3.
[ARCH] Проверяем работу сети:
# ping -c2 10.0.2.2
# telnet 10.0.2.2
Объединение виртуальных сетейНеобходимо запустить первый процесс QEMU, который будет ожидать входящие соединения на определённом порту. Второй процесс QEMU будет подключаться к этому порту. Всякий раз при появлении пакета в виртуальной сети первого QEMU, он будет передан во вторую сеть, и наоборот.
Реализуем следующую конфигурацию:
-
Гостевая система 1 ожидает входящие соединения на порту
8010;
-
Гостевая система 2 подключается к
гостевой системе 1 через
localhost:8010.
1.
[QNX] Запускаем
гостевую систему 1:
# qemu -net nic,macaddr=52:54:00:12:34:57 -net socket,listen=:8010 -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
2.
[QNX] Запускаем
гостевую систему 2:
# qemu -net nic,vlan=2,macaddr=52:54:00:12:34:56 -net socket,vlan=2,connect=127.0.0.1:8010 -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
3.
[ARCH1] Конфигурируем сеть в
гостевой системе 1:
# ifconfig eth0 10.0.2.101 netmask 255.255.255.0 up
4.
[ARCH2] Конфигурируем сеть в
гостевой системе 2:
# ifconfig eth0 10.0.2.102 netmask 255.255.255.0 up
5.
[ARCH] Проверяем работу сети в обоих гостевых системах:
Подключение виртуальной сети к TAP устройствуСуществует другой способ организации виртуальной сети -- использование виртуального ethernet устройства при помощи
TAP драйвера. Ethernet-кадры принимаемые таким устройством также появляются в виртуальной сети гостевой системы. Разумеется, ethernet-кадры посланные виртуальной сетью гостевой системы также принимаются TAP устройством.
При использования драйвера
devnp-qtap.so для QNX6 приложения получают доступ к взаимодействию с сетевым устройством используя файловый дескриптор. Любые данные посланные через файловый дескриптор будут приняты на обоих сторонах. Это значит, что приложения запущенные в гостевой системе будут иметь возможность доступа и подключения к приложениям запущенным на хост системе. Если разрешена переадресация портов (port forwarding), то приложения гостевой системы также смогут иметь доступ к внешней сети (internet).
При указании параметра
-net tap QEMU будет пытаться вызывать скрипты
/etc/qemu-ifup для настройки TAP устройства и
/etc/qemu-ifdown после завершения работы с устройством. Если скрипт
/etc/qemu-ifup не будет найден, то выполнение программы прервётся. Можно изменить имена скриптов по умолчанию, либо указать, что их не надо вызывать, например так:
# qemu -net tap,script=no,downscript=no <...>
Чтобы не указывать эти параметры каждый раз, достаточно создать пустой скрипт
/etc/qemu-ifup. Главное не забыть установить ему атрибуты исполняемого файла.
1.
[QNX] Создаём и настраиваем TAP устройство:
# mount -T io-pkt /lib/dll/devnp-qtap.so
# ifconfig tap0 10.0.0.1 netmask 255.255.255.0 up
2.
[QNX] Запускаем виртуальную машину:
# qemu -net nic -net tap,ifname=/dev/tap0 -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
3.
[ARCH] Настраиваем сетевой интерфейс:
# ifconfig eth0 10.0.0.2 netmask 255.255.255.0 up
# ifconfig
4.
[ARCH] Проверяем работу сети:
# ping -c 2 10.0.0.1
# telnet 10.0.0.1
5.
[QNX] Проверяем работу сети:
Подключение виртуальных сетей к TAP устройствам (две гостевые системы)В этом примере у нас две гостевые системы (два TAP устройства). Каждая гостевая система подключается к хост системе через TAP устройство. Для того чтобы обеспечить взаимодействие между гостевыми системами необходимо настроить мост (bridge) между двумя TAP устройствами. Мост будет выступать в роли центрального сетевого узла между хостом и обоими сетевыми системами.
1.
[QNX] Создаём и настраиваем TAP устройства:
# mount -T io-pkt /lib/dll/devnp-qtap.so
# ifconfig tap0 10.0.0.1 netmask 255.255.255.0 up
# mount -T io-pkt /lib/dll/devnp-qtap.so
# ifconfig tap1 10.0.1.1 netmask 255.255.255.0 up
2.
[QNX] Запускаем
гостевую систему 1:
# qemu -net tap,ifname=/dev/tap0 -net nic,macaddr=80:00:00:12:34:57 -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
3.
[QNX] Запускаем
гостевую систему 2:
# qemu -net tap,ifname=/dev/tap1 -net nic,macaddr=80:00:00:12:34:56 -cdrom /home/qemu/img/archlinux-2009.08-netinstall-i686.iso
4.
[QNX] Создаём и конфигурируем мост:
# ifconfig bridge0 create
# brconfig bridge0 add tap0 add tap1 up
5.
[ARCH1] Конфигурируем сеть в
гостевой системе 1:
# ifconfig eth0 10.0.0.2 netmask 255.255.0.0 up
6.
[ARCH2] Конфигурируем сеть в
гостевой системе 2:
# ifconfig eth0 10.0.1.2 netmask 255.255.0.0 up
7. Проверяем работу сети как и раньше ping'ом. Гостевые системы должны пинговать друг друга и хост систему, а также хост система должна пинговать обе гостевые.