mkdtemp(2)とMS_SHAREDを使用して作成された一時ディレクトリであるmount_dirに/ mntのext4ファイルシステムをマウントしようとしています。その後、MS_PRIVATEを使用して再マウントしようとします。アイデアは、/ mntファイルシステムにマウントネームスペースを作成し、伝播を防ぐことです。名前空間内から元のファイルシステムにイベントを送信します。
別のフラグの組み合わせを試しましたが、MS_BIND | MS_PRIVATEだけが機能しますが、イベントはまだ元のファイルシステムに伝播しているようです。
fprintf(stderr,"-->Mounting file system from base image...");
if(mount("/mnt", mount_dir, NULL, MS_SHARED , NULL)){
fprintf(stderr, "%s Failed..%m\n",mount_dir);
return -1;
}else{
fprintf(stderr,"Success\n");
}
fprintf(stderr,"-->Remounting mount point as MS_PRIVATE...");
if(mount(NULL, mount_dir, NULL, MS_REMOUNT | MS_PRIVATE, NULL)){
fprintf(stderr,"Failed..%m\n");
return -1;
}else{
fprintf(stderr, "Success.\n");
}
ベストアンサー1
表示されるコードの両方のマウント呼び出しを変更する必要があります。最初の呼び出しでマウントを作成するときにこのMS_SHARED
フラグを指定すると、エラーが発生しますEINVAL
。代わりに、対応するフラグなしでインストールを生成します(つまり、パラメーターはflags
ゼロでなければなりません)。これにより、デフォルトの伝播タイプとして新しいマウントポイントが作成されます。MS_SHARED
親マウントにも共有伝播がある場合はタイプはで、そうでない場合は伝播タイプはですMS_PRIVATE
。 (詳しくは下記をご覧ください。mount_namespaces(7)
マニュアルページの「説明」セクション.)
2番目mount()
の呼び出しではフラグは必要なく、実際にMS_REMOUNT
使用するとフラグはMS_PRIVATE
無視されます。より取付(2)マニュアルページ(特に「テストはここにリストされている順序で実行されます」を参照):
A call to mount() performs one of a number of general types of
operation, depending on the bits specified in mountflags. The
choice of which operation to perform is determined by testing the
bits set in mountflags, with the tests being conducted in the
order listed here:
* Remount an existing mount: mountflags includes MS_REMOUNT.
* Create a bind mount: mountflags includes MS_BIND.
* Change the propagation type of an existing mount: mountflags
includes one of MS_SHARED, MS_PRIVATE, MS_SLAVE, or MS_UNBIND‐
ABLE.
* Move an existing mount to a new location: mountflags includes
MS_MOVE.
* Create a new mount: mountflags includes none of the above
flags.
MS_REMOUNT
2番目の呼び出しでフラグを削除すると、目的のmount()
結果が得られます。
この2段階のプロセスがなぜ必要なのかはよくわかりませんが、その理由はmount()
デザインAPIの制限によるものと考えられます。長年にわたってAPIに追加があり(証拠については上記のテキストを参照)、マウント伝播機能が追加された(2005年頃)、おそらくこれが以前のバージョンと互換性がある唯一の方法でした。