結論として:

結論として:

私のArch Linuxシステム(Linux Kernel 3.14.2)では、バインドマウントは読み取り専用オプションに従わない。

# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo

生成ファイル/mnt/fooの関連項目は/proc/mounts

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

マウントオプションは要求されたオプションと一致しませんが、バインドマウントの読み取り/書き込み動作と初期マウントで/dev/sda2使用されたオプションと一致します。/

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

ただし、インストールを再インストールすると、読み取り専用オプションが適用されます。

# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system

そして関連アイテム/proc/mounts/

/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0

test私が期待していたのと同じです(実際にはディレクトリのフルパスを見たいのですが)。元のマウントの項目/proc/mounts/も変更されず、読み取り/書き込み状態のままです。/dev/sda2//

/dev/sda2 / ext4 rw,noatime,data=ordered 0 0

この動作と回避策は、少なくとも以後知られてきた。2008年マニュアルページに文書化されています。mount

ファイルシステムのマウントオプションは、元のマウントポイントのオプションと同じままであり、--bind / -rbindで-oオプションを渡して変更することはできません。別の再インストールコマンドを使用してインストールオプションを変更できます。

すべてのディストリビューションが同じように動作するわけではありません。 Archはこれらのオプションを静かに無視しているように見えますが、Debianはバインドマウントが読み取り専用マウントを取得できないときに警告を生成します。

mount: warning: /mnt seems to be mounted read-write.

Debian では、この動作が「修正」されたという報告があります。レニーとスクイーズあまりそうではないようですが普遍的な修正Debian Wheezyでも動作しません。初期インストール時に読み取り専用オプションを考慮してバインドインストールを実行する際の難点は何ですか?

答え1

バインドマウントはただ…まあ…バインドマウントです。つまり、これは新しいマウントではありません。単にサブディレクトリを新しいマウントポイントに「リンク」/「露出」/「考慮」するだけです。したがって、インストールパラメータを変更することはできません。苦情を受け取る理由は次のとおりです。

# mount /mnt/1/lala /mnt/2 -o bind,ro
mount: warning: /mnt/2 seems to be mounted read-write.

しかし、あなたが言ったように、一般的なバインドマウントが機能します。

# mount /mnt/1/lala /mnt/2 -o bind

その後、roの再インストールも機能します。

# mount /mnt/1/lala /mnt/2 -o bind,remount,ro 

しかし現実は、このバインドマウントだけでなく、マウント全体を変更することです。 /proc/mounts を見ると、バインドマウントとネイティブマウントの両方が読み取り専用になっていることがわかります。

/dev/loop0 /mnt/1 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0
/dev/loop0 /mnt/2 ext2 ro,relatime,errors=continue,user_xattr,acl 0 0

だからあなたがすることは、初期インストールを読み取り専用インストールに変更することと同じです。それからもちろん、読み取り専用のバインドマウントを作成します。

2016年7月20日に更新:

以下は4.5カーネルでは機能しますが、4.3カーネルでは機能しません(間違っています。以下のアップデート#2を参照)。

カーネルには読み取り専用を制御する2つのフラグがあります。

  • MS_READONLYマウントが読み取り専用かどうかを示します。
  • MNT_READONLY「ユーザー」が読み取り専用を望むかどうかを示します。

4.5カーネルでは、aを実行することはmount -o bind,ro実際には効果があります。たとえば、次のようになります。

# mkdir /tmp/test
# mkdir /tmp/test/a /tmp/test/b
# mount -t tmpfs none /tmp/test/a
# mkdir /tmp/test/a/d
# mount -o bind,ro /tmp/test/a/d /tmp/test/b

/tmp/test/a/dtoの読み取り専用バインドマウントが作成され、/tmp/test/b次の形式で表示されます/proc/mounts

none /tmp/test/a tmpfs rw,relatime 0 0
none /tmp/test/b tmpfs ro,relatime 0 0

/proc/self/mountinfoユーザービュー(名前空間)を考慮したより詳細なビューはで見ることができます。関連する行は次のとおりです。

363 74 0:49 / /tmp/test/a rw,relatime shared:273 - tmpfs none rw
368 74 0:49 /d /tmp/test/b ro,relatime shared:273 - tmpfs none rw

ro2行目を見ると、(MNT_READONLY)とrw()の両方が表示されていることがわかります!MS_READONLY

最終結果は次のとおりです。

# echo a > /tmp/test/a/d/f
# echo a > /tmp/test/b/f
-su: /tmp/test/b/f: Read-only file system

アップデート#2(2016年7月20日):

さらに詳しく調べると、この動作は実際にはutil-linuxの一部であるlibmountのバージョンによって異なります。これのサポートが追加されました。犯罪バージョン2.27としてリリースされました。

9ac77b8a78452eab0612523d27fee52159f5016a 送信
著者:カレルジュッカー
日付: 2015年8月17日 月曜日 11:54:26 +0200

    libmount: "bind,ro" サポートを追加

    これで、読み取り専用データベースを作成するには、2つのmount(8)呼び出しを使用する必要があります。
    山:

      マウント /foo /bar -o バインド
      インストール/バー-o再インストール、ro、バインド

    このパッチを使用すると、「bind、ro」を指定して再マウントできます。
    追加のmount(2)システムコールを介してlibmountを介して自動的に実行されます。そうではない
    もちろん原子的です。

    署名者: Karel Zak

これは回避策も提供します。以前と最新のインストールでは、straceを使用してこの動作を確認できます。

古い:

mount("/tmp/test/a/d", "/tmp/test/b", 0x222e240, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.000681>

新しい:

mount("/tmp/test/a/d", "/tmp/test/b", 0x1a8ee90, MS_MGC_VAL|MS_RDONLY|MS_BIND, NULL) = 0 <0.011492>
mount("none", "/tmp/test/b", NULL, MS_RDONLY|MS_REMOUNT|MS_BIND, NULL) = 0 <0.006281>

結論として:

必要な結果を得るには、2つのコマンドを実行する必要があります(@ Thomasがすでに述べたように)。

mount SRC DST -o bind
mount DST -o remount,ro,bind

最新バージョンのマウント(util-linux> = 2.27)は、実行時に自動的にこれを行います。

mount SRC DST -o bind,ro

答え2

正しい解決策は実際に2回インストールすることです。コマンドラインから:

mount -t none -o bind /source/dir /destination/dir
mount -t none -o bind,remount,ro /source/dir /destination/dir

存在する/etc/fstab

/source/dir            /destination/dir    none  bind            0 0
/source/dir            /destination/dir    none  remount,bind,ro 0 0

マニュアル(man mount)には次のように説明されています。

   The bind mounts.
          Since Linux 2.4.0 it is possible to remount part of the file hierarchy somewhere else. The call is
                 mount --bind olddir newdir
   [...]
          Note that the filesystem mount options will remain the same as those on the original mount point, and cannot be changed  by  passing  the  -o  option
          along with --bind/--rbind. The mount options can be changed by a separate remount command, for example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro newdir
          .
          Note  that  behavior  of  the remount operation depends on the /etc/mtab file. The first command stores the 'bind' flag to the /etc/mtab file and the
          second command reads the flag from the file.  If you have a system without the /etc/mtab file or if you explicitly define source and target  for  the
          remount command (then mount(8) does not read /etc/mtab), then you have to use bind flag (or option) for the remount command too. For example:
          .
                 mount --bind olddir newdir
                 mount -o remount,ro,bind olddir newdir

答え3

コマンドラインの観点から要求していますmount(8)(このサイトでは許可されています)。このコマンドは他の回答で議論されており、必要に応じて必要な2番目のmount(2)システムコールを抽象化します。

しかし、2番目のシステムコールが必要なのはなぜですか?単一の呼び出しでmount(2)読み取り専用のバインドマウントが生成されないのはなぜですか?

これmount(2)マニュアルページ他の人が指摘したように説明しました。2セット設定されるフラグの数:

  • 基本ファイルシステムフラグ
  • VFSマウントポイントフラグ

それは言う:

Linux 2.6.16以降、MS_RDONLYこれはデフォルトのファイルシステムだけでなく、マウントポイントごとに設定または消去できます。マウントされたファイルシステムは、ファイルシステムまたはマウントポイントがすべて読み取り専用としてマークされていない場合にのみ書き込み可能です。

についてMS_REMOUNT

Linux 2.6.26以降、このフラグはMS_BINDマウントポイント固有のフラグのみを変更するために使用できます。これは、デフォルトのファイルシステムを変更せずにマウントポイントで「読み取り専用」フラグを設定または消去するのに特に役立ちます。 mountflags を次のように指定します。

      MS_REMOUNT | MS_BIND | MS_RDONLY

他のマウントポイントに影響を与えることなく、このマウントポイントを介して読み取り専用でアクセスできます。

バインドマウントが最初に導入されたときに問題が発生したようです。

mountflags MS_BIND(Linux 2.4 以降で利用可能) が含まれる場合、バインドマウントが実行されます。 ...mountflagsパラメータの残りのビットも無視されますMS_REC。 (バインドマウントには、デフォルトのマウントポイントと同じマウントオプションがあります。)

MS_BIND | MS_REMOUNTVFSフラグを設定するための信号として使用する代わりに、初期値を除外(および許可)し、それをマウントポイントに適用することを選択できるようです。MS_RDONLYMS_BIND

mount(2)システムコールの意味が少し奇妙だからです。

  • 最初の呼び出しはバインドマウントを生成し、他のすべてのフラグは無視されます。
  • 2番目の通話(再インストール)設定マウントポイント読み取り専用としてマーク

関連情報