Подключение ВМ qemu в локальную сеть
Материал из Gentoo Linux Wiki
- Вернуться в раздел советов
Содержание |
[править] Введение
Настраивал я все это дело в последней (8) версии qemu, но думаю, что и в 6 принцип тот-же. В результате приведенных ниже настроек получаются две сети: реальная сеть (192.168.1.0/24) и виртуальная сеть (192.168.5.0/24), между которыми маршрутизатором является хост компьютер.
[править] Настройка ядра
Сеть поднимается так: Я делал сеть с использованием TUN/TAP интерфейса. Для этого ядро должно поддерживать этот интерфейс (я собрал его модулем):
| Code: Конфигурация ядра |
hj@hj hj $ zcat /proc/config.gz | grep CONFIG_TUN CONFIG_TUN=m или CONFIG_TUN=y |
Если результат отличается то вам придется пересобрать ядро с поддержкой TUN/TAP интерфейса.
После подгрузки модуля
| Code: Подгрузка модуля |
# modprobe tun |
появляется устройство /dev/net/tun. Я выставил на него права 666.
[править] Запуск qemu
Настройка этого интерфейса при запуске qemu настраивается при помощи скриптов /etc/qemu-ifup и /etc/qemu-ifup-sudo:
| Файл: /etc/qemu-ifup |
#!/bin/sh sudo /etc/qemu-ifup-sudo $@ |
| Файл: /etc/qemu-ifup-sudo |
#!/bin/sh /sbin/ifconfig $1 192.168.5.1 |
| Примечание: Разбиение на два скрипта нужно лишь для удобства последующего редактирования скрипта /etc/qemu-ifup-sudo без перенастройки sudo. Если вы разрешили пользователю выполнять ЛЮБЫЕ команды через sudo, то такого разбиения не требуется |
Не забудьте сделать их исполняемыми:
# chmod +x /etc/qemu-ifup*
Для работы этих скриптов надо правильно настроить sudo (для справки см. man sudo, man visudo, man sudoers). Например, можно написать в конце /etc/sudoers следующую строку:
| Файл: /etc/sudoers |
%users ALL = NOPASSWD: /etc/qemu-ifup-sudo * |
Для того, чтобы виртуальная машина при запуске видела реальную машину по сети qemu надо запустить следующим образом:
| Code: Запуск ВМ |
$ qemu -hda ./win2kas.hd -net nic,vlan=0 -net tap,vlan=0 |
Эта команда говорит qemu, что надо создать сетевую карту в виртуальной машине, подключив ее к виртуальной сети 0 (-net nic,vlan=0) и поднять tap интерфейс на хост компьютере, также подключив его к виртуальной сети 0 (-net tap,vlan=0). Адрес для tap интерфейса берется из скрипта /etc/qemu-ifup (см. выше). Адрес сетевой карты в виртуальной машине конфигурируется стандартными средствами гостевой ОС и должен находится в той-же сети, что и адрес tap интерфейса. Например у меня настроено так: Адрес tap интерфейса: 192.168.5.1, а адрес сетевой карты в виртуальной машине: 192.168.5.2. Если планируется использовать только один сетевой адаптер в ВМ, то параметр vlan можно не указывать.
[править] Маршрутизация
Для того, чтобы из виртуальной машины было видно локальную сеть нужно включить маршрутизацию на хост компьютере:
| Code: Включение маршрутизации |
# echo 1 > /proc/sys/net/ipv4/ip_forward |
в результате получается следующая конструкция сети:
| Code: Схема полученной сети |
+-----+ +----------------+ +---------+ | LAN |--|eth0 HOST tap0|--| VM Qemu | +-----+ +----------------+ +---------+ |
т.е. хост компьютер становится маршрутизатором между виртуальной сетью и реальной сетью. Для того, чтобы гонять между этими сетями широковещательные пакеты и иметь общую arp таблицу, можно на хост компьютере поднять arp proxy. Обращаться к ВМ можно по адресу 192.168.5.2.
Чтобы сделать так, что из сети видно ВМ так, как будто она подключена к реальной сети напрямую и имеет свой IP адрес можно сделать так:
поднять альяс eth который будет адресом нашей ВМ:
| Code: eth0:1 |
# ifconfig eth0:1 192.168.1.50 up |
ВНИМАНИЕ, адрес eth0:1 должен находиться в диапазоне адресов вашей локальной сети, в моем случае сеть имеет диапазон адресов 192.168.1.1-192.168.1.254.
Затем используя пакет iptables настроить nat для нашей ВМ:
| Code: Правила iptables |
# iptables -t nat -A POSTROUTING -s 192.168.5.2 -j SNAT --to-source 192.168.1.50 # iptables -t nat -A PREROUTING -d 192.168.1.50 -j DNAT --to-destination 192.168.5.2 |
После этих манипуляций ВМ будет видна из реальной сети по адресу 192.168.1.50.
[править] Окончательная настройка
Для того, чтобы интерфейс eth0:1 и настройки iptables производились при старте qemu можно добавить эти строки в скрипт /etc/qemu-ifup-sudo.
| Code: Новый скрипт /etc/qemu-ifup-sudo |
#!/bin/sh /sbin/ifconfig $1 192.168.5.1 ifconfig eth0:1 192.168.1.50 up iptables -t nat -A POSTROUTING -s 192.168.5.2 -j SNAT --to-source 192.168.1.50 iptables -t nat -A PREROUTING -d 192.168.1.50 -j DNAT --to-destination 192.168.5. |
[править] Заключение
К сожалению в данной конфигурации в сетевом окружении ВМ не будет видно реальных машин из сети. Я думаю, что это можно исправить установив на хост компьютере ARP прокси. Для меня в данный момент эта задача пока не актуальна, если кто-нибудь решит ее можете добавить решение здесь, также можете написать мне и я добавлю его к оригиналу.
С наилучшими пожеланиями HJ.
[править] Альтернативная настройка с помощью Bridge
[править] Конфигурация ядра
Также, как и в предыдущем случае, нам понадобится включить поддержку tun/tap:
| Linux Kernel Configuration: |
Device Drivers --->
Network device support --->
Network device support (NETDEVICES [=y]) --->
<M> Universal TUN/TAP device driver support
|
# echo tun >> /etc/modules.autoload.d/kernel-2.6 # modprobe tun
Ещё необходимо включить Bridhing:
| Linux Kernel Configuration: |
Networking --->
Networking support (NET [=y]) --->
Networking options --->
<M> 802.1d Ethernet Bridging
|
# echo bridge >> /etc/modules.autoload.d/kernel-2.6 # update-modules # modprobe bridge
[править] Настройка bridge
Во-первых, надо сделать
# emerge bridge-utils
Во-вторых, меняем настройки /etc/conf.d/net
Например, если у вас там раньше было что-то типа:
| Файл: Старый /etc/conf.d/net |
config_eth0=( "dhcp" ) dhcpcd_eth0="-t 10" fallback_route_eth0=( "default via 192.168.1.1" ) |
То теперь надо написать:
| Файл: Новый /etc/conf.d/net |
bridge_br0="eth0"
config_eth0=( "null" )
config_br0=( "dhcp" )
dhcpcd_br0="-t 10"
fallback_route_br0=( "default via 192.168.1.1" )
brctl_br0=( "setfd 1" "sethello 1" "stp on" )
depend_br0() {
need net.eth0
}
|
Подробности см. в /etc/conf.d/net.example и en:HOWTO_setup_a_gentoo_bridge
В-третих, добавляем нужные скрипты в автозапуск и удаляем ненужные:
# ln -sf /etc/init.d/net.lo /etc/init.d/net.br0 # rc-update add net.br0 default # rc-update del net.eth0
| Примечание: Мы удаляем net.eth0 из автозагрузки, потому что он будет подниматься автоматически в нужное время как зависимость net.br0. |
Теперь, либо перезагружаемся, либо останавливаем net.eth0 и запускаем net.br0, а также все зависимые службы.
[править] Настройка qemu
Также как и впредыдущем варианте настройки, пишем два скрипта /etc/qemu-ifup и /etc/qemu-ifup-sudo:
| Файл: /etc/qemu-ifup |
#!/bin/sh sudo /etc/qemu-ifup-sudo $@ |
| Файл: /etc/qemu-ifup-sudo |
#!/bin/sh echo "Executing /etc/qemu-ifup" echo "Bringing up $1 for bridged mode..." /sbin/ifconfig $1 0.0.0.0 promisc up echo "Adding $1 to br0..." /sbin/brctl addif br0 $1 |
Делаем эти файлы исполняемыми и настраиваем sudo (см. выше)
[править] Запуск qemu
В строке запуска qemu надо всего лишь добавить два параметра: -net nic и -net tap. Вот, например, как это выглядит у меня:
| Code: Запуск qemu |
|
$ qemu -m 256 -localtime -net nic -net tap ~/qemu/hda2k.img |
Вот и всё! Донастройка нового сетевого интерфейса производится уже внутри гостевой ОС.
