web-dev-qa-db-ja.com

バインドマウントを有効にするには、現在のプロセスとその子孫のコンテキストでのみ有効にします

/ MyDir/aと/ MyDir/MySubDir/bの2つのファイルがあり、bashスクリプトを実行しています。このスクリプトに、ファイル/ aがファイル/ bを指すようにするコードを追加しますが、現在のプロセスとその子孫のみです。 。

現在のプロセスのみのコンテキストで/ MyDir/aが/ MyDir/MySubDir/bを指すようにすることを期待して(まだその子孫は含まれていません)、最初に小さなを実行して、現在のプロセスを独自のマウント名前空間で実行しようとしました実行するスクリプト内のCプログラム

unshare(CLONE_NEWNS)

その後

mount --bind /MyDir/MySubDir/b /MyDir/a.

残念ながら、システムコールが成功を報告したにもかかわらず、マウントが他のプロセスによってまだ表示されていたため、これは期待どおりに機能しませんでした。

別の試みでは、Cコードからマウントを作成しようとしました

mount("/MyDir/a", "/MyDir/MySubDir/b", "ext3", MS_BIND, null)

しかし、マウントがまったく有効にならなかったため、これは機能しませんでした(呼び出しが成功を報告したにもかかわらず)。

Bashスクリプトを使用して、現在のプロセスとその子孫のみのコンテキストで/ MyDir/aが/ MyDir/MySubDir/bを指すようにする方法はありますか?

Chrootについても少し読みましたが、これは/ディレクトリにのみ適用されます...特定のサブディレクトリにのみ適用されるchrootに似たものはありますか?

御時間ありがとうございます!

1
Ben S.

シェルのみのソリューションは次のようになります。

インタラクティブシェルの場合:

# unshare --mount
# mount --bind /MyDir/MySubDir/b /MyDir/a
# 

これらの設定について知る必要のないスクリプトの前に、非対話的に:

# unshare --mount sh -c 'mount --bind /MyDir/MySubDir/b /MyDir/a; exec somethingelse'

nshare マンページは、共有サブツリーのマウントについても警告します。それらを無効にする必要がある場合は、たとえば--make-privateをマウントに追加することを検討してください。

Haukeが言ったように、名前空間は消えてしまうので、作成した直後に名前空間を離れないようにする必要があります。

必要に応じて、プロセスなしで名前空間を維持する方法があります。マウントが含まれるため、マウント名前空間の場合は少し注意が必要です。これのインタラクティブな例を次に示します。

Shell1# unshare --mount
Shell1# echo $$
12345
Shell1#

Shell2# : > /root/mntreference
Shell2# mount --bind /proc/12345/ns/mnt /root/mntreference

これで、この参照がマウントされたままである限り、それを使用するプロセスがなくなっても、名前空間が消えることはありません。 nsenter --mount=/root/mntreferenceを使用すると入力されるため、追加のスクリプトを簡単に実行できます。

Cで同等のものを使用しても問題はありません。

2
A.B

残念ながら、Cプログラムとスクリプトがどのように関連しているかについてはまだ説明していません。

問題の考えられる(そしてここで考えられる)理由は次のとおりです。スクリプトからCプログラムを呼び出しますが、名前空間の変更はCプログラム(および考えられる子)内でのみ有効です。そのプログラムが存在した後、後続のすべてのコマンドの状況は変わりません。

目的のシェルに対してexecve()を呼び出して、Cプログラムからシェルを起動する必要があります。

1
Hauke Laging