我已经成功地使用 mount 来做到这一点。
sudo mount -o bind dir dir &&
sudo mount -o remount,bind,suid dir
需要两次调用mount
。我无法用更少的时间让它工作。无论如何,手册说这将需要两次挂载系统调用。
然而,我不知道要放入什么/etc/fstab
。
这是我尝试过的。
/home/system/dir /home/system/dir none bind
/home/system/dir /home/system/dir none remount,bind,suid
和
/home/system/dir /home/system/dir none remount,bind,suid
答案1
我提出了一种语法解决方法,使用单个/etc/fstab
条目来触发绑定安装的预期行为,否则不会触发 for suid
(但会触发 for nosuid
)。不耐烦的可以直接看答案的最后一行。
/etc/fstab
经过系统在启动时和通过山以后将不支持重复条目系统将每个条目转换为安装单元。我想有两个同名的单位会引起问题。山本身也会有同样的问题:无法区分两个具有相同名称的条目,
/etc/fstab
因此可能只有第一个,但无论如何人们都可以期待一些不同的行为。所以尝试用以下方法处理这个问题二条目
/etc/fstab
似乎很困难。这山命令(单独或与系统)仅能很好地处理相反的情况。
当指定“否定”选项(例如
nosuid
绑定安装)时,最近的足够山命令(或者也系统万一不是山)正确发出两个mount(2)
系统调用,第二个使用附加MS_REMOUNT
标志。当仅指定“正”选项(通过系统调用中缺少标志进行转换)时,会发出单个 mount 系统调用,即使意图是恢复先前的“负”选项。当指定将触发这两个系统调用行为的其他选项时,例如
bind,nodev
,附加的“积极”选项(例如suid
withbind,nodev,suid
)也会在第二个 mount 系统调用中启动(仅由于缺少相反的标志)并且这suid
在这个 strace 示例中可以正常工作:743790 mount("/home/system/dir", "/home/system/dir", 0x563792444220, MS_NODEV|MS_BIND, NULL) = 0 743790 mount("none", "/home/system/dir", NULL, MS_NODEV|MS_REMOUNT|MS_BIND, NULL) = 0
缺少 的
MS_NOSUID
存在MS_REMOUNT
会将安装点设置为suid
。这也意味着在父挂载上设置的所有其他非默认选项必须为附加绑定挂载显式写回,否则它们将消失。这里不指定suid
选项仍然会重新挂载绑定挂载苏伊德MS_NOSUID
因为在这两种情况下,这都是由于第二个 mount 系统调用中缺少标志而导致的。触发第二个系统调用的选项必须仍然存在,否则根本不会发出。
因为我猜测OP的意图是在这个地方运行无根容器,所以应该使用一个无害的选项来仍然触发这种行为。我能找到的唯一候选人mount(2)
wereMS_NOATIME
或MS_NODIRATIME
and MS_RELATIME
,最后一个是今天的默认值并且肯定已经存在。
从 Linux 2.4 开始,上面的一些标志可以在每个安装的基础上设置,而其他适用于已安装文件系统的超级块,这意味着同一文件系统的所有安装共享这些标志。 (以前,所有标志都是针对每个超级块的。)
这每个安装点标志如下面所述:
- 从 Linux 2.4 开始:
MS_NODEV
、MS_NOEXEC
和MS_NOSUID
标志可以在每个安装点的基础上设置。- 此外,自 Linux 2.6.16 起:
MS_NOATIME
和MS_NODIRATIME
.- 此外,自 Linux 2.6.20 起:
MS_RELATIME
.[...]
从 Linux 2.6.16 开始,
MS_RDONLY
可以在每个安装点以及底层文件系统超级块上设置或清除。[...]
因此,最终今天触发的条目的预期效果可以是:
/home/system/dir /home/system/dir none bind,relatime 0 0
简单地重述relatime
将触发第二个挂载系统调用并允许更改回suid
.在这种情况下,当/home
has flags时rw,nosuid,relatime
,/home/system/dir
将有 flagsrw,relatime
意味着它照常处理设定值二进制文件,其他什么都没有改变。
但为了一致性、文档/理解并防止未来的更改/改进,最好suid
也明确说明预期目的:
/home/system/dir /home/system/dir none bind,relatime,suid 0 0