次のようなこれ設定ガイドはmacvtap
素晴らしいです。
ガイドから抜粋した内容は次のとおりです。
# ip link add link eth1 name macvtap0 type macvtap
# ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
# ip link show macvtap0
その後、ガイドでは次のことができると説明します。
#qemu-system-x86_64 -net nic,model=virtio,addr=1a:46:0b:ca:bc:7b -net tap,fd=3 3<>/dev/tap11
macvtap
最終結果がある場合、上記のインターフェイスに実際に割り当てられたインターフェイスをどのように確認できますか/dev/tap11
?/dev/tapX
macvtap0
マイコンピュータには、クリックデバイスをランダムに設定する複数のサービスがあります。私の具体的な結果が何であるかを推測することはできません。
次のコマンドを使用してqemuマシンを起動したいと思います。
-netdev tap,ifname="macvtap0",id=network0,script=no,downscript=no \
-device i82559b,netdev=network0,mac=${MAC}
さて、macvtap0
私が作ったばかりのデバイスはどこにありますか?
しかし、これは私に次のことを与えます:
qemu-system-x86_64: could not configure /dev/net/tun (macvtap0): Invalid argument
この記事の概要:タブインターフェイスとそのファイル記述子間の接続を見つけるには?- 彼らはPIDにアクセスし、関連するファイル記述子を確認することによってこれを行う方法を説明します。私にとって問題は、qemuがデバイスを設定している間にデバイスを設定しなかったことです。そしてこれに関連するPIDはありません。
/dev
それでは、新しく作成されたインターフェースに関連するファイルハンドルをどのように取得できますかmacvtap
?
編集する:数日間この問題を解決しようとしましたが、確認するのを忘れて、デバイスがあることに気づき/sys/class/net/macvtap0/
ました/tap2
。明らかに一致する名前を見つけるには、すべての項目を繰り返す必要がありますregex(tap[0-9]+)
。これはうまくいきますが、これが最善の/正しい方法であるかどうかはわかりません。
答え1
デバイス名は作られたに基づいてインタフェースインデックス:
snprintf(tap_name, IFNAMSIZ, "tap%d", dev->ifindex);
[...]
devt = MKDEV(MAJOR(macvtap_major), vlantap->tap.minor); classdev = device_create(&macvtap_class, &dev->dev, devt, dev, tap_name);
OPのip link show macvtap0
回答がある場合は、次のように終了する可能性が高くなります。
11: macvtap0@eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...]
この特定の属性(単語)に依存したくない場合macvtapツリー全体には存在しませんlinux/Documentation/
)信頼できる/sys
(公式に文書化された項目もないようです)macvtap):
この情報はmacvtap/*
サブディレクトリにあります。これはtap11
単一のアイテムへのシンボリックリンクなので、macvtap/tap11
現在の場所では実用的ではないので無視する必要があります(ただし、指すディレクトリではありません)。
Webからインターフェース名デバイスノードエントリ名を見つけます。
/sys/class/net/macvtap0/macvtap/*
アイテムがあります。ディレクトリであるデバイス名をタップします。$ printf '/dev/%s\n' "$(basename /sys/class/net/macvtap0/macvtap/*)" /dev/tap11
intf_to_devtap
次の関数を使用できます。intf_to_devtap () { [ -e "/sys/class/net/$1/macvtap" ] || return 1 printf '/dev/%s\n' "$(basename /sys/class/net/$1/macvtap/*)" }
OPの状況:
$ intf_to_devtap macvtap0 /dev/tap11
dev
アイテムは次のとおりです一次、二次:$ cat /sys/class/net/macvtap0/macvtap/*/dev 242:1
この属性(および以下の同等の属性
uevent
)は、次の場合にのみ一意であることを保証します。macvtapそれぞれ同じインターフェイスインデックスを持つ複数のネットワークネームスペースで作成され、デバイスノードを形成します。名前衝突。衝突の例(ない場合macvtapデバイスが以前に作成されました):# ip netns add collision1; ip netns add collision2 # ip -n collision1 link add type dummy; ip -n collision2 link add type dummy # ip -n collision1 link add link dummy0 type macvtap # ls -l /dev/tap* crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3 # ip -n collision2 link add link dummy0 type macvtap # ls -l /dev/tap* crw-------. 1 root root 242, 1 Apr 19 21:24 /dev/tap3
2番目のクリック項目は表示されません。これは、2番目のネットワーク名前空間もインデックス3(
lo
= 1、= 2、= 3)のインターフェイスを作成するときに競合が発生し、dummy0
同じ名前のファイルがすでに存在していてmacvtap0
2番目のデバイスエントリが生成されていないためです。また、ネットワークデバイスを正しく処理するために再インストールした/dev
ため、2番目のタブデバイスが「マッピング」されていなくても、実際に2つのタブデバイスがあることを確認できます。ip netns
/sys
# ip netns exec collision1 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev' 242:1 # ip netns exec collision2 sh -c 'cat /sys/class/net/macvtap0/macvtap/*/dev' 242:2
だから人々はまだ2番目のものを使用することができますmacvtapインターフェイスバックエンドを「マッピング」して
/sys
から、情報の半分が一致しなくてもデバイスを使用します。たとえば、次のようになります。# mknod /dev/tap3b c 242 2
またはなどのより詳細な名前を使用してください
/dev/tap-VM1-intfA
。uevent
アイテム、専攻説明:不専攻と名前:$ cat /sys/class/net/macvtap0/macvtap/*/uevent MAJOR=242 MINOR=1 DEVNAME=tap11
~から開発者インターフェース名を入力してください:
そして
/dev/tap11
:/dev/tap11
->/sys/class/macvtap/tap11
->/sys/devices/virtual/net/macvtap0/macvtap/tap11
。 beforeは/sys/class/net/macvtap0
実際にはシンボリックリンクです/sys/devices/virtual/net/macvtap0
。それでも最後のディレクトリのエントリはインターフェイスディレクトリへのシンボリックリンクなので、->
device
で終わります。/sys/class/macvtap/tap11/device
/sys/devices/virtual/net/macvtap0
devtap_to_intf
次の関数を使用できます。devtap_to_intf () { [ -c "$1" ] || [ -c "/dev/$1" ] || return 1 local path="$(readlink -e "/sys/class/macvtap/${1#/dev/}/device")" printf '%s\n' "${path#/sys/devices/virtual/net/}" }
OPを例にしてみましょう。
$ devtap_to_intf /dev/tap11 macvtap0