web-dev-qa-db-ja.com

マウントソースをそれ自体にバインドする

mount --bind /dir1 /dir1は何をしますか?私は https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt を読みましたが、明確な説明はありません。ディレクトリだけでなく、ファイルにも有効なようです。

5
Mark

これは、一般的なケースmount --bind /dir1 /dir2とまったく同じように機能します。特別なケースについて知っておく必要があるのは、それが明確に定義されていて、無限に再帰しないことです。

(たとえば、ファイルはバインドマウントできるため、ファイルは自己バインドマウントできます)。

特別なケースは、2つの理由で、最初に聞こえるほど無意味ではありません。

1.バインドマウントオプションを設定できます。可能な操作を制限する

この呼び出しの後、同じコンテンツに2か所でアクセスできます。 1つのファイルを(1つのファイルに)再マウントすることもできます。バインドマウントを使用して、通常のディレクトリからマウントポイントを作成することもできます。次に例を示します。

      mount --bind foo foo

Bind mount呼び出しは、単一のファイルシステム(の一部)のみをアタッチし、可能なサブマウントはアタッチしません。サブマウントを含むファイル階層全体は、次を使用して2番目に接続されます。

      mount --rbind olddir newdir

ファイルシステムのマウントオプションは、元のマウントポイントのオプションと同じであることに注意してください。

v2.27以降のmount(8)では、関連するオプションを--bindとともに渡すことで、マウントオプションを変更できます。例えば:

      mount -o bind,ro foo foo

この機能はLinuxカーネルではサポートされていません。これは、追加のmount(2)再マウントシステムコールによってユーザー空間に実装されます。このソリューションはアトミックではありません。

読み取り専用バインドマウントを作成する別の(クラシック)方法は、再マウント操作を使用することです。次に例を示します。

      mount --bind olddir newdir
      mount -o remount,bind,ro olddir newdir

読み取り専用バインドは読み取り専用マウントポイント(VFSエントリー)を作成しますが、元のファイルシステムスーパーブロックは引き続き書き込み可能です。つまり、olddirは書き込み可能ですが、newdirは読み取り専用になります。

「remount、bind」操作により、nosuid、nodev、noexec、noatime、nodiratime、およびrelatime VFSエントリフラグを変更することもできます。マウントオプションを再帰的に変更することはできません(たとえば-o rbind、roを使用)。

マウントオプションのもう1つの用途は、「伝播フラグ」を設定することです。これらはsharedsubtree.txtが具体的に説明するものです。彼らは間違いなく混乱する可能性があります。それらはman mountでも概説されています。

私が提供するヒントは1つだけです。ドキュメントでは、リムーバブルデバイスのマウントを「スレーブ」マウント名前空間に伝播するために共有サブツリーが必要であると主張しています。ただし、より重要な動機は、「スレーブ」マウント名前空間でサンドボックスプロセスを開始した後、リムーバブルデバイスをアンマウントできるようにすることです。

2.ファイルを移動またはリンクできない境界を作成します

明らかにこれは一部望ましい 上記の制限を回避するために、そして一部はハードリンクがセキュリティのために本当に恐ろしいことがあり、それらを少し制限することが有用である可能性があるため です。

4
sourcejedi