MS_SHAREDを使用してマウントするときにパラメータが無効です。

MS_SHAREDを使用してマウントするときにパラメータが無効です。

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_REMOUNT2番目の呼び出しでフラグを削除すると、目的のmount()結果が得られます。

この2段階のプロセスがなぜ必要なのかはよくわかりませんが、その理由はmount()デザインAPIの制限によるものと考えられます。長年にわたってAPIに追加があり(証拠については上記のテキストを参照)、マウント伝播機能が追加された(2005年頃)、おそらくこれが以前のバージョンと互換性がある唯一の方法でした。

おすすめ記事