Пытаюсь наладить виртуалку на FreeBSD 10.2
Запускаю из под непривелегированного пользователя так:qemu-system-x86_64 -net nic -net tap,ifname=tap0 &
Выдает ошибку:
qemu-system-x86_64: -net tap,ifname=tap0: could not open /dev/tap: Permission denied
Что интресно - просто так увидеть в /dev этот самый tap я не могу! ls -al /dev/ta* ничего не выдает. Только если я явным образом пишу ls -l /dev/tap я его вижу с правами 600. chmod-ом из под рута я его права меняю, но он как был crw------- таким и остается. Колупание в devfs.conf и .rules, kldunload и kldload не помогают.
В тоже время если запустить KDE из под рута, и уже в нем
qemu-system-x86_64 -net nic -net tap,ifname=tap20 &
Все запускается. Но только если в качестве ifname указать еще несуществующий номер.
Помимо этого как-то странно работает bridge: при добавлении или удалении новых интерфейсов падает связь по основной сетевухе хостовой системы. Приходится "руками" писать ifconfig re0 inet 192.168.2.145/22 (и это при том, что link UP, а адреса уже выставлены). ipfw отключен, stp тоже.Помогите разобраться - ни гугл, ни хабр, ни оффмануал мне не помогли.
стоп стоп стоп QEMU на _хосте_ freebsd?????
а мсье знает толк ...там есть пример как это сделать
> ни гугл, ни хабр, ни оффмануал мне не помогли.
учу гуглить, дорого
> https://wiki.freebsd.org/qemu
> там есть пример как это сделатьбывал и там...
даже после chmod 0660 /dev/tap0 эта зараза все равно обращается именно к /dev/tap !
вот если я делаю sysctl net.link.tap.devfs_cloning=0 так он мне вообще говорит NotFound.
Тоесть если клонирование tap-ов разрешено, система заводит этот самый "невидимый" /dev/tap с правами 0600 и с него уже создает новые tap0, tap1 и т.д.
> стоп стоп стоп QEMU на _хосте_ freebsd?????
> https://wiki.freebsd.org/qemuИ да - хостовая система FreeBSD 10.2 RELEASE ядро не пересобирал.
И да - сделал все по вашей ссылке и результат тотже: /dev/tap Permission Denied.вот мой rc.conf
root@MAXBSD:~ # cat /etc/rc.conf
hostname="MAXBSD"
sshd_enable="YES"
ntpd_enable="YES"cloned_interfaces="tap0 bridge0"
ifconfig_bridge0="addm re0 addm tap0 up"
ifconfig_re0="inet 192.168.2.145/22 up"defaultrouter="192.168.3.230"
dumpdev="AUTO"
dbus_enable="YES"
hald_enable="YES"
kdm4_enable="YES"Причем с такими настройками основная сетевуха локалку вообще не видит! Несмотря на <UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST>
в /boot/loader.conf все один-в-один как в статье
Внимательно блин читайте ту ссылку что вам дали, внимательно, Карл!У вас
-net tap,ifname=tap0надо
-net tap,name=tap0
IP настраиваем на САМОМ БРИДЖЕ мля, а не на интерфейсе который входит в бридж
вас не гуглить учить надо а ЧИТАТЬhttps://www.freebsd.org/doc/handbook/network-bridging.html
Марш зубрить хэндбук
> Внимательно блин читайте ту ссылку что вам дали, внимательно, Карл!
> У вас
> -net tap,ifname=tap0
> надо
> -net tap,name=tap0
> IP настраиваем на САМОМ БРИДЖЕ мля, а не на интерфейсе который входит
> в бриджслушайте, юноша, вас зае..ло помогать криворучкам? идите на ЛОР! там, кажется, дартаньянов больше, будете в своей компании.
> надо
> -net tap,name=tap0Вот результат:
---------------------------------------------------------------------
root@MAXBSD:~ # qemu-system-x86_64 -m 1024 -hda /home/maxa/Desktop/virtualz/winxp.qcow2 -net nic,model=rtl8139 -net tap,name=tap0 &
[1] 2183root@MAXBSD:~ #
root@MAXBSD:~ # ifconfig
{вырезал часть вывода}
tap0: flags=8902<BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:e7:14:00:00
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:15:b1:e5:41:00
nd6 options=9<PERFORMNUD,IFDISABLED>
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 4 priority 128 path cost 2000000
member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 2 priority 128 path cost 55
tap1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:d9:03:32:01
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: active
Opened by PID 2183root@MAXBSD:~ # ls -al /dev/tap0
crw-rw-rw- 1 root wheel 0x8f Oct 29 13:31 /dev/tap0ifconfig bridge0 addm tap1 up
ifconfig re0 inet 192.168.2.145/22
route add default 192.168.3.230
---------------------------------------------------------------------И раз уж второй человек тычет мне в мануалы, проведу небольшой литобзор:
Вы действительно правы насчет "name" вместо "ifname", что подтверждает официальная
wiki - http://wiki.qemu.org/download/qemu-doc.html
Там написано так:-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]
...If name is not provided, the OS automatically provides one...Хотя в ряде других документов, например https://wiki.archlinux.org/index.php/QEMU
в одних местах пишут так:
-net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no
в других вот так:
qemu-system-i386 -net nic,model=virtio -net tap,if=tap0,script=noТоесть есть определенная неоднозначность.
> вас не гуглить учить надо а ЧИТАТЬ
> https://www.freebsd.org/doc/handbook/network-bridging.html
> Марш зубрить хэндбукБриджинг от FreeBSD я тоже читал и пробовал делать по нему. Проблему это не решает - при запуске виртуалки происходит обращение не к указанному интерфейсу, а к /dev/tap , права на который я поменять не могу даже рутом.
>[оверквотинг удален]
> kldunload и kldload не помогают.
> В тоже время если запустить KDE из под рута, и уже в
> нем
> qemu-system-x86_64 -net nic -net tap,ifname=tap20 &
> Все запускается. Но только если в качестве ifname указать еще несуществующий номер.
> Помимо этого как-то странно работает bridge: при добавлении или удалении новых интерфейсов
> падает связь по основной сетевухе хостовой системы. Приходится "руками" писать ifconfig
> re0 inet 192.168.2.145/22 (и это при том, что link UP, а
> адреса уже выставлены). ipfw отключен, stp тоже.
> Помогите разобраться - ни гугл, ни хабр, ни оффмануал мне не помогли.в linux я сначала делал tap интерфейс командой tunctl от рута потом назначал его qemu, при этом что-то помню еще о парамеире script=no
> в linux я сначала делал tap интерфейс командой tunctl от рута потом
> назначал его qemu, при этом что-то помню еще о парамеире script=noTunctl во FreeBSD я к сожалению не нашел, да и к tap он помоему имеет мало отношения. А под линуксами у меня виртуалка эта и другие работали - в связке kvm- tun- openvpn. Фишка в том, что мне надо чтобы она переехала на мой рабочий комп с FreeBSD
>> в linux я сначала делал tap интерфейс командой tunctl от рута потом
>> назначал его qemu, при этом что-то помню еще о парамеире script=no
> Tunctl во FreeBSD я к сожалению не нашел, да и к tap
> он помоему имеет мало отношения. А под линуксами у меня виртуалкаИмеет прямое отношение. Может вам поможет эта ссылка https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4. Во FreeBSD я не специалист, но там тоже должны быть инструменты создания tap интерфейсов вручную.
> эта и другие работали - в связке kvm- tun- openvpn.
> Фишка в том, что мне надо чтобы она переехала на мой
> рабочий комп с FreeBSD
> Имеет прямое отношение. Может вам поможет эта ссылка https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4.
> Во FreeBSD я не специалист, но там тоже должны быть инструменты
> создания tap интерфейсов вручную.Ман я этот уже читал - и, если я правильно понял, о tun-интерфейсе в нем говорится только то, что он предоставляет "similar" тоесть похожую функциональность. О том что tap и tun связаны в этом мануале не сказано. А вручную я действительно могу создать новый tap интерфейс " ifconfig tap1 create", причем это отрабатывает и под рутом и под пользователем - вот только на созданный тнтерфейс не желает подключать гостевую сетевуху qemu!
>> Имеет прямое отношение. Может вам поможет эта ссылка https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4.
>> Во FreeBSD я не специалист, но там тоже должны быть инструменты
>> создания tap интерфейсов вручную.
> Ман я этот уже читал - и, если я правильно понял, о
> tun-интерфейсе в нем говорится только то, что он предоставляет "similar" тоесть
> похожую функциональность. О том что tap и tun связаны в этом
> мануале не сказано.В linux связаны - это один модуль ядра tun, и утилитой tunctl можно делать и tap и tun интерфейсы.
А вручную я действительно могу создать новый tap
> интерфейс " ifconfig tap1 create", причем это отрабатывает и под рутом
> и под пользователем - вот только на созданный тнтерфейс не желает
> подключать гостевую сетевуху qemu!Под пользователем это как раз то что нужно. Qemu может подключаться на уже созданный интерфейс. Какую ошибку она пишет? Попробуйте опции net nic -net tap,ifname=tap0,script=no
> В linux связаны - это один модуль ядра tun, и утилитой tunctl
> можно делать и tap и tun интерфейсы.За линукс верю, а вот за BSD не разделю вашей уверенности. Для ТАП вот пришлось грузить if_tap.ko - полагаю для ТУН-а придется делать тоже самое.
> Под пользователем это как раз то что нужно. Qemu может подключаться на
> уже созданный интерфейс. Какую ошибку она пишет? Попробуйте опции net nic
> -net tap,ifname=tap0,script=noВот я и не понимаю - в офмануалах, на опеннете, ливжорнале говорят, что может, а я вижу, что неможет! Еще раз: у меня эмулятор можно заставить подключить гостевую сетевуху только к еще не существующему ТАПу и только под рутом!
>[оверквотинг удален]
> За линукс верю, а вот за BSD не разделю вашей уверенности. Для
> ТАП вот пришлось грузить if_tap.ko - полагаю для ТУН-а придется делать
> тоже самое.
>> Под пользователем это как раз то что нужно. Qemu может подключаться на
>> уже созданный интерфейс. Какую ошибку она пишет? Попробуйте опции net nic
>> -net tap,ifname=tap0,script=no
> Вот я и не понимаю - в офмануалах, на опеннете, ливжорнале говорят,
> что может, а я вижу, что неможет! Еще раз: у меня
> эмулятор можно заставить подключить гостевую сетевуху только к еще не существующему
> ТАПу и только под рутом!Покажите команду и сообщение об ошибке, когда запускаете под пользователем.
> Покажите команду и сообщение об ошибке, когда запускаете под пользователем.Вот собственно по вашей просьбе:
------------------------------------------
maxa@MAXBSD:~ % ifconfig tap2 create maxa@MAXBSD:~ % ifconfig tap2
tap2: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:7f:f4:9f:02
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
maxa@MAXBSD:~ % qemu-system-x86_64: -net tap,name=/dev/tap2: could not open /dev/tap: Permission denied[1] Exit 1 qemu-system-x86_64 -m 1024 -hda /home/maxa/Desktop/virtualz/winxp.qcow2 -net nic,model=rtl8139 -net tap,name=/dev/tap2
maxa@MAXBSD:~ % ifconfig
vr0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82808<VLAN_MTU,WOL_UCAST,WOL_MAGIC,LINKSTATE>
ether 00:26:5a:13:42:1b
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
re0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=82099<RXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether bc:ae:c5:34:b8:e1
inet 192.168.2.145 netmask 0xfffffc00 broadcast 192.168.3.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
tap0: flags=8903<UP,BROADCAST,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:39:15:00:00
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
ether 02:15:b1:e5:41:00
nd6 options=9<PERFORMNUD,IFDISABLED>
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap1 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 6 priority 128 path cost 2000000
member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 4 priority 128 path cost 2000000
member: re0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
ifmaxaddr 0 port 2 priority 128 path cost 55
tap1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:d9:ed:02:01
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: active
Opened by PID 1640
tap2: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:7f:f4:9f:02
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
tap3: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=80000<LINKSTATE>
ether 00:bd:79:ae:a0:03
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet autoselect
status: no carrier
maxa@MAXBSD:~ %
------------------------------------------Обратите внимание на вывод ifconfig-а до и после попытки запуска виртуалки:
- до запуска я руками создал tap2 - ошибок нет
- ifconfig созданый интерфейс создал - все вроде хорошо
- qemu вместо указанного tap2 ругается на /dev/tap
- ifconfig видит ЕЩЕ один tap (третий) видимо уже созданный эмуляторомя вот думаю - может попробовать поколдовать с опцией group/-group в ifconfig?
>[оверквотинг удален]
> media: Ethernet autoselect
> status: no carrier
> maxa@MAXBSD:~ %
> ------------------------------------------
> Обратите внимание на вывод ifconfig-а до и после попытки запуска виртуалки:
> - до запуска я руками создал tap2 - ошибок нет
> - ifconfig созданый интерфейс создал - все вроде хорошо
> - qemu вместо указанного tap2 ругается на /dev/tap
> - ifconfig видит ЕЩЕ один tap (третий) видимо уже созданный эмулятором
> я вот думаю - может попробовать поколдовать с опцией group/-group в ifconfig?Я бы уже бросил эту затею, сумма потраченного времени не стоит того. Я бы запускал sudo qemu и не парился. Я думаю тут проблема сборки qemu под FreeBSD - не проверяет есть ли уже интерфейс tap и всегда пытается создать следующий по счету. В Linux qemu ведет себя немного не так.
>[оверквотинг удален]
> media: Ethernet autoselect
> status: no carrier
> maxa@MAXBSD:~ %
> ------------------------------------------
> Обратите внимание на вывод ifconfig-а до и после попытки запуска виртуалки:
> - до запуска я руками создал tap2 - ошибок нет
> - ifconfig созданый интерфейс создал - все вроде хорошо
> - qemu вместо указанного tap2 ругается на /dev/tap
> - ifconfig видит ЕЩЕ один tap (третий) видимо уже созданный эмулятором
> я вот думаю - может попробовать поколдовать с опцией group/-group в ifconfig?Последняя мысль
Поскольку ifconfig tap2 уже создан попробуйте
ifname=tap2
а не
name=/dev/tap2
Вобщем-то "костыльно" я проблему уже решил - как раз запуском из под рута с использованием несуществующего TAP-а. Виртуака запущена, работает и соединена с локалкой. Однако для этого пришлось пойти на серьезное спижение безопасности: разрешить запуск KDE и qemu под рутом. Видимо придется действительно заняться правкой исходников и перекомпиляцией.А разные названия я уже пробовал - net-tap-name, net-tap-ifname, net-tap-if. Рузультат один и тот же. Я даже попробовал "-net tap,fd=/dev/tap2" тоесь указать дескриптор - не работает.
Всем спасибо - вижу у проблемы вменяемого решения нет.
> Вобщем-то "костыльно" я проблему уже решил - как раз запуском из под
> рута с использованием несуществующего TAP-а. Виртуака запущена, работает и соединена с
> локалкой. Однако для этого пришлось пойти на серьезное спижение безопасности: разрешить
> запуск KDE и qemu под рутом. Видимо придется действительно заняться правкой
> исходников и перекомпиляцией.
> А разные названия я уже пробовал - net-tap-name, net-tap-ifname, net-tap-if. Рузультат
> один и тот же. Я даже попробовал "-net tap,fd=/dev/tap2" тоесь указать
> дескриптор - не работает.
> Всем спасибо - вижу у проблемы вменяемого решения нет.Вообще-то есть решение и очень простое, в sysctl прописываешь
net.link.tap.up_on_open=1
net.link.tap.user_open=1