以前仮想であった veth インターフェースを作成しようとすると、RTNETLINK 「ファイルが存在します」エラーが発生する

以前仮想であった veth インターフェースを作成しようとすると、RTNETLINK 「ファイルが存在します」エラーが発生する

Linux Mint 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

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

ピアインターフェイスの名前が指定されていない場合は、できるだけ小さい整数が追加され、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
    
  • veth0または、デフォルトの命名スキーム(peer asとmain as veth1)に従ってカーネルが生成したデフォルトの順序ではない場合でも、2つの名前を指定します。

    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
    

おすすめ記事