既存のマウント名前空間を使用して新しいプロセス名前空間を作成する

既存のマウント名前空間を使用して新しいプロセス名前空間を作成する

共有解除によって生成されたプロセス名前空間を終了した後に新しいプロセス名前空間を作成する方法はわかりません。たとえば、次のようなものがあります。

unshare -f --mount-proc --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid

別の端末でこの名前空間を入力します。

nsenter --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid

共有解除によって開始されたシェルを終了すると、再び入ることはできません。

nsenter:フォーク失敗:メモリを割り当てられません。

私はそれから次のアイデアを得ました。中間位置。しかし、これは毎回新しいプロセス名前空間を作成しますが、これは私が望むものではありません。

nsenter --mount=/containers/1/ns/mnt unshare -f --mount-proc --pid

pidファイルと連携させることはできず、問題が何であるかを理解していません。

nsenter --mount=/containers/1/ns/mnt unshare -f --mount-proc --pid=/containers/1/ns/pid
unshare: cannot stat /proc/11379/ns/mnt: No such file or directory

共有解除されたシェルでnsenterを実行してみましたが、次のような結果が得られました。

nsenter: 'ns/mnt' 名前空間の再接続に失敗しました: 無効な引数

最後に、私が望むように動作すると思う解決策を見つけましたが、最初のプロセスが正しいインストール名前空間にないため、厄介で2つのプロセスを作成する必要があります。

# Terminal 1
unshare -f --mount-proc --pid=/containers/1/ns/pid
# Terminal 2
nsenter --mount=/containers/1/ns/mnt --pid=/containers/1/ns/pid unshare -f --mount-proc

元のプロセス名前空間を終了してスクリプトを再実行してインストール名前空間のすべてのエントリを設定すると、再起動できますが、毎回完全に再起動せずにこれを行う方法があると思います。

答え1

私はついに次のことを見つけました。ヒントは、入力プロセスの名前空間とマウントプロセスの間に入力マウントの名前空間を挟む必要があることです。この--mount-procフラグは新しいマウントネームスペースを意味します。明らかに、unshareを使用してマウントネームスペースを作成した後は、既存のマウントネームスペースに移動することはできません。再接続エラーメッセージ。

# Terminal 1
unshare --pid=/containers/1/ns/pid -f nsenter --mount=/containers/1/ns/mnt unshare --mount-proc
# Terminal 2
nsenter --pid=/containers/1/ns/pid --mount=/containers/1/ns/mnt unshare --mount-proc

これの欠点の1つは、ターミナル1と2のシェルが別々のマウントネームスペースにあるため、既存のマウントを共有しても、1つのターミナルの将来の変更が別のターミナルで表示されないことです。しかし、どうせそうしても役に立たないことに気づきました。マウントネームスペースは再起動後も維持されないため、これらの問題に陥るのではなく、スクリプトを再実行することをお勧めします。

関連情報