在 Ubuntu 上使用 fstab 以只读方式绑定挂载?

mgd*_*mgd 8 fstab mount read-only

我需要在另一个位置 (/dst) 中以只读方式重新挂载一个目录 (/src)。这可以像这样完成:

$ sudo mount --bind /src /dst
$ sudo mount -o remount,ro /dst
Run Code Online (Sandbox Code Playgroud)

但是,我想使用/etc/fstab在启动时进行挂载,并且已经看到了针对此问题的不同建议解决方案,例如

/src  /dst    none  bind            0 0
/src  /dst    none  remount,bind,ro 0 0
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的系统上挂载了读/写的目录,这

/src  /dst    none  bind            0 0
/dst  /dst    none  remount,bind,ro 0 0
Run Code Online (Sandbox Code Playgroud)

尝试挂载时会发出错误/dst

mount: /dst not mounted already, or bad option
Run Code Online (Sandbox Code Playgroud)

上述解决方案应该适用于不同的发行版,但不幸的是不适用于 Ubuntu 10.04.4 LTS(内核 2.6.32-41-server)。

除了将mount命令放入/etc/rc.local?

Oli*_*Oli 6

根据这篇 LWN 文章,这种行为潜入了 2.6.25 版左右的内核中。简而言之,如果目标文件系统是rw,则绑定顶部的某些内容无法将其转换为ro.

在 2.6.26 中,他们部分修复了一些问题,因此您可以触发重新挂载(如您所见),但仍然无法从 fstab 中执行此操作。


这是我在 fstab 中尝试的内容:

/home/oli/Desktop/testmount  /mnt none bind,ro
Run Code Online (Sandbox Code Playgroud)

触发后mount -a, ,/mnt已挂载,但我仍然可以创建文件。然后触发后sudo mount -o remount /mnt,它变为只读。

所以是的,我认为最干净的方法是输入一行 /etc/rc.local或编写一个从mountall事件开始的超级简单的 Upstart 脚本(因此它立即发生)。


Gil*_*il' 6

在较旧的内核上,mount --bind无法创建读写文件系统的只读视图。内核将文件系统的读写状态存储在一个不会被绑定安装复制的地方。较新的内核允许这样做,但仍需要一个单独的mount步骤:首先绑定,然后设为只读。有一个内核补丁可以改变它,一些发行版(例如 Debian)已经应用了它,但 Ubuntu 还没有(至少从 12.04 开始没有)。

/etc/fstab正如Oli 解释的那样,一种解决方案是从引导脚本创建只读视图,而不是从。

否则,您可以改用bindfs。这是一个FUSE文件系统。通过 FUSE 会稍微慢一些,因为它引入了一个额外的间接层。您还将失去对扩展文件元数据(例如 ACL)的支持。另一方面,只读视图将具有可识别的文件系统类型,使其易于从文件系统遍历(例如locate和备份)中排除。

fstab条目如下所示:

bindfs#/src  /dst  fuse perms=a=rX
Run Code Online (Sandbox Code Playgroud)