unshare
自分だけを含む新しいネットワーク名前空間を作成するプロセス呼び出しがあります。 start bashを呼び出すと、execve
ipコマンドはデバイスが1つしかないことを示しますlo
。ユーザーネームスペースも作成し、そのネームスペース内でプロセスをルートとしてスケジュールすると、そのip
コマンドを使用してデバイスを起動して機能します。
このコマンドを使用して、この名前空間にip
デバイスを作成することもできます。ただし、期待どおりにveth
ルートレベルの名前空間には表示されず、ip netns list
新しいデバイスもルートレベルの名前空間には表示されません。ルートレベルの名前空間のデバイスをプロセスの名前空間の新しいデバイスに接続するにはveth
?このコマンドは、名前空間にコマンドによって割り当てられた名前を持つように要求するようです。私のコマンドは名前空間を作成するために使用していなかったので必要ありません。veth
veth
ip
ip
ip netns add
おそらく、netlinkデバイスを使用して設定するプログラムを直接書くことでこれを行うことができます。しかし、私は本当にそうしたくありません。コマンドラインでこれを行う方法はありますか?
Dockerコンテナにも独自のネットワーク名前空間があり、その名前空間にも名前がないため、これを行う方法が必要です。ただし、内部には外部機器veth
に接続する機器があります。veth
私の目標は、理想的には、コンテナの外部でルートになる必要なしにプロセス分離コンテキストを動的に生成することです。これを行うには、PIDネームスペース、UIDネームスペース、ネットワークネームスペース、IPCネームスペース、およびマウントネームスペースを作成します。 cgroup名前空間を作成することもできますが、これは新しいものであり、現在サポートされているSLES、RHEL、およびUbuntu LTSのバージョンで実行できる必要があります。
私はこの名前空間を一度に1つずつ作業してきましたが、現在ユーザー、PID、およびマウント名前空間がうまく機能しています。
必要に応じてマウントできますが、/proc/pid/ns/net
名前空間の外側のルートになる必要がないように、ユーザーの名前空間内でマウントすることをお勧めします。ほとんどの場合、名前空間のすべてのプロセスが消えると、すべてが消えると予想されます。タスクが完了したら、ファイルシステムで複数の状態をクリーンアップするのは理想的ではありません。コンテナが最初に割り当てられたときに一時的に作成し、すぐに削除することは、コンテナが終了したときにクリーンアップするよりもはるかに優れています。
いいえ、使用できません。ドッカー、長沙、ククト、または他の既存のソリューションを使用した湿地標準システムユーティリティ(例:アイピー)、次のシステムライブラリglibc、Linuxシステムコール。
ベストアンサー1
ip link
ネットワーク名前空間名に加えて使用できる名前空間オプションがあります。PID参照されるプロセスの名前空間です。もしPID名前空間プロセス間で共有されるため、デバイスを任意の方向に移動できます。これがおそらく最も簡単な方法です。~へ、考えるとPID 1存在する「外部」。別にPID名前空間外部(PID)名前空間から内部名前空間に移動する必要があります。
たとえば、ネットワーク名前空間内で次のように作成できます。veth デバイスペア到着PID 1名前空間:
ip link add veth0 type veth peer name veth0 netns 1
Linuxでネームスペースがどのように機能するか
各プロセスには、その名前空間の参照ファイルがあります/proc/<pid>/ns/
。また、このファイルはip netns
次の/run/netns/
ファイルと関連があります。setns
システムコールは、実行中のスレッドの名前空間を、このファイルが指す名前空間に変更します。
シェルでは、次を使用して別の名前空間を入力できます。nsenter
プログラムは引数に名前空間ファイル(パス)を提供します。
Linux 名前空間の良い概要については、以下を参照してください。実行中の名前空間LWN.netの記事シリーズ。
名前空間の設定
複数の名前空間を設定する場合(マウント、pid、ユーザー、など)、変更前にネットワークネームスペースを設定してください。山そしてPID名前空間。共有していない場合山またはPID名前空間の場合、外部ネットワーク名前空間を参照するファイルが表示されないため、外部ネットワーク名前空間を指す方法はありません。
コマンドラインユーティリティが提供するよりも柔軟性が必要な場合は、システムコールを使用してプログラムから直接名前空間を管理する必要があります。ドキュメントについては、関連するマニュアルページを参照してください。man 2 setns
、man 2 unshare
そしてman 7 namespaces
。