linux findmnt命令
findmnt 命令是 util-linux 包的一部分,用于查找和显示已挂载文件系统的信息。它比传统的 mount 命令提供更丰富、更易读的输出。
一、Findmnt 简介
findmnt 是一个强大的命令行工具,用于:
- 显示系统当前所有挂载点
- 查找特定设备或挂载点的信息
- 以树状结构显示挂载关系
- 支持多种输出格式(列表、JSON、树形等)
- 过滤和搜索特定的挂载点
二、基本语法
findmnt [选项] [设备|挂载点]
三、常用选项
| 选项 |
说明 |
-l, --list |
列表格式输出(默认) |
-t, --types 类型 |
仅显示指定类型的文件系统 |
-n, --noheadings |
不显示标题行 |
-o, --output 列 |
指定输出列 |
-r, --raw |
原始格式输出(不使用对齐) |
-u, --notruncate |
不截断文本(显示完整内容) |
-p, --poll[=列表] |
轮询挂载表的变化 |
-s, --fstab |
显示 /etc/fstab 文件中的条目 |
-m, --mtab |
显示 /etc/mtab 文件中的条目 |
-k, --kernel |
显示内核挂载信息 |
-c, --canonicalize |
规范化路径(解析符号链接) |
-e, --evaluate |
评估所有标签(LABEL=, UUID=) |
-F, --tab-file 文件 |
使用自定义的 fstab/mtab 文件 |
-A, --all |
显示所有文件系统(包括伪文件系统) |
-D, --df |
类似 df 命令的输出格式 |
-J, --json |
JSON 格式输出 |
-P, --pairs |
键值对格式输出 |
-T, --tree |
树状结构输出 |
-R, --submounts |
递归显示所有子挂载 |
-M, --mountpoint 路径 |
显式指定挂载点 |
-S, --source 设备 |
显式指定源设备 |
-O, --options 选项 |
按挂载选项过滤 |
-v, --verbose |
详细输出 |
--version |
显示版本信息 |
--help |
显示帮助信息 |
四、常用实例
1. 显示所有挂载点
# 显示所有挂载点(列表格式)
findmnt
# 显示所有挂载点(包括伪文件系统)
findmnt -A
# 树状结构显示挂载点
findmnt --tree
# 递归显示所有子挂载
findmnt -R
2. 按文件系统类型过滤
# 仅显示 ext4 文件系统
findmnt -t ext4
# 显示多个文件系统类型
findmnt -t ext4,xfs,btrfs
# 排除特定文件系统类型
findmnt -t nosquashfs,noproc,nodevtmpfs
# 显示 tmpfs 文件系统
findmnt -t tmpfs
# 显示网络文件系统
findmnt -t nfs,nfs4,cifs
3. 查找特定设备或挂载点
# 查找特定挂载点
findmnt /mnt/data
# 查找特定设备
findmnt /dev/sda1
# 使用 UUID 查找
findmnt UUID="1234-5678"
# 使用卷标查找
findmnt LABEL="MyData"
# 查找根文件系统
findmnt /
4. 自定义输出格式
# 指定输出列
findmnt -o SOURCE,TARGET,FSTYPE,SIZE,USED,AVAIL,USE%
# 不显示标题行
findmnt -n
# 原始格式输出
findmnt -r
# 不截断长文本
findmnt -u
# JSON 格式输出
findmnt -J
# 键值对格式输出
findmnt -P
# 类似 df 的输出
findmnt -D
5. 显示 /etc/fstab 中的条目
# 显示 fstab 中的所有条目
findmnt --fstab
# 显示 fstab 中特定类型的条目
findmnt --fstab -t ext4
# 显示 fstab 并评估标签
findmnt --fstab -e
6. 轮询挂载表变化
# 实时监控挂载表变化
findmnt --poll
# 轮询特定设备
findmnt --poll /dev/sda1
# 轮询特定挂载点
findmnt --poll /mnt/data
# 指定轮询间隔(毫秒)
findmnt --poll=1000
7. 按挂载选项过滤
# 查找使用 noatime 选项的挂载点
findmnt -O noatime
# 查找使用 rw 选项的挂载点
findmnt -O rw
# 排除使用 ro 选项的挂载点
findmnt -O noro
# 查找同时使用多个选项的挂载点
findmnt -O noatime,nodiratime
8. 常用输出列组合
# 基本信息
findmnt -o SOURCE,TARGET,FSTYPE,OPTIONS
# 磁盘空间信息
findmnt -o TARGET,FSTYPE,SIZE,USED,AVAIL,USE%
# UUID 和卷标信息
findmnt -o SOURCE,TARGET,UUID,LABEL
# 文件系统特性
findmnt -o SOURCE,TARGET,FSTYPE,FSAVAIL,FSUSE%
# 所有可用列
findmnt -o list
五、可用输出列
| 列名 |
说明 |
TARGET |
挂载点 |
SOURCE |
源设备 |
FSTYPE |
文件系统类型 |
OPTIONS |
挂载选项 |
VFS-OPTIONS |
VFS挂载选项 |
FS-OPTIONS |
文件系统特定选项 |
LABEL |
文件系统卷标 |
UUID |
文件系统UUID |
PARTLABEL |
分区卷标 |
PARTUUID |
分区UUID |
MAJ:MIN |
设备主次编号 |
SIZE |
总空间大小 |
USED |
已用空间 |
AVAIL |
可用空间 |
USE% |
使用百分比 |
FSSIZE |
文件系统大小 |
FSUSED |
文件系统已用空间 |
FSAVAIL |
文件系统可用空间 |
FSUSE% |
文件系统使用百分比 |
FILES |
总文件数 |
INODES |
总inode数 |
IFREE |
空闲inode数 |
IUSE% |
inode使用百分比 |
PROPAGATION |
挂载传播标志 |
ID |
挂载ID |
PARENT |
父挂载ID |
FREQ |
dump频率 |
PASSNO |
fsck顺序 |
COMMENT |
注释 |
六、实际应用场景
1. 监控脚本 - 检查磁盘空间
#!/bin/bash
# 监控磁盘空间使用率
THRESHOLD=80
findmnt -D -n -o TARGET,USE% | while read TARGET USE; do
USE=${USE%\%} # 移除百分号
if [ "$USE" -ge "$THRESHOLD" ]; then
echo "警告: $TARGET 使用率 $USE% 超过阈值 $THRESHOLD%"
# 发送告警邮件或通知
fi
done
2. 备份脚本 - 获取所有挂载点信息
#!/bin/bash
# 备份所有挂载点配置信息
BACKUP_DIR="/backup/system"
DATE=$(date +%Y%m%d)
# 备份当前挂载信息
findmnt -J > "$BACKUP_DIR/mounts_$DATE.json"
# 备份fstab配置
findmnt --fstab -J > "$BACKUP_DIR/fstab_$DATE.json"
# 生成可读的报告
findmnt -o TARGET,SOURCE,FSTYPE,SIZE,USED,AVAIL,USE% > "$BACKUP_DIR/mount_report_$DATE.txt"
echo "挂载信息备份完成: $BACKUP_DIR"
3. 系统健康检查
#!/bin/bash
# 系统挂载健康检查
echo "=== 挂载健康检查报告 ==="
echo "生成时间: $(date)"
echo
# 1. 检查根文件系统
echo "1. 根文件系统状态:"
findmnt / | grep -q " / " && echo "✓ 根文件系统正常挂载" || echo "✗ 根文件系统异常"
# 2. 检查关键挂载点
CRITICAL_MOUNTS=("/" "/home" "/var" "/tmp")
for MOUNT in "${CRITICAL_MOUNTS[@]}"; do
if findmnt "$MOUNT" > /dev/null 2>&1; then
echo "✓ $MOUNT 正常挂载"
else
echo "✗ $MOUNT 未挂载"
fi
done
# 3. 检查文件系统类型
echo -e "\n2. 文件系统类型统计:"
findmnt -t ext4,xfs,btrfs,nfs,cifs | awk '{print $3}' | sort | uniq -c | sort -rn
# 4. 检查磁盘空间
echo -e "\n3. 磁盘空间使用情况:"
findmnt -D -o TARGET,USE%,AVAIL | grep -v "tmpfs\|proc\|sysfs" | sort -k2 -nr
4. 自动化挂载管理
#!/bin/bash
# 自动挂载未挂载的fstab条目
while read -r LINE; do
DEVICE=$(echo "$LINE" | awk '{print $1}')
MOUNT_POINT=$(echo "$LINE" | awk '{print $2}')
FSTYPE=$(echo "$LINE" | awk '{print $3}')
OPTIONS=$(echo "$LINE" | awk '{print $4}')
# 检查是否已挂载
if ! findmnt "$MOUNT_POINT" > /dev/null 2>&1; then
echo "挂载 $DEVICE 到 $MOUNT_POINT"
# 创建挂载点目录
mkdir -p "$MOUNT_POINT"
# 挂载设备
if mount -t "$FSTYPE" -o "$OPTIONS" "$DEVICE" "$MOUNT_POINT"; then
echo "✓ 挂载成功"
else
echo "✗ 挂载失败"
fi
fi
done < <(findmnt --fstab -n -o SOURCE,TARGET,FSTYPE,OPTIONS)
七、与 mount 命令对比
| 特性 |
findmnt |
mount |
| 主要用途 |
查找和显示挂载信息 |
挂载和卸载文件系统 |
| 输出格式 |
多种格式(列表、树形、JSON等) |
简单列表格式 |
| 过滤能力 |
强大的过滤选项 |
有限过滤能力 |
| 树状结构 |
支持树状显示 |
不支持 |
| JSON输出 |
支持JSON格式 |
不支持 |
| 实时监控 |
支持轮询监控 |
不支持 |
| 脚本友好 |
输出易于解析 |
输出不易解析 |
| fstab支持 |
直接显示fstab条目 |
需要 mount -a |
八、高级技巧
1. 结合其他命令使用
# 结合awk进行高级处理
findmnt -n -o TARGET,SOURCE,FSTYPE | awk '$3 == "ext4" {print $1}'
# 结合grep过滤
findmnt | grep -E "nfs|cifs"
# 结合sort排序
findmnt -D -n -o TARGET,USE% | sort -k2 -nr
# 结合jq处理JSON输出
findmnt -J | jq '.filesystems[] | select(.fstype == "ext4")'
# 结合column美化输出
findmnt -o TARGET,SOURCE,FSTYPE,SIZE,USE% | column -t
2. 创建挂载点报告
#!/bin/bash
# 生成详细的挂载点报告
REPORT_FILE="/tmp/mount_report_$(date +%Y%m%d_%H%M%S).txt"
{
echo "系统挂载点详细报告"
echo "生成时间: $(date)"
echo "=" * 50
echo "1. 所有挂载点(树状结构):"
findmnt --tree
echo
echo "2. 按文件系统类型统计:"
findmnt -o FSTYPE | tail -n +2 | sort | uniq -c | sort -rn
echo
echo "3. 磁盘空间使用情况:"
findmnt -D -o TARGET,SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%
echo
echo "4. 网络文件系统:"
findmnt -t nfs,nfs4,cifs -o TARGET,SOURCE,OPTIONS
echo
echo "5. 临时文件系统:"
findmnt -t tmpfs -o TARGET,SIZE,OPTIONS
} > "$REPORT_FILE"
echo "报告已生成: $REPORT_FILE"
3. 监控挂载点变化
#!/bin/bash
# 监控挂载点变化
PREVIOUS_OUTPUT="/tmp/findmnt_previous.txt"
CURRENT_OUTPUT="/tmp/findmnt_current.txt"
# 保存当前状态
findmnt -o TARGET,SOURCE,FSTYPE > "$CURRENT_OUTPUT"
if [ -f "$PREVIOUS_OUTPUT" ]; then
# 比较变化
if ! diff "$PREVIOUS_OUTPUT" "$CURRENT_OUTPUT" > /dev/null; then
echo "检测到挂载点变化:"
echo "时间: $(date)"
diff -u "$PREVIOUS_OUTPUT" "$CURRENT_OUTPUT"
# 发送通知
# send_notification "挂载点变化" "$(diff -u $PREVIOUS_OUTPUT $CURRENT_OUTPUT)"
fi
fi
# 保存当前状态供下次比较
cp "$CURRENT_OUTPUT" "$PREVIOUS_OUTPUT"
九、故障排除
# 原因:/proc 文件系统未挂载或权限问题
# 解决方法:
# 1. 检查 /proc 是否挂载
mount | grep proc
# 2. 手动挂载 /proc(如果未挂载)
sudo mount -t proc proc /proc
# 3. 检查权限
ls -la /proc/self/mountinfo
# 4. 使用其他挂载信息源
findmnt --kernel
findmnt --mtab
# 5. 检查 util-linux 包是否安装
rpm -q util-linux # RHEL/CentOS
dpkg -l util-linux # Debian/Ubuntu
# 原因:指定了不存在的输出列
# 解决方法:
# 1. 查看所有可用列
findmnt -o list
# 2. 检查列名拼写
# 正确的列名通常是全大写的
# 3. 常用列名参考:
# TARGET, SOURCE, FSTYPE, OPTIONS, LABEL, UUID, SIZE, USED, AVAIL, USE%
# 4. 使用正确的列名组合
findmnt -o TARGET,SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%
# 原因:JSON格式不标准或解析工具问题
# 解决方法:
# 1. 使用jq工具解析JSON
findmnt -J | jq '.'
# 2. 检查JSON格式
findmnt -J | python -m json.tool
# 3. 使用简单格式代替JSON
findmnt -P # 键值对格式
findmnt -r # 原始格式
# 4. 限制输出范围
findmnt -J /mnt/data # 只输出特定挂载点
十、最佳实践
使用建议
- 在脚本中使用
-n 选项避免标题行干扰解析
- 使用
-o 指定需要的列提高输出可读性
- JSON 格式适合自动化处理,键值对格式适合 shell 脚本
- 树状结构 (
--tree) 适合理解挂载层次关系
- 轮询功能 (
--poll) 适合监控挂载变化
- 结合
jq 工具处理 JSON 输出
- 定期使用
findmnt --fstab 检查配置文件
- 创建别名简化常用命令:
alias mnt='findmnt --tree'
十一、实用命令速查
常用查询
# 树状显示所有挂载
findmnt --tree
# 显示磁盘空间信息
findmnt -D
# 查找特定挂载点
findmnt /mnt/data
# 显示ext4文件系统
findmnt -t ext4
脚本使用
# 脚本友好格式
findmnt -n -o TARGET,SOURCE,FSTYPE
# JSON格式(配合jq)
findmnt -J | jq '.filesystems[]'
# 键值对格式
findmnt -P /mnt/data
# 监控变化
findmnt --poll=2000
提示: findmnt 是现代 Linux 系统中比传统 mount 命令更强大的替代工具。它提供更丰富的功能和更友好的输出格式,特别适合在脚本和自动化任务中使用。