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


8

我需要在另一个位置(/ dst)中将一个目录(/ src)重新安装为只读。可以这样完成:

$ 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什么想法可以实现此目的吗?

Answers:


6

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

一种解决方案是创建一个启动脚本,而不是从只读视图/etc/fstab,为奥利解释道

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

fstab条目如下所示:

bindfs#/src  /dst  fuse perms=a=rX

6

根据这篇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事件开始(因此立即发生)。


我还读到了mount --bind不能更改mount选项的内容(它在的手册页上也这样说mount)。奇怪的是,我列出的解决方案(根据其他来源)显然适用于Fedora(第一种解决方案)。谢谢您使用的想法upstart。(顺便说一句,我认为第一行中的第二个“ rw”应该是“ ro”。)
mgd 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.