只读绑定挂载?

只读绑定挂载?

我使用 mount -o bind 在 chroot 中挂载目录,效果非常好。问题是我希望其中一些绑定挂载的目录在 chroot 中是只读的。

有可能吗?如果不可能,还有其他方法可以实现吗?

我正在考虑使用 NFS 进行本地主机挂载,但这看起来有点小题大做。

答案1

根据本文这是可能的。你确实需​​要一个较新的内核。

mount --bind -o ro /vital_data /untrusted_container/vital_data

答案2

直接回答LWN 文章

mount --bind /vital_writable_data /untrusted_container/vital_data
mount -o bind,remount,ro /untrusted_container/vital_data

自 Linux 2.6.26 起受支持。

答案3

在 Squeeze 中它仅适用于:

mount --bind /src /dst

然后

mount -o remount,ro /dst

现在在 Debian Wheezy 中你必须执行以下操作:

mount -o remount,ro,bind /dst

摆脱:资源繁忙消息。

编辑:现在在 Debian Jessie 中,mount 尝试变得智能并挂载子目录,如果已经使用 bind 挂载,则会进行递归,并且会发生不好的事情 :)

有一个特殊选项可以强制 util-linux 再次变得“愚蠢”。解决方案如下:

mount --bind --make-rprivate /sbin/ $prefix/sbin/
mount -o remount,ro,bind $prefix/sbin/

之后,您可以将 --bind $prefix/sbin 挂载到另一个目录。

从手册页中:

共享子树操作。自 Linux 2.6.15 起,可以将挂载及其子挂载标记为共享、私有、从属或不可绑定。共享挂载提供了创建该挂载镜像的能力,这样任何镜像内的挂载和卸载都会传播到另一个镜像。从属挂载从其主挂载接收传播,但反之则不然。私有挂载不具备传播能力。不可绑定挂载是无法通过绑定操作克隆的私有挂载。详细语义记录在内核源代码树中的 Documentation/filesystems/sharedsubtree.txt 文件中。支持的操作包括:

     mount --make-shared mountpoint
     mount --make-slave mountpoint
     mount --make-private mountpoint
     mount --make-unbindable mountpoint

以下命令允许递归更改给定挂载点下的所有挂载的类型。

     mount --make-rshared mountpoint
     mount --make-rslave mountpoint
     mount --make-rprivate mountpoint
     mount --make-runbindable mountpoint

当请求 --make-* 操作时,mount(8) 不会读取 fstab(5)。必须在命令行上指定所有必要信息。请注意,Linux 内核不允许使用单个 mount(2) 系统调用更改多个传播标志,并且这些标志不能与其他挂载选项混合使用。

自 util-linux 2.23 起,mount 命令允许将多个传播标志一起使用,也可以与其他挂载操作一起使用。此功能是实验性的。当前面的挂载操作成功时,传播标志将由其他 mount(2) 系统调用应用。请注意,此用例不是原子的。可以将 fstab(5) 中的传播标志指定为挂载选项(private、slave、shared、unbindable、rprivate、rslave、rshared、runbindable)。

答案4

安装--bind /vital_data/untrusted_container/vital_data

安装-o重新安装,ro,绑定/untrusted_container/vital_data

在第二次挂载时,您必须使用“remount,ro,bind”,否则 /vital_data 的所有其他实例也将获得只读权限。

相关内容