Linuxでは、2つのネットワーク名前空間が設定されており、ns1
2つのネットワーク名前空間を表示できますns2
。ip netns list
ネットワークデバイスをLinuxルートネームスペースからに移動してns1
から削除し、ns1
ネットワークデバイスを再度移動したいと思います。ns2
ns2
ns1
実際の結果は、eth1
Linuxルートネットワークの名前空間に戻ることです。期待どおりに動作するかどうかはわかりません。
詳細なテストシナリオは次のとおりです。
ip netns add ns1
ip netns add ns2
ip link set eth1 netns ns1
ip netns exec ns1 ip link set eth1 netns ns2
ip netns del ns2
予想される結果: eth1
なるだろうns1
実際の結果: eth1
Linuxルートネームスペース1に戻る
質問:デバイスがLinuxルートネットワーク名前空間1の代わりにns1として返されるようにこれを実装する方法はありますか?
答え1
私が知る限り、「物理的」ネットワークインタフェースがいわゆる「初期」ネットワークネームスペース以外のネットワークネームスペースに戻るように強制する方法はありません。 Patrickのコメントとは異なり、Linuxカーネルはネットワークネームスペースを次のように見なします。平らなしたがって、階層はありません(参照:ioctl_ns - Linux 名前空間 ioctl() 操作、これは明示的にのみ言及しています。PIDそしてユーザー名前空間は階層的です。
定義されたネットワーク名前空間の階層がないため(IPスタック、アドレス、およびルーティングテーブルに適用するのが難しい)、Linuxには、ネットワークインタフェースをinit(1)が実行した初期ネットワーク名前空間に戻すマスターに戻るルールがあります。あります。 / PID1がネットワークネームスペースに参加しました。
ip netns add ...
あなたがすべきことは、呼び出しを介して新しいネットワーク名前空間を作成し、それをunshare()
バインドマウントして/run/netns/ns1
浮動状態に保つことです。その後、ip nets add ...
再起動して、他のネットワーク名前空間のマウントを/run/netns/ns2
完全に関連付けられていない2つのネットワーク名前空間にバインドします。