一段时间后,我终于明白了绑定挂载与 Linux 中的“常规”挂载没有什么区别(除了通过 挂载--bind
)。如果/dev/sda1
挂载在 上/mnt
,/mnt/variable_data
然后绑定挂载在 上/var
,两者之间的唯一区别是文件系统的根/dev/sda1
挂载在 上,而同一文件系统上的/mnt
路径挂载在(在虚拟/根文件系统中)。/variable_data
/var
我的问题有两个:
- 假设我没有运行
mount /dev/sda1 /mnt
(意思是没有/mnt/variable_data
),我如何挂载/variable_data
里面sda1
的/var
? - 如何实现上述内容
fstab
?
答案1
最简单的,也可能是唯一的方法,就是先安装/dev/sda1
。如果您担心意外更改,您可以以只读方式安装设备,但是绑定安装权限可能很棘手准备好。也有可能是为了过度安装设备顶部的目录。也就是说,一般情况下,可以挂载/dev/sda1
到/var
,然后再挂载/var/variable_data
到/var
。
这样做的一个潜在问题是安装过程不是原子的,并且有可能在安装的/var
短暂时间内写入某些内容。/dev/sda1
即使/dev/sda1
以只读方式安装,也可能会导致问题,具体取决于处理写入失败的方式。由于/var
fstab 中通常安装有单独的分区,因此这应该不是问题。
答案2
从 man 页面来看mount(2)
,我认为你不能直接这样做。系统调用不采用用于考虑已安装文件系统的子树的路径。只有源设备、目标路径、文件系统类型、安装标志(常见选项,如ro
和nosuid
)以及data
由文件系统本身解释的不透明字段(特定于文件系统的选项)。
看来您需要将设备安装到临时路径,然后绑定安装所需的子树,最后卸载第一个文件系统。除了卸载之外,您还可以通过 fstab 执行此操作。像这样的东西在 Ubuntu 上工作(使用 systemd):
# fstab
/dev/somedevice /tmpmnt ext4 auto,rw
/tmpmnt/var /var none auto,bind