我很困惑。Linux 文件系统是树形结构,根节点(起始节点)为根目录。现在假设我abc
在位置 有一个文件夹,在位置有/home/abc
另一个文件夹xyz
/home/xyz
文件夹xyz
由一些其他文件夹和文件组成。(例如def
,mno
是其中包含的文件夹)
/
├── home/
│ ├── abc
│ └── xyz
│ ├── def
│ └── mno
当我运行命令时
mount --rbind /home/xyz /home/abc
xyz
(rbind 是递归绑定)我可以看到文件夹中的所有内容abc
。现在,当我运行命令时
mount --bind /home/xyz /home/abc
xyz
我仍然可以看到中的所有内容abc
。
这是为什么?
--bind
其工作原理与 类似--rbind
。
答案1
您正确地观察到,使用--bind
和--rbind
,您都会看到绑定挂载下的目录。
区别在于,有--rbind
但无--bind
,你看其他绑定挂载的内容在绑定安装下。
应用于您的示例,为简单起见,假设/home/xyz/def
和/home/xyz/mno
是空目录。进一步假设您使用他们作为绑定挂载,即,您将它们用作或中的挂载点mount --bind
。mount --rbind
这会导致它们显示为非空。然后,假设您运行:
mount --bind /home/xyz /home/abc
然后,/home/abc/def
和/home/abc/mno
都存在,但它们看起来是空的,因为您使用了非递归的。mount --bind
相反,假设您/home/abc
通过运行以下命令进行了绑定挂载:
mount --rbind /home/xyz /home/abc
然后,/home/abc/def
并且/home/abc/mno
都存在并且它们看起来不是空的/home/xyz/def
——它们具有和绑定挂载的内容/home/xyz/mno
——因为您使用了,它是递归的。mount --rbind
这是一个完整示例:
ek@Gnar:~$ mkdir original
ek@Gnar:~$ touch original/a-regular-file
ek@Gnar:~$ mkdir original/a-directory
ek@Gnar:~$ mkdir parent-of-mountpoint
ek@Gnar:~$ mkdir parent-of-mountpoint/mountpoint
ek@Gnar:~$ sudo mount --bind ~/original ~/parent-of-mountpoint/mountpoint
ek@Gnar:~$ mkdir nonrecursive-other-mountpoint recursive-other-mountpoint
ek@Gnar:~$ sudo mount --bind ~/parent-of-mountpoint ~/nonrecursive-other-mountpoint
ek@Gnar:~$ sudo mount --rbind ~/parent-of-mountpoint ~/recursive-other-mountpoint
ek@Gnar:~$ tree -F original/
original/
├── a-directory/
└── a-regular-file
1 directory, 1 file
ek@Gnar:~$ tree -F parent-of-mountpoint/
parent-of-mountpoint/
└── mountpoint/
├── a-directory/
└── a-regular-file
2 directories, 1 file
ek@Gnar:~$ tree -F nonrecursive-other-mountpoint/
nonrecursive-other-mountpoint/
└── mountpoint/
1 directory, 0 files
ek@Gnar:~$ tree -F recursive-other-mountpoint/
recursive-other-mountpoint/
└── mountpoint/
├── a-directory/
└── a-regular-file
2 directories, 1 file
ek@Gnar:~$ mount | grep ~
/dev/sda2 on /home/ek/parent-of-mountpoint/mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/nonrecursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint/mountpoint type ext4 (rw,relatime)
答案2
读man 8 mount
。它说(强调):
绑定坐骑
将文件层次结构的一部分重新挂载到其他地方。调用方式为:
mount --bind olddir newdir
或者使用这个 fstab 条目:
/olddir /newdir none bind
调用此函数后,相同的内容可以在两个地方访问。还可以重新挂载单个文件(在单个文件上)。还可以使用绑定挂载从常规目录创建挂载点,例如:
mount --bind foo foo
绑定挂载调用仅附加单个文件系统(的一部分),而不是可能的子挂载。包括子挂载在内的整个文件层次结构通过使用以下方式附加到第二个位置::
mount --rbind olddir newdir
请注意,文件系统挂载选项将与原始挂载点上的选项保持相同。
答案3
原因是 bind 和 rbind 解决不同的问题。
例如,我的儿子想从全国各地的 Windows 访问我的媒体数据库。因此,我授予他 ssh 登录,并告诉他安装 sshfs。只有 Windows 中的 sshfs 才能像在 chroot jail 中一样运行。因此,为了授予他访问权限,我执行以下操作:
sudo mkdir -p /home/myson/share
sudo mount --rbind /share /home/myson/share
现在他可以遍历我为共享文件夹安装的所有驱动器。
但是假设我想将 /share 备份到远程主机,而不将所有其他驱动器安装在其下。我当然可以告诉 rsync 只备份一个文件系统。但是它也会跳过挂载点。如果我真的想复制挂载点,我应该执行以下操作:
sudo mkdir -p /tmp/share
sudo mount --bind /share /tmp/share
现在我有一个没有任何挂载的共享文件夹版本。
大多数人认为挂载点是空目录。但有时将文件填充到那里很有用。例如,如果您的网站存储在单独的驱动器上,您可能需要一组文件,以便在挂载失败时将用户重定向到您的备份站点。