/etc/mtab
Linux 中有什么?
为什么需要它以及拥有它的好处?
答案1
% 文件 /etc/mtab /etc/mtab:到 ../proc/self/mounts 的符号链接 % 文件/proc/挂载 /proc/mounts:指向 self/mounts 的符号链接 %
/etc/mtab
是一种兼容机制。几十年前,Unix 没有用于读取现有挂载信息的系统调用。相反,挂载文件系统的程序应该协作并自愿维护一个表,记录/etc/mtab
挂载的内容和位置。
出于显而易见的原因,这不是一个理想的机制。
mounts
Linux 获得了“procfs”的概念,它获得的东西之一就是该表的内核维护版本,以伪常规文件的形式。从内核中读取挂载信息的“系统调用”变成了针对该文件的打开-读取-关闭序列,然后将结果从人类可读的形式解析为机器可读的形式(有一些微妙的陷阱,就像你从两周前的错误报告中可以看出)。
/etc/mtab
因此,它普遍成为 的符号链接/proc/mounts
,允许硬连线该名称的程序继续从该文件读取挂载表,挂载和卸载文件系统的程序不再需要自己显式执行任何操作来保持最新。 (不过,如果/etc/mtab
结果是可写的常规文件,其中一些仍然会。并且有一些极端情况,mounts
其中缺少所有非内核内容的规范化信息并不完全是所需要的;尽管它们并不重要的一般问题/etc/mtab
。)
现在,每个进程都可以对所安装的内容有自己的单独视图,因此现在mounts
procfs 中的每个进程都有单独的文件,每个进程自己的表都可以通过self
符号链接访问,如self/mounts
,/proc/mounts
还现在有一个兼容机制。 (有趣的是,当前的 Linux doco 中既没有记录每个进程,mounts
也没有记录 的格式,尽管有类似的伪常规文件。)mounts
mountinfo
SunOS/Solaris也有类似的机制。该/etc/mnttab
文件实际上是一个单文件文件系统,除了读取表之外,通过该文件的打开文件描述符,通过系统read()
调用,还可以使用 来监视挂载点更改poll()
并获取各种进一步的信息ioctl()
。
在 HP-UX 中,/etc/mnttab
同样是文件的名称,但从版本 11 开始,它仍然是一个常规文件,其内容由系统实用程序共同维护。
AIX 不导出程序必须解析的人类可读的文本表,并且没有等效的文件。类似地,BSD 在 FreeBSD 和 OpenBSD 上具有成熟的系统调用getfsstat()
,程序可以以机器可读的形式从内核获取挂载表,而无需通过人类可读的中间形式对其进行编组。
进一步阅读
- 齐格蒙特·克雷尼茨基 (2019-03-16)。路径中的 \r 会混淆挂载单元。第12018章系统问题。
- 兹比格涅夫·耶德热耶夫斯基-斯梅克 (2019-04-04)。
/proc/self/mountinfo
[df]挂载路径中的 \r解析不正确。 #35137. GNU coreutils 错误。 /proc/mounts
。 文档/文件系统/proc.txt。 Linux 5.1。- 乔纳森·德博因·波拉德 (2019-02-28)。回复:目的是什么
fstab-decode
。错误#567071。 Debian 错误。 getfsstat()
。 FreeBSD 系统调用手册。 2016年12月27日。
答案2
根据man mount
:
传统上,mount 和 umount 程序在文件 /etc/mtab 中维护当前已挂载的文件系统的列表。这个真正的 mtab 文件仍然受支持,但在当前的 Linux 系统上,最好将其设为 /proc/mounts 的符号链接,因为在用户空间中维护的常规 mtab 文件无法可靠地与命名空间、容器和其他高级 Linux 功能一起使用。
在安装时不记录/etc/mtab
:
-n, --no-mtab
无需在 /etc/mtab 中写入即可挂载。例如,当 /etc 位于只读文件系统上时,这是必要的。
手册页中给出了更多细微差别。
答案3
JdeBP 的答案可能是最实际和有用的,我可以从我的(有点过时的)Linux 学习准备指南中添加一些内容,该指南还提供了有关它之前如何使用的视图:
/etc/mtab
和 的区别在于/proc/mounts
, 是/etc/mtab
由内核保存的用户空间管理信息mount
,/proc/mounts
是由内核保存的信息。来源