CLONE_NEWPID
以下を使用して新しいプロセスを作成します。chroot
/mnt/
さらに、ip netns
このコマンドを使用して新しいnetnsを作成します。
例えば
ip netns add test1
chrootedプロセスまたはそのサブプロセスがこの新しいnetnsを表示できるようにする方法を知っていますか?
straceで見た内容に基づいて、以下を試しました。
touch /mnt/var/run/netns/test1
ip netns exec test1 mount --bind /proc/self/ns/net /mnt/var/run/netns/test1
しかし成功はありません。
答え1
これは/var/run
シンボリックリンクなので、事前に/run
「解決」するか、さまざまなコマンドを使用するように指示する必要があります/mnt/var/run
。/run
一見すると、(最後の説明で説明されているように動作しないOPではなく)、初期名前空間のこの単純なコマンドだけでip netns exec
chrootで作業するのに十分です。PID名前空間:
mount --bind /run/netns/test1 /mnt/run/netns/test1
しかしそれは真実ではない。これは以下に関連しています。PID名前空間ですがchroot。実際、新しいものに変えなくても、全体的な問題は同じです。PID名前空間がまったくありません。
ip netns exec
単純な操作ではありませんネットワーク名前空間も機能するはずですが山名前空間と使用法取付(2)SF Q / Aで説明したシステムコールの理由は次のとおりです。ネストされたネットワーク名前空間を作成できません。。
問題:chroot
/proc
正しい操作を行うには、chrootの内部にインストールする必要があります。少なくとも/proc
chrootからインストールした後は、新しいエントリを入力するstrace
ことがわかります。ip netns exec test1 ...
山名前空間を再マウントできません/
。
getuid() = 0
openat(AT_FDCWD, "/run/netns/test1", O_RDONLY|O_CLOEXEC) = 3
setns(3, CLONE_NEWNET) = 0
close(3) = 0
unshare(CLONE_NEWNS) = 0
mount("", "/", 0x5595a749373f, MS_REC|MS_SLAVE, NULL) = -1 EINVAL (Invalid argument)
write(2, "\"mount --make-rslave /\" failed: "..., 49) = 49
exit_group(-1) = ?
+++ exited with 255 +++
再インストールに失敗しましたEINVAL
:理由chrootはもはや/
マウントポイントではありません。
ご注意ください、ネットワーク名前空間部分自体には何の問題もありません。たとえば、chroot側で次のようにします。
nsenter --net=/run/netns/test1 ip link
成功して表示されますテスト1/sys/
ネットワークインターフェイスを使用しますが、必要に応じて(前のリンクで説明したように)利用可能な関連項目を切り替えません。ip netns exec
回避策:独自の上部にバインドマウントを追加する
修正:バインドマウントchroot対話を避けるために、可能な限りプライベートモードでそれ自体をターゲットにしてマウントポイントになるように強制します(特に次の場合)。システム共有に切り替える/
前に完了)chroot。
シェルコマンドを使用して以下のタスク設定を再現しました。
tmpfsなど(initとも呼ばれる)からインストールするなど、一部の定型句は省略していますが、/run
実際にはchroot内にインストールする必要があります。/mnt/run
/proc
項目1の最初のもの:
~# unshare --fork --pid bash
~# echo $$
1
~# mount --bind --make-private /mnt /mnt
~# chroot /mnt bash
/# mount -t proc proc /proc
次に、無関係な用語2で:
~# ip netns add test1
~# mkdir -p /mnt/run/netns
~# touch /mnt/run/netns/test1
~# mount --bind /run/netns/test1 /mnt/run/netns/test1
1学期に戻る:
/# ip netns exec test1 ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
メモ:
前述のように、この問題は次の点に関連しています。PID名前空間。このコマンドを削除すると、
unshare --fork --pid bash
次の問題のみが解決されます。chrootいいえPID名前空間。インストールコマンドはいいえコマンドで実行します
ip netns exec
。これip netns exec
自体が一時インストール名前空間が作成されることに注意してください。マウントが完了したものは何でも消えますip netns exec
。これについては前のリンクにも記載されています。それでも、次のことが可能です。nsenter --net=/run/netns/test1 mount --bind /proc/self/ns/net /mnt/var/run/netns/test1
しかし、もちろん必ずしもそうではありません。これはまったく同じエンティティであり、渡すことができるからです。国立科学財団仮想ファイルシステム:
~# stat -f -c %T /run/netns/test1; stat -c %i /run/netns/test1 nsfs 4026533129 ~# nsenter --net=/run/netns/test1 sh -c 'stat -f -L -c %T /proc/self/ns/net; stat -L -c %i /proc/self/ns/net' nsfs 4026533129