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

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

/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でこれに相当するものを使用することは問題ではありません。

答え2

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

問題の考えられる(ここで考えられる)原因の1つはスクリプトでCプログラムを呼び出すことですが、名前空間の変更はCプログラム(および可能であればサブルーチン)内でのみ有効であることです。プログラムが存在する場合、後続のすべてのコマンドに対して状況は変更されません。

execve()必要なシェルを呼び出してCプログラムでシェルを起動する必要があります。

答え3

他の人が説明したように、名前空間を作成し(を使用してunshare)、その中でコマンドを実行する必要があります。

ルートを必要とせず、正しい信号と戻り状態処理を備えた事前に作成されたソリューションが必要な場合は、このfaketreeユーティリティを使用できます。利用可能ここgithubから、一つあります。ブログ投稿その用途と目的を説明します。

次のように使用できます。

faketree --mount /MyDir/MySubDir/b:/MyDir/a -- /path/to/your/script.sh

関連情報