web-dev-qa-db-ja.com

/ dev / net / tunをqemuで利用できるようにしますか?

タップデバイスを作成しました(tap0)qemuへのネットワークインターフェイスとして提供したいと思います。次のコマンドを使用してデバイスを作成し、セットアップしたネットワークブリッジに接続しました。

tunctl -t tap0
ifconfig tap0 up
brctl addif virbr0 tap0

次に この答え で提案されたコマンドを実行しました:

chgrp netdev /dev/net/tun
chmod 660 /dev/net/tun

両方のコマンドが正常に完了し、有効になったことを確認しました。

nathan@nathan-desktop:~$ stat /dev/net/tun
  File: ‘/dev/net/tun’
  Size: 0           Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 1224        Links: 1     Device type: a,c8
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (  108/  netdev)
Access: 2015-11-16 10:16:35.127338320 -0800
Modify: 2015-11-16 10:16:35.127338320 -0800
Change: 2015-11-16 10:37:18.338948110 -0800
 Birth: -

私はnetdevグループに参加していることも確認しました:

nathan@nathan-desktop:~$ groups
[...] netdev [...]

ただし、インターフェイスを使用してqemu仮想マシンを起動しようとすると、次のエラーが発生しました。

nathan@nathan-desktop:~$ qemu-system-arm [...] -net tap,ifname=tap0
qemu-system-arm: -net tap,ifname=tap0: could not configure /dev/net/tun (tap0): Operation not permitted
qemu-system-arm: -net tap,ifname=tap0: Device 'tap' could not be initialized

strace

straceからの関連する出力を以下に示します。

open("/dev/net/tun", O_RDWR)            = 7
ioctl(7, TUNGETFEATURES, 0x7ffcc532ab2c) = 0
ioctl(7, TUNSETVNETHDRSZ, 0x7ffcc532ab28) = -1 EBADFD (File descriptor in bad state)
ioctl(7, TUNSETIFF, 0x7ffcc532ab30)     = -1 EPERM (Operation not permitted)
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "could not configure /dev/net/tun"..., 64could not configure /dev/net/tun (tap0): Operation not permitted) = 64
write(2, "\n", 1
)                       = 1
close(7)                                = 0
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "Device 'tap' could not be initia"..., 37Device 'tap' could not be initialized) = 37
write(2, "\n", 1
)
8
Nathan Osman

qemuは、rootでないと失敗するいくつかのデフォルトスクリプトを実行しようとします。以下は、適切なタップデバイスに適切にアクセスできる場合に使用できるコマンドラインオプションです。

qemu-system-x86_64 ... \
    -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no

script=no,downscript=noは、その失敗を回避するために重要です。

また、タップデバイスのもう一方の端にアクセスできることを確認する必要があります(制御デバイスだけでなく/dev/net/tun)。 tunctlについてはわかりませんが、iproute2ではip tuntap add dev tap0 mode tap group netdev(またはuserなど)。

7
user3188445

最初のtunctl呼び出しでnetdevグループを指定する必要があります:

tunctl -t tap0 -g netdev

[また、何らかの理由で、/ dev/netディレクトリに実行許可(770)を与える必要があることもわかりました。これは関連がない可能性があります。]

5
loop

作業しているユーザーとのタップインターフェイスを作成します。

Sudo tunctl -p -t tap0 -u <user>

次に、Qemuを実行してみます。

4
WarriorPrince