我想请求社区帮助我理解 *nix 中“挂载点”与文件夹的概念。我尝试阅读了一些背景资料,例如这,这, 和这等等,但这个概念对我来说仍然很模糊。我会尽量问这个问题,这样它就不会重复第一个链接。
披露:我的计算基础几乎完全在 DOS/Windows 环境中,这可能导致我难以理解这一点。
第一个问题:什么是挂载点?(我读过关于它是什么的各种解释,也许答案会有所不同)。
我也想用一个具体的例子。以下输出来自我使用的 Linux 机器:
>df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/fedora_localhost-root 239727136 215317088 12209500 95% /
devtmpfs 8145236 0 8145236 0% /dev
tmpfs 8166384 160 8166224 1% /dev/shm
tmpfs 8166384 796 8165588 1% /run
tmpfs 8166384 0 8166384 0% /sys/fs/cgroup
tmpfs 8166384 76 8166308 1% /tmp
/dev/sda1 487652 150127 307829 33% /boot
>ls -l /dev/mapper/fedora_localhost-root
lrwxrwxrwx 1 root root 7 Jan 3 18:12 /dev/mapper/fedora_localhost-root -> ../dm-0
>ls -l /dev/dm-0
brw-rw---- 1 root disk 253, 0 Jan 3 18:12 /dev/dm-0
让我试着用语言表达我的理解,也许回答者可以理解并纠正我的误解
从我的阅读中,我思考Linux“使硬盘等物理设备可用作‘块设备’,这些设备看起来像位于 /dev 下的文件”,例如/dev/dm-0
。这是正确的吗?
根据我的阅读,我的理解是“挂载点”就像给定分区的“最顶层目录”,类似于DOS 术语中的C:\
或D:\
。对吗?
有一件事我不明白:我的例子显示/dev/dm-0
“安装在” /
。但不是/
这“最顶层目录”?我的意思是每个可访问的文件夹必然是某个子文件夹,/
不是吗?例如/home
,/var
等所有文件夹都是“在...之下”,/
因为它们都以...为前缀/
,对吗?我的意思是:如果我对“挂载点就像给定分区的最顶层目录”的理解是正确的,那么你怎么可能拥有多个挂载点,因为最顶层的挂载点/
已经被用完了?
与上一段相关:/dev/dm-0
本身是 的子文件夹/
。所以我不清楚挂载点如何/
成为其自身子文件夹的入口点?这似乎有些循环,我不明白这一点。
最后,有人可以解释一下挂载点和子文件夹之间的区别吗?其中一篇文章我读到说/
,、/home
和都是挂载点。那么作为挂载点与执行了/boot
有什么区别呢?/home
mkdir /home
谢谢您的帮助。我对此感到很困惑。
答案1
Windows 也支持驱动器挂载点(微软称它们为“重新解析点”,但概念是一样的)。由于你对 Windows 比对 *NIX 操作系统更熟悉,所以你可以进行一个小实验在 Windows 中帮助你理解这个概念:
- 将 USB 闪存驱动器插入计算机。
- 在桌面上创建一个新的空文件夹。
- 打开磁盘管理控制台,右键单击闪存驱动器,然后选择
Change Drive Letters and Paths...
- 在出现的对话框中,点击
Add...
按钮。 - 确保
Mount in the following empty NTFS folder:
选择了该按钮,然后浏览到您在桌面上创建的文件夹的路径(例如C:\Users\<your profile>\Desktop\New Folder
) - 点击 OK 和 OK。现在检查你的桌面。你会看到你创建的文件夹有一个驱动器快捷方式图标:
如果从命令提示符窗口查看它,您将看到它作为一种<JUNCTION>
对象类型:
请注意,您的闪存驱动器现在有两个挂载点;E:
(或其他)以及您在步骤 2 中创建的文件夹。您可以根据需要删除驱动器号,然后您将仍然能够通过桌面上的文件夹将文件复制到/从中复制文件。如果需要,您甚至可以为其添加多个驱动器号。 这就是挂载点:它只是您访问驱动器/分区的路径。
与 Linux 不同,Windows 将此文件夹表示为您某种奇怪的快捷方式。Windows 这样做是因为挂载点在 Microsoft 的世界中是一个有点奇怪的概念(因此您感到困惑)。它们在很多情况下甚至无法正常工作。但在 *NIX 操作系统中,这就是做事的方式。在 Linux 中,目录可以是文件夹或挂载点,大多数时候两者之间的区别并不重要。
*NIX 操作系统没有驱动器号的概念。您的“根”文件系统 ( /
) 始终位于树的顶部,并且(通常但不总是)作为系统的启动驱动器安装。这就是C:\
Windows 的情况。只能有一个根(就像只能有一个C:
驱动器一样)。系统上的每个其他驱动器或分区都必须安装到此根下的路径(目录)。因此,Windows 中的D:
或E:
将是Linux 中的/mnt/D_Drive
、/media/cdrom
,甚至/var
、/home
或其他任何名称。
现在,这是一件很重要的事情,也是您困惑的一大根源:
设备节点与挂载点不同。Windows 和 Linux 都有设备节点。不同之处在于 Windows 永远不会向您显示它们,并且它们不像在 Linux 中那样以文件形式存在于您的硬盘上。
在上面的命令提示符屏幕截图中,您会注意到您创建的文件夹被列为\??\Volume{GUID}\
。在 Linux 和 Windows 中,原始设备本身都有一个设备节点(例如/dev/sda1
在 Linux 或\??\Volume{GUID}
Windows 中)。挂载点是文件系统在该设备上在 Windows 中,您可以将驱动器号(E:\
例如)视为驱动器/分区的挂载点。唯一的区别是 Windows 从不向您显示\??\Volume{GUID}
设备节点。它只显示挂载点,并且这些挂载点几乎总是驱动器号(但正如我们从上面的实验中看到的那样,不一定是驱动器号)。
我希望这能帮你澄清一切。
现在,返回磁盘管理并删除该挂载点,以免您意外地做一些愚蠢的事情,例如尝试将其复制/移动到某个地方!:-)
答案2
Wrote this as a comment, realised I could expand it into a full blown answer.
文件夹是 Windows 的概念,忘掉它们吧。至于目录,在 Linux 中一切都是文件,因此它可以存在于目录中。此外,循环链接本身并没有什么问题,你可以在 /link 中有一个指向 / 的链接;Linux 允许这样做,接受它,继续前进
挂载点是已挂载设备可访问的点。
您的 /“根”永远不会移动,它始终是 /,但其他所有内容都可以位于您想要的任何位置。(我们尝试并坚持某些标准,详见 LSFH 文档。)
有了 / 之后,您就可以在这个“空间”内安装其他设备。通常,您会有一个交换驱动器/文件,它存在于由内核处理的某个模糊路径下
您可能有一个专用于 /home 的整个驱动器 - 因此这将是它的挂载点,然后您可能在自己的驱动器上也有 /usr 和 /tmp,每个驱动器也是一个挂载点。
您可以想象物理设备存在于 / 之外,而 /dev 下的东西仅仅是它的假想快捷方式,如果这让您感觉更好的话。
答案3
一般规则:如果有一个目录,您可以通过在其中安装某些东西使其成为安装点。原始目录内容(如果有;最好使用空目录作为安装点)从现在起将无法访问,因为其他文件系统已覆盖在那里。
例如,如果你的硬盘D:\
在 Windows 中,并且有D:\data\a1\
一个文件夹,那么你可以在 Linux 中将其挂载,/mnt/foo/
并立即获得/mnt/foo/data/a1/
。挂载/bar/baz/
将允许你访问a1
与相同的目录/bar/baz/data/a1/
。
如果您愿意,这个新挂载的文件系统中的某个子目录(如/bar/baz/data/a1/
)可以成为其他目录的挂载点,这里没有一般限制。
一开始,您有/
可用的。您将根文件系统挂载在那里。它包括(除其他外)一些空目录,旨在作为其他文件系统的挂载点。这样,您就可以构建目录树 - 通过以正确的顺序覆盖某些挂载点上的各种文件系统。
答案4
把任何 /(斜线)视为挂载点。
山是一种具有多种含义的方法 在挂载点上挂载某些东西。“某物”可以是实际的硬件:例如,USB 磁盘或磁盘的一个分区。因此,管理员可以将普通用户看到的整体结构编织在一起。管理员还可以允许用户在选定的挂载点挂载私有内存。
挂载点也可以看作是一个文件夹,例如在用户的主目录及其子树中。具有管理员权限的用户可以将文件夹挂载到主目录中的其他挂载点上。在这种情况下,相同的数据将以不同的方式提供。当然,必须使用适当的选项调用挂载方法。
建议用户,当挂载点被视为子文件夹时,该挂载点为空。如果挂载点非空,挂载将隐藏它,直到使用卸载命令。
请注意,通过实际挂载点向上指向的路径元素 .. 应该取决于其实际原点。