我需要将一个目录 (/src) 重新挂载为另一个位置 (/dst) 的只读目录。可以这样做:
$ sudo mount --bind /src /dst
$ sudo mount -o remount,ro /dst
但是,我希望/etc/fstab
在启动时进行挂载,并且看到了针对此问题的不同建议解决方案,例如
/src /dst none bind 0 0
/src /dst none remount,bind,ro 0 0
不幸的是,这导致目录在我的系统上处于读/写状态,并且
/src /dst none bind 0 0
/dst /dst none remount,bind,ro 0 0
尝试挂载时会发出错误/dst
:
mount: /dst not mounted already, or bad option
上述解决方案据称适用于不同的发行版,但不幸的是不适用于 Ubuntu 10.04.4 LTS(内核 2.6.32-41-server)。
mount
除了将命令放入之外,还有什么想法可以实现这一点/etc/rc.local
吗?
答案1
在较旧的内核中,mount --bind
无法创建读写文件系统的只读视图。内核将文件系统的读写状态存储在一个不会被绑定挂载复制的位置。较新的内核允许这样做,但仍需要一个单独的mount
步骤:首先绑定,然后设为只读。有一个内核补丁可以改变这种情况,一些发行版(如 Debian)已经应用了它,但 Ubuntu 还没有(至少从 12.04 开始还没有)。
一个解决方案是从启动脚本创建只读视图/etc/fstab
,而不是从Oli 解释道。
否则,您可以使用绑定文件系统相反。这是一个保险丝文件系统。通过 FUSE 会稍微慢一些,因为它引入了额外的间接层。您还会失去对扩展文件元数据(如 ACL)的支持。另一方面,只读视图将具有可识别的文件系统类型,从而可以轻松地将其从文件系统遍历(例如locate
和备份)中排除。
该fstab
条目如下所示:
bindfs#/src /dst fuse perms=a=rX
答案2
根据这篇 LWN 文章,这种行为在版本 2.6.25 左右潜入内核。简而言之,如果目标文件系统是rw
,则在其上绑定某些东西无法将其转换为ro
。
在 2.6.26 中,他们部分修复了一些问题,因此您可以触发重新挂载(正如您所发现的),但仍然无法从 fstab 中执行此操作。
这是我在 fstab 中尝试的操作:
/home/oli/Desktop/testmount /mnt none bind,ro
启动后mount -a
,/mnt
已挂载,但我仍可以创建文件。然后关闭后sudo mount -o remount /mnt
,它变为只读。
所以是的,我认为最干净的方法就是添加一行 /etc/rc.local
或者编写一个在事件发生时启动的超级简单的 Upstart 脚本mountall
(这样它会立即发生)。