Вопрос или проблема
Я пытаюсь протестировать программное обеспечение на системе с порядком байтов big endian, чтобы убедиться в совместимости. Мой план — использовать qemu на Ubuntu 12.04 для эмуляции системы MIPS. До сих пор мне удалось успешно создать систему гостя, но я не смог соединить её с хостовой системой. Я могу получить доступ к внешнему миру из системы гостя (например, с помощью wget или apt-get), но мои попытки настроить samba оказались неудачными.
Согласно этому, в QEmu 1.1 и новее помощник для сетевого моста может настроить tun/tap для вас без необходимости в дополнительных скриптах. Я пытаюсь использовать это, так как видел разные версии скриптов. На данный момент qemu-system-mips -version
сообщает следующее:
QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2.1), Copyright (c) 2003-2008 Fabrice Bellard
Я собрал версию из исходников 1.4.1 и использовал версию из apt-get
. Оба сообщают одно и то же. Я работаю с предположением, что у меня версия 1.1 или выше, несмотря на то, что -version
говорит мне другое. Так или иначе, следующая инструкция заключалась в том, чтобы включить атрибут setuid для помощника по умолчанию:
sudo chmod u+s /usr/local/libexec/qemu-bridge-helper
Затем я создал файл bridge.conf
в /etc/qemu/
и /usr/local/etc/qemu
с правами -rw-r--r--
. Содержимое файла следующее:
allow br0
Если я запускаю QEmu с следующей командой:
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -net nic -net bridge,br=br0 -smb /home/uli/samba
или с помощью
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -netdev bridge,id=hn0 -device virtio-net-pci,netdev=hn0,id=nic1
или с помощью
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -netdev tap,helper=/usr/local/libexec/qemu-bridge-helper,id=hn0 -device virtio-net-pci,netdev=hn0,id=nic1
я получаю следующую ошибку:
failed to get mtu of bridge `br0': No such device
failed to launch bridge helper
qemu-system-mips: -net bridge,br=br0: Device 'bridge' could not be initialized
Справедливо, я не создал мост br0. Я пытался создать его с помощью скрипта, который не понимаю, но тогда моя система MIPS QEmu больше не подключается ни к чему. Она видит br0, но не получает IP-адрес. Очевидно, я делаю что-то неправильно:
ifconfig br0 down
brctl delbr br0
ifconfig eth2 0.0.0.0 promisc up
brctl addbr br0
brctl setfd br0 0
brctl addif br0 eth2
echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/eth2/proxy_arp
echo 1 > /proc/sys/net/ipv4/ip_forward
dhclient br0
ifconfig br0 up
Есть ли более простой способ сделать это? Лично я бы согласен просто использовать SMB-сервер на \10.0.2.4\qemu, о котором сказано здесь, но это тоже не сработало для меня (115 ошибок, когда я пытаюсь смонтировать общий ресурс, предположительно из-за проблем с сетью).
Обновление
Как только я создаю мост, я вижу следующий вывод из ifconfig на хост-машине:
br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:10.2.32.101 Bcast:10.2.32.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:85 errors:0 dropped:0 overruns:0 frame:0
TX packets:51 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8235 (8.2 KB) TX bytes:9227 (9.2 KB)
eth2 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:196581 errors:0 dropped:0 overruns:0 frame:0
TX packets:44205 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:139517339 (139.5 MB) TX bytes:3365206 (3.3 MB)
Проверяя вывод brctl show
, я вижу следующее:
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no eth2
Теперь я запускаю систему гостя в QEmu. Если я запускаю ifconfig, я вижу следующее:
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:536 errors:1 dropped:51 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:55083 (53.7 KiB) TX bytes:2862 (2.7 KiB)
Interrupt:10 Base address:0x1020
А мост выглядит так:
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no eth2
tap0
К сожалению, с этой настройкой система гостя потеряла ограниченный “сетевой режим пользователя”, который у неё был раньше (т.е. wget и apt-get больше не работают). Единственный IP-адрес, который я вижу, — это адрес моста, так что я не уверен, как система гостя будет выглядеть в сети. Хост по-прежнему отображается по тому же IP-адресу, что и br0.
Обновление
Вот вывод команды iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Когда вы запускаете мост, участникам моста (eth2) больше не следует назначать IP-адрес. Теперь IP должен получать br0.
Пример
Это вывод из системы, использующей KVM. Она использует qemu-kvm под капотом, поэтому настройка должна быть похожа на то, что вы пытаетесь сделать.
$ ifconfig -a
br0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2929289877 errors:0 dropped:0 overruns:0 frame:0
TX packets:842023980 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1992305504701 (1.8 TiB) TX bytes:3609403664141 (3.2 TiB)
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3737819958 errors:0 dropped:168 overruns:0 frame:0
TX packets:1233468235 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2735097151685 (2.4 TiB) TX bytes:4313257594064 (3.9 TiB)
Interrupt:177
Обратите внимание, что у eth0 нет назначенного IP-адреса? А вот как выглядит моё устройство br0:
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.XXXXXXXXXXXX no vnet2
vnet1
vnet0
eth0
У меня есть 3 виртуальные машины, которые находятся поверх устройства br0, так что они могут полностью участвовать в моей сети, как истинная физическая система. Это значит, что они могут предоставлять такие услуги, как запуск Samba и т.д. Я не верю, что вы можете обслуживать Samba из-за маршрутизируемой сети.
Ответ или решение
Для успешной настройки сети и использования Samba на вашей системе QEMU с эмуляцией MIPS в Ubuntu 12.04, необходимо выполнить несколько шагов. Вы упомянули, что не можете подключиться к сети, после того как создали мост и запустили QEMU. Рассмотрим более подробно, как правильно настроить сетевой мост и обеспечить корректную работу Samba.
Шаг 1: Создание сетевого моста
-
Создайте мост
br0
:Убедитесь, что у вас есть установленный пакет
bridge-utils
:sudo apt-get install bridge-utils
Далее выполните следующие команды в терминале:
sudo brctl addbr br0 # Создаем мост sudo ip addr flush dev eth2 # Убираем IP-адрес с интерфейса eth2 (или вашего актуального интерфейса) sudo brctl addif br0 eth2 # Добавляем интерфейс eth2 в мост sudo ip link set dev br0 up # Активируем мост
-
Назначьте IP-адрес мосту:
Примените новый IP-адрес к вашему мосту:
sudo ip addr add 10.2.32.101/24 dev br0 # Пример IP-адреса, измените по необходимости
-
Запустите DHCP-сервер или настройте статику:
Если вы хотите, чтобы ваши виртуальные машины (VM) получали IP-адреса через DHCP, убедитесь, что DHCP-сервер работает в вашей сети. В противном случае вы можете назначить статический IP-адрес каждой из VM после их старта.
Шаг 2: Запуск QEMU с использованием сетевого моста
Теперь мы перейдем к запуску вашей VM с использованием настроенного моста. Используйте следующую команду для запуска QEMU:
qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda disk.img -append "root=/dev/sda1 console=ttyS0" -nographic -netdev bridge,id=hn0,br=br0 -device virtio-net-pci,netdev=hn0
Убедитесь, что используете правильные параметры для вашего виртуального сетевого устройства.
Шаг 3: Настройка Samba
На вашей гостевой системе:
-
Установите Samba:
sudo apt-get install samba
-
Настройте файл конфигурации Samba. Откройте
/etc/samba/smb.conf
и добавьте или измените следующие настройки:[qemu] path = /home/uli/samba # Проверяйте, что директория существует available = yes valid users = uli # Имя пользователя read only = no browsable = yes public = yes writable = yes
-
Создайте пользователя Samba:
sudo smbpasswd -a uli
-
Перезапустите услуги Samba:
sudo service smbd restart sudo service nmbd restart
Шаг 4: Проверка соединения
На вашем хосте:
-
Проверьте IP-адрес гостевой VM:
Внутри виртуальной машины выполните:ip addr
Убедитесь, что VM получает корректный IP-адрес из вашей сети.
-
Проверьте, доступны ли ресурсы Samba:
С хоста попробуйте подключиться к ресурсу Samba:smbclient -L //10.2.32.101 -U uli
Здесь
10.2.32.101
— это IP-адрес вашей VM.
Шаг 5: Устранение неполадок
Если после выполнения всех этих шагов возникают проблемы, проверьте следующее:
-
Убедитесь, что iptables не блокирует доступ к Samba:
sudo iptables -L
-
Проверьте логи Samba на гостевой системе (обычно в
/var/log/samba/
), чтобы выяснить, нет ли ошибок при подключении. -
Убедитесь, что мост активен и работает:
brctl show
Следуя этим шагам, вы должны установить работоспособную сетевую конфигурацию с QEMU и обеспечить доступность сервиса Samba. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.