TenForward

技術ブログ。はてなダイアリーから移転しました

read only な bind mount の怪

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 環境ではエラーになる).

(参考)

直接出来るようにするカーネルパッチの話も上記スレッドに出てきます.