绑定挂载的挂载选项

绑定挂载的挂载选项

由于一些复杂的要求,我不得不将以下两行放入/etc/fstab

/dev/xvdg1        /srv/storage  ext4  $OPTIONS1      0 2
/srv/storage/dir  /var/opt/dir  none  bind,$OPTIONS2 0 0

现在我的问题是:我是否必须在 $OPTIONS2 中重新列出所有挂载选项 $OPTIONS1,或者第二行(bindmount 行)是否会继承 $OPTIONS1 的选项?

仅供参考,以下是 $OPTIONS1 中使用的实际选项:

rw,auto,async,noatime,nodiratime,barrier=0,delalloc

预计到达时间:实际上我用的是UUID=.../dev/xvdg1但这不是重点。

答案1

简短的答案是“也许”,因为这取决于您传递的选项以及它的强制执行方式。如果您传递的选项严格来说是超级块标志,则不需要将选项重新列出作为绑定安装的一部分。如果您传递的选项包含 vfsmount 标志,那么是的,您需要重新列出 vfsmount 标志。您可以将“superblock flag”视为意味着它是底层文件系统的一部分,而“vfsmount flag”意味着它是内核的一部分(尽管这在技术上并不正确,因为内核实际上是强制执行这两者的) 。

您需要使用noexecnodev或等参数来执行此操作nosuid,因为它们适用于每个文件系统(请参阅这个线程在内核邮件列表上获取一些有用的信息)。

$ truncate -s 10M container
$ mkfs.ext4 container
$ mkdir mountpoint binded
$ sudo mount -o loop container mountpoint
$ sudo chown "$EUID" mountpoint
$ sudo mount -o bind mountpoint binded
$ cat > mountpoint/script << 'EOF'
> #!/bin/bash
> echo "This works."
> EOF
$ chmod +x mountpoint/script
$ binded/script 
This works.
$ sudo mount -o remount,noexec mountpoint
$ binded/script
This works.
$ mountpoint/script
bash: mountpoint/script: Permission denied

请注意,尽管是相同的脚本,但noexec仅针对每个文件系统强制执行。这是因为它是 vfsmount 标志,而不是超级块标志——也就是说,它是内核的功能,而不是文件系统的功能。

mount请注意这两个挂载点的输出在这之后的样子,并且noexec没有继续下去:

$ mount
[...]
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/mountpoint type ext4 (noexec,relatime,data=ordered)
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/binded type ext4 (relatime,data=ordered)

但是,如果我们使用 重新挂载绑定本身noexec,则会按预期工作:

$ sudo mount -o remount,noexec binded
$ mount
[...]
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/mountpoint type ext4 (noexec,relatime,data=ordered)
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/binded type ext4 (noexec,relatime,data=ordered)

然而,作为底层文件系统属性的选项通常不需要在绑定挂载上再次执行(并且它们可能会引发错误,因为许多支持的选项是由文件系统定义的)。一个简单的演示是ro,只读选项,但这也适用于其他超级块标志。

$ sudo mount -o remount,ro mountpoint
$ > mountpoint/test
bash: mountpoint/test: Read-only file system
$ > binded/test
bash: binded/test: Read-only file system

请注意,这一次,该标志会自动保留:

$ mount
[...]
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/mountpoint type ext4 (ro,noexec,relatime,data=ordered)
/tmp/tmp.hoiHQYPEFX/container on /tmp/tmp.hoiHQYPEFX/binded type ext4 (ro,noexec,relatime,data=ordered)

相关内容