chrooted/NEWPID プロセスで名前空間を表示する方法

chrooted/NEWPID プロセスで名前空間を表示する方法

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 execchrootで作業するのに十分です。PID名前空間:

mount --bind /run/netns/test1 /mnt/run/netns/test1

しかしそれは真実ではない。これは以下に関連しています。PID名前空間ですがchroot。実際、新しいものに変えなくても、全体的な問題は同じです。PID名前空間がまったくありません。

ip netns exec単純な操作ではありませんネットワーク名前空間も機能するはずですが名前空間と使用法取付(2)SF Q / Aで説明したシステムコールの理由は次のとおりです。ネストされたネットワーク名前空間を作成できません。


問題:chroot

/proc正しい操作を行うには、chrootの内部にインストールする必要があります。少なくとも/procchrootからインストールした後は、新しいエントリを入力する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
    

関連情報