在 Ubuntu 上使用 fstab 绑定安装只读?

在 Ubuntu 上使用 fstab 绑定安装只读?

我需要将一个目录 (/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(这样它会立即发生)。

相关内容