リナックスミント 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