推測せずにmacvtapに関連付けられている/ dev / tapXを取得する

推測せずにmacvtapに関連付けられている/ dev / tapXを取得する

次のようなこれ設定ガイドは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/tapXmacvtap0

マイコンピュータには、クリックデバイスをランダムに設定する複数のサービスがあります。私の具体的な結果が何であるかを推測することはできません。

次のコマンドを使用して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からインターフェース名デバイスノードエントリ名を見つけます。

    1. /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
      
    2. 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同じ名前のファイルがすでに存在していてmacvtap02番目のデバイスエントリが生成されていないためです。また、ネットワークデバイスを正しく処理するために再インストールした/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

    3. 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
    

関連情報