LinuxでRTNETLINKのみを使用して、ネットワークインタフェースが「物理的」なのか「仮想」なのかを検出しますか?

LinuxでRTNETLINKのみを使用して、ネットワークインタフェースが「物理的」なのか「仮想」なのかを検出しますか?

ネットワークインタフェースが「物理的」なのか「仮想」なのかを検出したい。ここで、「物理的」とは、ハードウェアがハイパーバイザーによって仮想化されていても、インターフェースにハードウェアが接続されていることを意味します。 「仮想」とは、bridge、veth、macvlanなどのLinuxカーネル要素の1つであることを意味します。

/sys/class/net/[nif]/...私はデバイスリンクを追跡し、デバイスパスに「仮想」サブディレクトリが含まれているかどうかによって、(仮想)物理的および「実際の」(sic!)仮想ネットワークインターフェイスを区別できることを知っています。ただし、ネットワークネームスペースを処理するときにsysfs正しいエントリを表示するには、適切な再インストールが必要です/sys/class/net/...。したがって、RTNETLINKデータにのみ依存する簡単なアプローチがより適切である可能性があります。

RTNETLINKを使用して利用可能なネットワークインタフェースを検索するときに確認せずに知ることができる属性/属性はありますか/sys/class/net/[nif]

答え1

唯一の方法は、からIFLA_INFO_KIND返されたプロパティを見ているようですRTM_GETLINK。これはlo、ループバックデバイスだけでなく物理デバイスにもないオプションの属性です。

存在する場合などの文字列を含みますvethbridgeこれをよく知られている仮想リンクタイプ(参考文献を参照)のリストと比較し、仮想ネットワークインターフェイスを識別し、ip link help他のすべてのネットワークインターフェイスは「物理ネットワークインターフェイス」の範囲内にあります。

完璧ではありませんが、カウンセリングなしで動作します/sys/class/net/[IFNAME]。常に正しく存在するわけではなく、sysfs(再)インストールが必要です。ネットワークインターフェースがveth使用中であることを確認してください/sys/class/net

関連情報