linux で bind マウントするときに,以下のように直接 read-only にすることは出来ません.
# mount --bind /etc /mnt -o ro # mount --bind -r /etc /mnt
例えば,RHEL6 互換の Scientific Linux 6 alpha (kernel 2.6.32) + util-linux-ng 2.17.2 な環境で,
[root@sl6 ~]# mount --bind -o ro /etc /mnt mount: warning: /mnt seems to be mounted read-write. [root@sl6 ~]# mount | grep "/mnt" /etc on /mnt type none (rw,bind) [root@sl6 ~]# umount /mnt
[root@sl6 ~]# mount --bind -r /etc /mnt mount: warning: /mnt seems to be mounted read-write. [root@sl6 ~]# mount | grep "/mnt" /etc on /mnt type none (rw,bind) [root@sl6 ~]# umount /mnt
こんな感じに警告が出て rw でマウントされます.
どうすれば良いかと言うと
# mount --bind /etc /mnt # mount -o remount,ro /mnt
というように remount すれば良いのです.
ですが,Debian lenny (kernel 2.6.26) + util-linux-ng 2.13.1.1 という util-linux-ng が少し古い環境では
# mount --bind -o ro /etc /mnt # mount | grep "/mnt" /etc on /mnt type none (ro,bind)
# mount --bind -r /etc /mnt # mount | grep "/mnt" /etc on /mnt type none (ro,bind)
と一見出来たように見えます.ですが,
# cd /mnt # touch test # ls test test
という風に ro になってません.(>_<)
既知の問題で新しい util-linux-ng ではなおっています (なので Scientific Linux 環境ではエラーになる).
(参考)
直接出来るようにするカーネルパッチの話も上記スレッドに出てきます.