Findmnt - 在 Linux 上查找已安装文件系统的更好方法
学习使用 findmnt 而不是 mount 来获得更强大且可定制的已安装文件系统列表。
我一直致力于一个 bash 脚本项目,从头开始自动构建 Linux。每次我浏览代码时,我都会找到使其更清晰的方法。我拿了一小段代码并使其变得更好。
有一天,我正在进行修改,以在安装文件系统之前检查文件系统是否已安装。我一直在寻找更好的方法来做到这一点。我不想使用通常的 mount | grep 或任何类似的代码。我想要一些更干净的东西。
Mount vs Findmnt
我不知道为什么,但在那一刻,我发现自己想知道为什么我如此频繁地连接到互联网来查找笔记本电脑上已有的信息。因此,我启动了 man mount, 我快速浏览了手册页并注意到这一点:
我得到了答案。首先,我已经使用错误的命令有一段时间了。其次,谷歌并不总是能提供最佳答案。
讽刺的是,我通常浏览的在线手册页中没有提到这一点。亲自看看,在 mount 的手册页上,findmnt 仅在最后引用。如果我通过常规渠道找到答案,我就不会写这篇文章。
我立刻很好奇,这个 findmnt 有多好?我可以从脚本中删除多少个管道?事实证明它比 mount 列表要好得多。首先,让我们比较每个命令的默认输出。
安装默认输出
查看上面的已挂载文件系统列表,很容易明白为什么 grep 变得如此流行。信息就在那里,但更好的格式会让它更容易阅读。为了实现这一点,您已经需要一个管道和外部命令。现在让我们看看findmnt。
查找默认输出
看起来好多了。它变得更好,有了 findmnt,您将不再需要使用工具组合。它非常灵活,使您有机会在脚本中使用时编写更清晰的代码。
Linux中findmnt命令的实际使用
使用 findmnt 检查文件系统是否已安装要容易得多。您可以在不使用任何选项的情况下检查源或目标。提供不带选项的安装点(目标)或设备(源),并且 findmnt 将尝试将您提供的论点与两者相匹配。
findmnt /boot
Findmnt 的工作原理实际上类似于文件系统的搜索命令。如果找到匹配项,则会打印它们,并且 findmnt 返回 0。当没有任何内容与您的查询匹配时,findmnt 会打印什么都不返回并返回 1。
findmnt 附带一长串选项。您有 2 个主要类别的选项,缩小搜索范围并格式化输出。
缩小搜索范围
就像用于查找文件的 find 一样,findmnt 用于查找文件系统。您已经知道如何通过提供与 SOURCE 和 TARGET 匹配的字符串来限制搜索。如果您需要将搜索范围缩小到源或目标,请使用 -S 和 -T 选项。
此时,我已经决定使用 findmnt 而不是 mount。我可以查询我想要的分区。而且我不使用管道。 Findmnt 并不止于此,它具有多种选项,旨在为您提供强大的文件系统搜索功能。
我认为最有趣的选项之一是-O、--options。 -O 选项可让您编写与您的搜索相匹配的选项列表。现在,搜索只读文件系统就像 findmnt -O ro 一样简单。
-O 选项也可以采用逗号分隔的列表。这使您可以搜索多个选项并仅列出具有所有所需选项的文件系统。
搜索给定的文件系统类型也不需要使用外部工具。只需使用-t选项即可。在下面的示例中,我列出了所有 tmpfs 挂载。
在上面的所有示例中,findmnt 搜索了 /etc/fstab、/etc/mtab 和 /proc/self/mountinfo。您可以使用以下选项轻松限制这种广泛的搜索:
–fstab(将搜索范围缩小到仅 /etc/fstab)
–mtab(将搜索范围缩小到仅 /etc/mtab)
–kernel(仅在 /proc/self/mountinfo 中搜索)
另一个有趣的选项是-i、-invert。这颠倒了匹配的意义。在前面的示例中,我们使用 -t 选项列出了所有tmpfs。下面的示例将仅列出 fstab 中的所有 swap 类型的文件系统。
findmnt --fstab -t swap
这将列出除任何交换类型之外的所有文件系统。
findmnt --fstab -t swap -i
使用给定的选项,您可以避免使用大量管道和外部程序。而且它并不止于此。 Findmnt 提供了一组很好的选项来自定义搜索结果的输出。
自定义 findmnt 命令的输出
您不需要使用 head 命令来删除标头。只需使用 -n 选项调用 findmnt 即可:
我没想到下一个选择会成为一个选择。 findmnt 可以模仿 df 命令的输出。使用 -D 或 –df 调用 findmnt 将告诉 findmnt 显示有关每个列出的文件系统的空间信息。
可以组合选项以进行更具体的搜索。在下一个示例中,我使用 findmnt 列出 /etc/fstab 中的所有文件系统并请求显示 df 信息。
findmnt --fstab --df
我不了解你,但我开始喜欢 findmnt。除了最后一个命令中的UUID。我明白了,这是识别操作系统设备的好方法。我,我想要一种更人类可读的方式。您可以使用-e选项来完成此操作。
-e 或 –evaluate 选项可将 UUID、LABEL、PARTLABEL、PARTUUID 等所有标签转换为相应的设备名称。当我使用 -e 选项运行相同的命令时,请查看结果。
我喜欢用 findmnt 的方式来格式化它的输出。它更加人性化。另一方面,这种格式在脚本中使用时可能更难操作。一个简单的逐行、空格分隔的数据集会更容易。使用-r、-raw选项可以轻松完成此操作。
下一个选项真的很好。我认为它消除了 | 的需要grep 几乎完全是这样。您可以使用 -o、-output 准确地告诉findmnt要打印哪一列。此选项采用逗号分隔的列列表进行打印。使用以下命令,您可以获得根分区的可用空间,没有标头。
findmnt -T / --df -o AVAIL -n
您在脚本中所要做的就是删除最后一个字符。在上面的命令中,我给出了 -df 选项。这是不必要的,即使没有该选项,也会打印相同的结果。
Findmnt 提供了相当广泛的输出列列表。下面我为您提供了我认为您会感兴趣的简短专栏列表。您可以使用 findmnt –help 查看完整列表findmnt –help
SOURCE 源设备
目标挂载点
FSTYPE 文件系统类型
选项 所有安装选项
LABEL 文件系统标签
UUID 文件系统 UUID
MAJ:MIN 主要:次要设备号
SIZE 文件系统大小
AVAIL 可用文件系统大小
USED 使用的文件系统大小
USE% 文件系统使用百分比
FSROOT 文件系统根
打印列的默认列表可以扩展而不是替换。只需使用以下格式提供一个列表:+list。以下命令将提供与使用 –df 相同的信息,只不过列将添加到末尾。
findmnt -T / -o +SIZE,USE%,AVAIL
我已经爱上了findmnt。这将为我节省大量管道和长命令行。 findmnt 并不止于此。我还想谈谈一项功能。 轮询。
是的,findmnt可用于监视/proc/self/mountinfo文件中的更改。这可以有效地让您监视系统是否安装相关活动。 bash 脚本中不再有 while 循环。
Findmnt 将侦听以下操作:挂载、umount、重新挂载 和 移动。您可以通过提供要侦听的操作的逗号分隔列表来限制这一点。例如,以下将仅监视挂载文件系统。
在上图中,您可以看到安装新分区时 findmnt 打印的输出。您注意到新列ACTION了吗?使用 –poll 选项,您可以显示 3 个新列:
操作:可用于安装、卸载、重新安装和移动
旧目标:可用于卸载和移动操作。
旧选项:可用于卸载和重新安装。
在此模式下使用时,findmnt将阻塞,如果在脚本中使用,则脚本将“挂起”。可以通过 2 个选项限制 -poll 阻止和侦听操作的时间
–first-only:Findmnt 将在检测到第一个操作后退出。
--timeout X:Findmnt 将在 X 毫秒后退出。
当你把它们放在一起时,findmnt是一个强大的工具。当在脚本中使用时,您将省去许多额外的代码。通过管道传输至外部命令的需求已大大减少。
前面列出的选项也可以与-poll一起使用。在下面的示例中,findmnt 将侦听挂载操作并打印 SOURCE、TARGET、SIZE 和 USE %。但前提是挂载目标与 -T 选项匹配。
findmnt -T /mnt/lfs --poll=mount -o SOURCE,TARGET,SIZE,USE%
额外提示:findmnt 的现实生活示例
我已经在 bash 脚本环境上从头开始编译 Linux 一段时间了。在我的脚本中使用 findmnt 会产生更好、更简洁的代码。
在脚本的初始启动过程中,我检查 LFS 分区是否已安装,如果没有,脚本将安装它们。代码过去看起来像这样:
if [[ `grep "$pd on $pm" < <(mount) | wc -l` < 1 ]];
then
...
...
fi
该项目是出于教育目的,这就是我在上述测试中使用进程替换和管道的原因。在我的代码中,我展示了完成同一任务的多种方法。使用 findmnt 我想出了一种更简洁的方法来完成同样的事情。
findmnt -S $pd -T $pm > /dev/null || (
...
...
)
我将输出重定向到 /dev/null,不需要在控制台上打印 findmnt 输出。 Findmnt 如果搜索失败,将返回 1,这将导致 ( ... ) 内的代码执行。
我希望您喜欢并学会了新命令。如果您有有趣的用法,请在评论中分享。这篇文章还有另一种观点:在线搜索并不总是最好的。我们往往会忘记 Linux 附带了一本手册。