以前はダミーだった veth インターフェイスを作成しようとすると、RTNETLINK に「ファイルが存在します」というエラーが発生する

以前はダミーだった veth インターフェイスを作成しようとすると、RTNETLINK に「ファイルが存在します」というエラーが発生する

リナックスミント 20.2

このコマンドを使用して、veth0 というダミーのイーサネット インターフェイスを作成しました。

sudo ip link add veth0 type dummy

完了したら、次のようにして削除しました。

sudo ip link delete veth0 type dummy

インターフェイスは確実に削除されました。再起動後、次のコマンドで仮想イーサネット タイプのインターフェイスを作成しようとしました。

sudo ip link add veth0 type veth

しかし、これを実行すると、「ファイルが存在します」というエラーが発生します。

最初のコマンドでダミー タイプのインターフェイスを再作成することはできます。インターフェイス名を参照して、仮想イーサネット タイプとして再利用されないようにするには、どこでインターフェイス名を参照すればよいのでしょうか。

調査の結果、類似の投稿が多数見つかりましたが、それらはすべて、物理インターフェースが ifup コマンドを使用できないという問題に言及しています。修正方法は、インターフェースのアドレスをフラッシュし、/etc/network/interfaces に 1 つ以上のゲートウェイがリストされていないことを確認することです。どちらの修正もここでは適用されません。以前のタイプが削除された後、仮想インターフェース名が別のインターフェース タイプで再利用できないという情報は見つかりませんでした。

別のインターフェース名を使用すればよいことはわかっていますが、この構成の問題を解決し、その原因を理解したいと思います。

答え1

この問題は再現可能ですが、カーネルによるデフォルトの選択に干渉する名前を選択したために発生します。

ピアインターフェースの名前を指定しない場合は、最小の整数がvethピア名に追加されます。初めこれは、メイン インターフェイス自体が作成される前に最初に発生します。これは、競合しない名前を指定した場合に確認できます。

# ip link add name myveth type veth
# ip link show type veth
17: veth0@myveth: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
18: myveth@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8a:c3:1d:82:93:a6 brd ff:ff:ff:ff:ff:ff

ピア名は、通常の方法に従って選択されます。つまり、タイプとそれに続く使用可能な整数veth+ 0:でインターフェイスを作成しますveth0。インデックスが小さいほど (ここでは 17 対 18)、最初に作成されることを意味します。

ここで、カーネルが最初に自動的に作成するのと同じ名前を指定すると、衝突が発生し、指定されたインターフェースは作成されず、ピアインターフェースが削除されます。 以外のトレースはありませんRTNETLINK answers: File exists。これは、別のシェルで実行すると明確に確認できますip link monitor

シェル1:

$ ip link monitor

シェル2:

# ip link add name veth0 type veth
RTNETLINK answers: File exists

シェル1をもう一度:

23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff
Deleted 23: veth0@NONE: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 72:2d:b8:9f:90:6c brd ff:ff:ff:ff:ff:ff

ここで@NONEは、ピア リンク インデックスがまだ関連付けられていないことを意味します。vethインターフェイスにはピア リンク インデックス (仮想イーサネット ワイヤの反対側) があります。ピア リンク インデックスは、インデックス 24 で作成された次のインターフェイスに解決されるはずですが、このインターフェイスはveth0既に存在しているため (それが独自の作成によるものであっても)、その名前で作成できませんでした。これにより、操作全体がキャンセルされ、エフェメラルが削除されveth0、エラー メッセージが として返されますFile exists。それ以外の場合は、問題の痕跡は残りません。

結論:衝突を避けるために、

  • 名前を指定せず、カーネルに選択させます。

    ip link add type veth
    

    取得:

    24: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff
    25: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default 
        link/ether 86:70:54:05:0f:75 brd ff:ff:ff:ff:ff:ff
    
  • デフォルトの命名規則に従わない名前を指定します

    ip link add name myveth type veth
    
  • または、両方の名前を指定します。デフォルトの順序ではない場合でも、カーネルによってデフォルトの命名スキーム (peer はveth0、main はveth1) で作成されます。

    ip link add name veth0 type veth peer name veth1
    
  • vethインターフェースはほとんどの場合 (常にではありませんが) ネットワーク名前空間環境の外では役に立たないことを忘れないでください。 必要に応じて、ピア インターフェースを他の場所に直接追加できます。

    ip netns add othernamespace
    ip link add name veth0 type veth peer netns othernamespace
    

    ここでもピアはveth0衝突なしに作成されます。

    # ip link show type veth
    27: veth0@if2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether 2a:93:f8:8e:bc:b6 brd ff:ff:ff:ff:ff:ff link-netns othernamespace
    # ip -n othernamespace link show type veth
    2: veth0@if27: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
        link/ether fa:cb:bf:23:fc:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    

関連情報