由于一些复杂的要求,我不得不将以下两行放入/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”意味着它是内核的一部分(尽管这在技术上并不正确,因为内核实际上是强制执行这两者的) 。
您需要使用noexec
、nodev
或等参数来执行此操作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)