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 命令更强大的替代工具。它提供更丰富的功能和更友好的输出格式,特别适合在脚本和自动化任务中使用。