URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID15
Нить номер: 4277
[ Назад ]

Исходное сообщение
"Freebsd qemu networking"

Отправлено eviljester , 28-Окт-15 17:25 
Пытаюсь наладить виртуалку на 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 тоже.

Помогите разобраться - ни гугл, ни хабр, ни оффмануал мне не помогли.


Содержание

Сообщения в этом обсуждении
"Freebsd qemu networking"
Отправлено omnomnim , 28-Окт-15 17:43 
стоп стоп стоп QEMU на _хосте_ freebsd?????
а мсье знает толк ...

https://wiki.freebsd.org/qemu

там есть пример как это сделать

> ни гугл, ни хабр, ни оффмануал мне не помогли.

учу гуглить, дорого


"Freebsd qemu networking"
Отправлено eviljester , 28-Окт-15 17:54 
> 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 и т.д.


"Freebsd qemu networking"
Отправлено eviljester , 28-Окт-15 18:22 
> стоп стоп стоп 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 все один-в-один как в статье



"Freebsd qemu networking"
Отправлено asavah , 28-Окт-15 20:35 
Внимательно блин читайте ту ссылку что вам дали, внимательно, Карл!

У вас
-net tap,ifname=tap0

надо
-net tap,name=tap0


IP настраиваем на САМОМ БРИДЖЕ мля, а не на интерфейсе который входит в бридж
вас не гуглить учить надо а ЧИТАТЬ

https://www.freebsd.org/doc/handbook/network-bridging.html

Марш зубрить хэндбук


"Freebsd qemu networking"
Отправлено Аноним , 28-Окт-15 22:38 
> Внимательно блин читайте ту ссылку что вам дали, внимательно, Карл!
> У вас
> -net tap,ifname=tap0
> надо
> -net tap,name=tap0
> IP настраиваем на САМОМ БРИДЖЕ мля, а не на интерфейсе который входит
> в бридж

слушайте, юноша, вас зае..ло помогать криворучкам? идите на ЛОР! там, кажется, дартаньянов больше, будете в своей компании.


"Freebsd qemu networking"
Отправлено eviljester , 29-Окт-15 11:25 
> надо
> -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] 2183

root@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 2183

root@MAXBSD:~ # ls -al /dev/tap0
crw-rw-rw-  1 root  wheel  0x8f Oct 29 13:31 /dev/tap0

ifconfig 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 , права на который я поменять не могу даже рутом.


"Freebsd qemu networking"
Отправлено Павел Самсонов , 29-Окт-15 19:02 
>[оверквотинг удален]
> 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


"Freebsd qemu networking"
Отправлено eviljester , 29-Окт-15 19:27 

> в linux я сначала делал tap интерфейс командой tunctl от рута потом
> назначал его qemu, при этом что-то помню еще о парамеире script=no

Tunctl во FreeBSD я к сожалению не нашел, да и к tap он помоему имеет мало отношения. А под линуксами у меня виртуалка эта и другие работали -  в связке kvm- tun- openvpn. Фишка в том, что мне надо чтобы она переехала на мой рабочий комп с FreeBSD


"Freebsd qemu networking"
Отправлено Павел Самсонов , 29-Окт-15 19:42 
>> в 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


"Freebsd qemu networking"
Отправлено eviljester , 29-Окт-15 20:05 

> Имеет прямое отношение. Может вам поможет эта ссылка https://www.freebsd.org/cgi/man.cgi?query=tap&sektion=4.
> Во FreeBSD я не специалист, но там тоже должны быть инструменты
> создания tap интерфейсов вручную.

Ман я этот уже читал - и, если я правильно понял, о tun-интерфейсе в нем говорится только то, что он предоставляет "similar" тоесть похожую функциональность. О том что tap и tun связаны в этом мануале не сказано. А вручную я действительно могу создать новый tap интерфейс " ifconfig tap1 create", причем это отрабатывает и под рутом и под пользователем - вот только на созданный тнтерфейс не желает подключать гостевую сетевуху qemu!


"Freebsd qemu networking"
Отправлено Павел Самсонов , 29-Окт-15 20:24 
>> Имеет прямое отношение. Может вам поможет эта ссылка 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



"Freebsd qemu networking"
Отправлено eviljester , 29-Окт-15 20:51 

> В linux связаны - это один модуль ядра tun, и утилитой tunctl
> можно делать и tap и tun интерфейсы.

За линукс верю, а вот за BSD не разделю вашей уверенности. Для ТАП вот пришлось грузить if_tap.ko - полагаю для ТУН-а придется делать тоже самое.

> Под пользователем это как раз то что нужно. Qemu может подключаться на
> уже созданный интерфейс. Какую ошибку она пишет? Попробуйте опции net nic
> -net tap,ifname=tap0,script=no

Вот я и не понимаю - в офмануалах, на опеннете, ливжорнале говорят, что может, а я вижу, что неможет! Еще раз: у меня эмулятор можно заставить подключить гостевую сетевуху только к еще не существующему ТАПу и только под рутом!


"Freebsd qemu networking"
Отправлено Павел Самсонов , 30-Окт-15 09:42 
>[оверквотинг удален]
> За линукс верю, а вот за BSD не разделю вашей уверенности. Для
> ТАП вот пришлось грузить if_tap.ko - полагаю для ТУН-а придется делать
> тоже самое.
>> Под пользователем это как раз то что нужно. Qemu может подключаться на
>> уже созданный интерфейс. Какую ошибку она пишет? Попробуйте опции net nic
>> -net tap,ifname=tap0,script=no
> Вот я и не понимаю - в офмануалах, на опеннете, ливжорнале говорят,
> что может, а я вижу, что неможет! Еще раз: у меня
> эмулятор можно заставить подключить гостевую сетевуху только к еще не существующему
> ТАПу и только под рутом!

Покажите команду и сообщение об ошибке, когда запускаете под пользователем.


"Freebsd qemu networking"
Отправлено eviljester , 30-Окт-15 20:37 

> Покажите команду и сообщение об ошибке, когда запускаете под пользователем.

Вот собственно по вашей просьбе:
------------------------------------------
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?


"Freebsd qemu networking"
Отправлено Павел Самсонов , 31-Окт-15 10:51 
>[оверквотинг удален]
>  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 ведет себя немного не так.


"Freebsd qemu networking"
Отправлено Павел Самсонов , 31-Окт-15 11:30 
>[оверквотинг удален]
>  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



"Freebsd qemu networking"
Отправлено eviljester , 31-Окт-15 12:42 
Вобщем-то "костыльно" я проблему уже решил - как раз запуском из под рута с использованием несуществующего TAP-а. Виртуака запущена, работает и соединена с локалкой. Однако для этого пришлось пойти на серьезное спижение безопасности: разрешить запуск KDE и qemu под рутом. Видимо придется действительно заняться правкой исходников и перекомпиляцией.

А разные названия я уже пробовал - net-tap-name, net-tap-ifname, net-tap-if. Рузультат один и тот же. Я даже попробовал "-net tap,fd=/dev/tap2" тоесь указать дескриптор - не работает.

Всем спасибо - вижу у проблемы вменяемого решения нет.



"Freebsd qemu networking"
Отправлено foxiys , 26-Фев-16 13:07 
> Вобщем-то "костыльно" я проблему уже решил - как раз запуском из под
> рута с использованием несуществующего 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