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

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

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

/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)

ただし、これはマウントがまったく適用されないため機能しません(呼び出しが成功を報告しても)。

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

chrootについても読みましたが、これは/ディレクトリでのみ機能します...特定のサブディレクトリでのみ機能するchrootに似ていますか?

時間をいただきありがとうございます!

ベストアンサー1

シェル専用のソリューションは次のとおりです。

対話型シェルの場合:

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

非対話型の方法でこれらの設定のスクリプトを理解する必要があります。

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

これ共有をキャンセルマンページでは、共有サブツリーのマウントに関する問題も警告します。これを無効にする必要がある場合は、--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でこれに相当するものを使用することは問題ではありません。

おすすめ記事