長すぎます。Linuxでは特に。フラグによって実行時に生成された名前空間が使用されたときに表示されないようnetwork namespaces
です(ホストまたは生成された名前空間から)。実際にはLinuxネームスペースを処理または処理しません(私の考えは次のようになります:-n
systemd-nspwawn
ip netns list
systemd-nspawn
ip netns
https://lwn.net/Articles/531114/#series_index)?
より長い話:
次のコマンドを使用して、Arch Linux内でArch Linuxの「軽量コンテナ」を実行します。
systemd-nspawn -nbUD /mntpointArchLinuxSysFs
データ/mntpointArchLinuxSysFs
が起動し、正常に「実行/起動」されます。男性systemd-nspawn-n
オプションフラグが何を意味するか教えてください。
-n
、--network-veth
veth
ホストとコンテナの間に仮想イーサネットリンク( "")を作成します。イーサネットリンクのホスト側は、プレフィックスが--machine=
""であるコンテナ名(で指定)に沿って名前付きネットワークインターフェイスとして使用されますve-
。イーサネットリンクのコンテナ側名は "host0
" で指定されます。この--network-veth
オプションはを意味します--private-network
。
暗黙--private-network
の説明は次のとおりです。
--private-network
Disconnect networking of the container from the host. This makes all network interfaces unavailable in the container, with the
ループバックデバイスと
--network-interface=
指定および設定されたデバイスは例外です--network-veth
。このオプションを指定すると、CAP_NET_ADMIN
コンテナが保持する機能セットにその機能が追加されます。後者はを使用して無効にできます--drop-capability=
。このオプションが指定されていない場合(または下記のオプションのいずれかが暗示している場合)、コンテナにはホストネットワークへのフルアクセス権があります。
これは達成した成果のようです。Linuxネームスペース、特にLinuxネットワークネームスペースこれは、開始されたプロセス(つまり、init
コンテナ内のプロセス/mntpointArchLinuxSysFs/bin/init
とすべての子プロセス)が異なるネットワーク名前空間にあることを示します。つまり、名前空間/システムへの残りの接続には(仮想イーサネットペア)--private-network
しかありません。veth
host
使用LSNSsystemd-nspawn
名前空間が実際に作成されたことを示します。
root@host$> lsns | grep net
4026531992 net 183 1 root /sbin/init
4026532332 net 1 824 rtkit /usr/lib/rtkit-daemon
4026532406 net 7 4697 vu-mnt-0 /usr/lib/systemd/systemd
しかし、ip netns list
「協力」を拒否します。
root@host$> ip netns list
root@host$>
その後、理解するために、次のようにして仮想ip netns
名前空間を作成しました。
root@host$> ip netns add dummy_netns
root@host$> ip netns list
dummy_netns
root@host$>
しかし皮肉なことに、ネットワークネームスペースはlsns
。
とにかく、「ネットワークネームスペース」という用語がでどのように使用されているのかは明らかではないようですsystemd-nspawn
。ip netns
私がテストした結果、2つの用語が実際には同じではない可能性があることがわかりました。たぶん言葉はあいまいですか?
修正する
マニュアルページのこの部分にはsystemd-nspawn
IMHOが記載されていますが、実際には両方とも同じ内容をiproute
表します。systemd-nspawn
ネットワークネームスペース。
--network-namespace-path=
コンテナーを実行する必要があるカーネルネットワークの名前空間を表すファイルへのパスを取得します。指定されたパスは、以下のカーネルによって公開されるように(おそらくバインドマウントされた)ネットワーク名前空間ファイルを参照する必要があります/proc/$PID/ns/net
。これにより、コンテナは指定されたネットワーク名前空間に配置されます。一般的なユースケースの1つは、で作成したネットワーク名前空間を提供すること/run/netns
ですip-netns(8)
。--network-namespace-path=/run/netns/foo
このオプションは、--private-networkや--network-interface =などの他のネットワーク関連オプションと一緒には使用できません。
そのオプションで再利用できないという最後の部分は、ある種の--private-network
違いを示唆しているようです。ここで何が起こっているのでしょうか?
ベストアンサー1
名前空間、特にネットワーク名前空間の両方を使用systemd-nspawn
します。ip-netns
違いは、で説明したようにip-netns マニュアル、ip-netns
処理中名前付きネットワークネームスペース。
通常、名前付きネットワーク名前空間は開くことができる
/var/run/netns/NAME
オブジェクトです。ファイルを開いた後に生成されたファイル記述子は、指定された/var/run/netns/NAME
ネットワーク名前空間を参照します。ファイル記述子を開いたままにすると、ネットワーク名前空間はアクティブのままです。
匿名ネットワーク名前空間
これネームスペース(7) マニュアル通常、名前空間は、その中のプロセスのライフサイクルに関連する抽象化であると説明します。
各プロセス
/proc/[pid]/ns/
には、サポートされている各名前空間のエントリを含むサブディレクトリがありますsetns(2)
。このディレクトリにあるファイルの1つ(またはこれらのファイルの1つにバインドマウントされたファイル)を開くと、その名前空間が返されます。 pidで指定されたプロセスのファイルハンドル。名前空間内のすべてのプロセスが終了しても、このファイル記述子が開いている限り、名前空間はアクティブのままです。
私のシステムでは、最後に起動されたsystemd
プロセス()がデフォルトのpgrep -f -n systemd\$
テンプレート単位で起動されたコンテナのinitプロセスであるため、有効になっています[email protected]
()。このコマンドは、コンテナの匿名ネットワーク名前空間がルートネットワーク名前空間とは異なり、コンテナのルートユーザーが所有していることを示します。--network-veth
--private-network
--private-users
# ls -l /proc/1/ns/net /proc/$(pgrep -f -n systemd\$)/ns/net
lrwxrwxrwx 0 root /proc/1/ns/net -> net:[4026532008]
lrwxrwxrwx 0 vu-container-0 /proc/700/ns/net -> net:[4026532656]
コンテナがシャットダウンすると、この匿名ネットワーク名前空間は消えます。ただし、ip-netns
コンテナの存続期間中に管理できる名前付きネットワーク名前空間が必要な場合は、次の場所にバインドマウントできます/run/netns
。
# mount --bind /proc/$(pgrep -f -n systemd\$)/ns/net /run/netns/container
# ip netns list
container (id: 1)
systemdを使用して名前付きネットワーク名前空間を作成する
また、に記載されている設定と同じsystemd-nspawn
オプションを指摘しました。--network-namespace-path
NetworkNamespacePath=
システムユニット(5)。既存のネットワーク名前空間にはコンテナとユニットのみを割り当てることができます。プロセスは単一の名前空間にしか存在できないため、--network-namespace-path
匿名ネットワーク名前空間を作成し、その中にコンテナを分離するなどのオプションと互換性がありません。--private-network
そうだNamespace=
systemdは設定を取得しますv246以降、一部の将来のバージョンのsystemd(v245は2020年3月にリリース)。これにより、ユニットは既存の名前空間への割り当てを使用したり、NetworkNamespacePath=
新しい匿名名前空間を作成したりする代わりに、独自の名前付きネットワーク名前空間を作成できますPrivateNetwork=
。この機能を統合したら、コンテナのネットワーク名前空間名がデフォルトで指定されるようにテンプレートにNamespace=%i
追加することをお勧めします。[email protected]