Linux xfs_check命令

重要提示:在较新版本的xfsprogs中,xfs_check命令已被xfs_repair -n替代。本命令主要用于历史版本兼容性。
xfs_check命令 - 检查XFS文件系统一致性的工具,用于验证文件系统元数据的正确性,但不进行修复操作。

命令简介

xfs_check命令是XFS文件系统工具集的一部分,用于检查XFS文件系统的完整性。它验证文件系统的元数据一致性,但不修复发现的问题。主要用于诊断目的,在怀疑文件系统有损坏但不想冒险进行修复时使用。

安装方法

# xfs_check包含在xfsprogs包中
# Ubuntu/Debian
sudo apt-get install xfsprogs

# RHEL/CentOS 7
sudo yum install xfsprogs

# RHEL/CentOS 8/Fedora
sudo dnf install xfsprogs

# Arch Linux
sudo pacman -S xfsprogs

# 验证安装(检查是否有xfs_check命令)
which xfs_check

# 查看版本
xfs_check -V
历史说明:在xfsprogs 3.2.0及以上版本中,xfs_check已被标记为弃用,建议使用xfs_repair -n代替。

基本语法

xfs_check [选项] 设备名

常用选项

选项 说明
-v 详细模式,显示更多信息
-s 跳过某些检查以加快速度
-V 显示版本信息
-h 显示帮助信息

替代命令语法

# 现代替代命令(推荐)
xfs_repair -n 设备名

# 详细检查
xfs_repair -n -v 设备名

# 跳过某些检查
xfs_repair -n -s 设备名

使用示例

示例1:基本文件系统检查

# 检查未挂载的XFS文件系统
sudo xfs_check /dev/sdb1

# 如果看到"xfs_check: XFS file system.",表示检查通过
# 输出示例:
# xfs_check: XFS file system.
# xfs_check: data size 1048576000 too small, minimum 4096

# 更常见的输出(无错误):
# xfs_check: XFS file system.
# xfs_check: xfs_check done.

示例2:详细模式检查

# 使用详细模式获取更多信息
sudo xfs_check -v /dev/sdb1

# 输出会显示详细的检查过程
# xfs_check: XFS file system.
# xfs_check: phase 1 - get inode tree ...
# xfs_check: phase 2 - check inode connectivity ...
# xfs_check: phase 3 - check directory connectivity ...
# xfs_check: xfs_check done.

示例3:使用现代替代命令

# 使用xfs_repair -n(推荐)
sudo xfs_repair -n /dev/sdb1

# 详细模式
sudo xfs_repair -n -v /dev/sdb1

# 输出示例(无错误):
# Phase 1 - find and verify superblock...
# Phase 2 - using internal log
# Phase 3 - for each AG...
# Phase 4 - check for duplicate blocks...
# Phase 5 - rebuild AG headers and trees...
# Phase 6 - check inode connectivity...
# Phase 7 - verify and correct link counts...
# No modify flag set, skipping phase 8
# No modify flag set, skipping logging
# done

示例4:检查已挂载的文件系统

警告:xfs_check和xfs_repair都需要在未挂载的文件系统上运行!
# 错误做法(在已挂载的文件系统上运行)
# sudo xfs_check /dev/mapper/vg-root  # 不要这样做!

# 正确做法:先卸载
sudo umount /data
sudo xfs_check /dev/sdb1

# 或者使用Live CD/USB启动后检查根分区
# 1. 使用Live CD启动系统
# 2. 激活LVM(如果需要)
# vgchange -ay
# 3. 检查文件系统
# xfs_check /dev/mapper/vg-root

示例5:检查日志设备

# XFS文件系统可能有外部日志设备
# 首先查看文件系统信息
sudo xfs_info /dev/sdb1

# 如果有外部日志,可以单独检查
# xfs_check /dev/sdc1  # 日志设备

# 使用xfs_repair检查带有外部日志的文件系统
sudo xfs_repair -n -l /dev/sdc1 /dev/sdb1

示例6:自动化检查脚本

#!/bin/bash
# XFS文件系统自动检查脚本
DEVICE="/dev/sdb1"
MOUNT_POINT="/data"
LOG_FILE="/var/log/xfs_check_$(date +%Y%m%d).log"

echo "=== XFS文件系统检查 $(date) ===" | tee $LOG_FILE

# 检查设备是否存在
if [ ! -b "$DEVICE" ]; then
    echo "错误:设备 $DEVICE 不存在" | tee -a $LOG_FILE
    exit 1
fi

# 检查是否已挂载
if mount | grep -q "$DEVICE"; then
    echo "警告:设备 $DEVICE 已挂载" | tee -a $LOG_FILE
    echo "需要卸载后才能检查" | tee -a $LOG_FILE
    read -p "是否卸载?(y/n): " answer
    if [ "$answer" = "y" ]; then
        umount "$DEVICE" || {
            echo "卸载失败!" | tee -a $LOG_FILE
            exit 1
        }
        echo "设备已卸载" | tee -a $LOG_FILE
    else
        echo "操作取消" | tee -a $LOG_FILE
        exit 0
    fi
fi

# 运行检查(使用现代替代命令)
echo "开始检查文件系统..." | tee -a $LOG_FILE
if sudo xfs_repair -n -v "$DEVICE" 2>&1 | tee -a $LOG_FILE; then
    echo "检查完成,未发现错误" | tee -a $LOG_FILE
    exit_code=0
else
    echo "检查发现错误" | tee -a $LOG_FILE
    exit_code=1
fi

echo "日志文件: $LOG_FILE" | tee -a $LOG_FILE
exit $exit_code

检查流程详解

xfs_repair -n 检查阶段
  1. 阶段1 - 查找和验证超级块
    • 查找主超级块和备用超级块
    • 验证超级块完整性
  2. 阶段2 - 使用内部日志
    • 检查日志设备(如果有)
    • 验证日志完整性
  3. 阶段3 - 检查每个AG(分配组)
    • 验证AG头信息
    • 检查空闲空间位图
  4. 阶段4 - 检查重复块
    • 查找重复分配的块
    • 检查块分配的一致性
  5. 阶段5 - 重建AG头和树
    • 重建空闲空间树
    • 重建inode分配树
  6. 阶段6 - 检查inode连接性
    • 验证目录结构
    • 检查硬链接计数
  7. 阶段7 - 验证和更正链接计数
    • 检查inode的nlink计数
    • 验证目录项的一致性

常见错误信息

错误信息 可能原因 解决方案
xfs_check: not an XFS filesystem 设备不是XFS文件系统 使用blkidfile -s确认文件系统类型
xfs_check: filesystem is mounted 文件系统已挂载 卸载文件系统后再检查
bad magic number 超级块损坏 使用备用超级块:xfs_repair -L -o sb=备份编号 设备
corrupt root inode 根inode损坏 需要专业数据恢复
metadata I/O error 磁盘硬件错误 检查磁盘健康状态:smartctl -a /dev/sdb
stale NFS file handle NFS相关错误 重启NFS服务或检查网络连接

常见问题与解决方案

原因:新版本xfsprogs中已移除xfs_check命令。

解决方案:

# 1. 使用替代命令
sudo xfs_repair -n /dev/sdb1

# 2. 检查xfsprogs版本
xfs_repair -V

# 3. 如果需要xfs_check,可以安装旧版本(不推荐)
# 对于Ubuntu/Debian
sudo apt-get install xfsprogs=3.1.9-1

# 4. 或者从源码编译旧版本(仅限测试环境)
# wget ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.1.9.tar.gz
# tar -xzf xfsprogs-3.1.9.tar.gz
# cd xfsprogs-3.1.9
# ./configure
# make
# sudo make install

方法:使用Live CD/USB或单用户模式

# 方法1:使用Live CD/USB
# 1. 从Live CD/USB启动系统
# 2. 打开终端
# 3. 检查根分区
sudo xfs_repair -n /dev/sda1

# 方法2:单用户模式(如果系统还能启动)
# 1. 重启系统,在GRUB菜单中选择恢复模式
# 2. 选择"root shell"
# 3. 重新挂载根分区为只读
mount -o remount,ro /
# 4. 检查文件系统
xfs_repair -n /dev/sda1

# 方法3:使用systemd急救模式
# 1. 在GRUB内核参数中添加 systemd.unit=rescue.target
# 2. 启动后以root登录
# 3. 检查文件系统

# 注意:检查前确保文件系统未挂载或挂载为只读

处理步骤:

  1. 备份数据(如果可能)
    # 如果文件系统还能挂载,先备份重要数据
    mkdir /backup
    mount -o ro /dev/sdb1 /mnt
    rsync -av /mnt/ /backup/
    umount /mnt
  2. 运行修复
    # 使用xfs_repair进行修复(不带-n选项)
    sudo xfs_repair /dev/sdb1
    
    # 如果有严重错误,可能需要-L选项(强制日志清零)
    sudo xfs_repair -L /dev/sdb1
    
    # 注意:-L选项会破坏未完成的写操作,可能导致数据丢失
  3. 验证修复结果
    # 再次检查
    sudo xfs_repair -n /dev/sdb1
    
    # 如果没有错误,挂载并验证数据
    sudo mount /dev/sdb1 /mnt
    ls -la /mnt
    sudo umount /mnt
  4. 如果修复失败
    # 尝试使用备用超级块
    # 首先查找备用超级块位置
    sudo xfs_db -c "sb 0" -c "print" /dev/sdb1 | grep sbblkno
    
    # 使用第一个备用超级块(通常是32768)
    sudo xfs_repair -o sb=32768 /dev/sdb1

相关命令对比

命令 功能 是否修改文件系统 推荐使用场景
xfs_check 检查XFS文件系统完整性 否(只读) 旧系统兼容性
xfs_repair -n 检查XFS文件系统完整性 否(只读) 现代系统检查(推荐)
xfs_repair 修复XFS文件系统 是(修复) 文件系统损坏修复
xfs_db XFS文件系统调试器 可选 高级调试和恢复
xfs_info 显示XFS文件系统信息 否(只读) 查看文件系统参数
xfs_admin 管理XFS文件系统参数 是(修改) 修改文件系统标签、UUID等

XFS文件系统维护脚本

定期检查脚本
#!/bin/bash
# XFS文件系统定期检查脚本
LOG_DIR="/var/log/xfs_maintenance"
LOG_FILE="$LOG_DIR/xfs_check_$(date +%Y%m%d).log"
ERRORS_FILE="$LOG_DIR/xfs_errors_$(date +%Y%m%d).log"

mkdir -p $LOG_DIR

echo "=== XFS文件系统定期检查 $(date) ===" | tee $LOG_FILE

# 获取所有XFS文件系统
xfs_filesystems=$(lsblk -f | grep xfs | awk '{print $1}')

if [ -z "$xfs_filesystems" ]; then
    echo "未找到XFS文件系统" | tee -a $LOG_FILE
    exit 0
fi

echo "找到的XFS文件系统: $xfs_filesystems" | tee -a $LOG_FILE

# 检查每个文件系统
for fs in $xfs_filesystems; do
    device="/dev/$fs"

    echo "" | tee -a $LOG_FILE
    echo "检查文件系统: $device" | tee -a $LOG_FILE

    # 检查是否已挂载
    if mount | grep -q "^$device"; then
        echo "  $device 已挂载,跳过检查" | tee -a $LOG_FILE
        continue
    fi

    # 运行只读检查
    if sudo xfs_repair -n -v $device 2>&1 | tee -a $LOG_FILE | grep -q "ERROR\|Corruption\|corrupt"; then
        echo "  $device 发现错误!" | tee -a $LOG_FILE
        echo "$device 发现错误 - $(date)" >> $ERRORS_FILE
    else
        echo "  $device 检查通过" | tee -a $LOG_FILE
    fi
done

# 如果有错误,发送通知
if [ -f "$ERRORS_FILE" ] && [ -s "$ERRORS_FILE" ]; then
    echo "" | tee -a $LOG_FILE
    echo "发现文件系统错误,请查看: $ERRORS_FILE" | tee -a $LOG_FILE
    # 可以在这里添加邮件通知
    # mail -s "XFS文件系统错误报警" admin@example.com < $ERRORS_FILE
fi

echo "" | tee -a $LOG_FILE
echo "检查完成,详细日志: $LOG_FILE" | tee -a $LOG_FILE
修复向导脚本
#!/bin/bash
# XFS文件系统修复向导
echo "=== XFS文件系统修复向导 ==="
echo ""
read -p "请输入要检查的设备(如 /dev/sdb1): " device

if [ ! -b "$device" ]; then
    echo "错误:设备 $device 不存在"
    exit 1
fi

# 确认设备未挂载
if mount | grep -q "^$device"; then
    echo "警告:设备 $device 已挂载"
    read -p "是否卸载?(y/n): " unmount_answer
    if [ "$unmount_answer" = "y" ]; then
        sudo umount "$device" || {
            echo "卸载失败!"
            exit 1
        }
        echo "设备已卸载"
    else
        echo "请先手动卸载设备后再运行修复"
        exit 1
    fi
fi

# 第一步:只读检查
echo ""
echo "第一步:运行只读检查..."
sudo xfs_repair -n -v "$device"

read -p "是否发现错误?(y/n): " has_errors

if [ "$has_errors" = "y" ]; then
    echo ""
    echo "第二步:备份重要数据"
    echo "建议:如果可能,先挂载为只读并备份数据"
    read -p "是否已备份重要数据?(y/n): " backed_up

    if [ "$backed_up" = "n" ]; then
        echo "请先备份数据再继续!"
        exit 1
    fi

    echo ""
    echo "第三步:开始修复"
    echo "选择修复选项:"
    echo "1. 标准修复 (xfs_repair)"
    echo "2. 强制日志清零修复 (xfs_repair -L)"
    echo "3. 使用备用超级块修复"
    read -p "请选择 (1-3): " repair_option

    case $repair_option in
        1)
            echo "运行标准修复..."
            sudo xfs_repair -v "$device"
            ;;
        2)
            echo "警告:-L选项会强制清零日志,可能造成数据丢失!"
            read -p "确认继续?(y/n): " confirm
            if [ "$confirm" = "y" ]; then
                sudo xfs_repair -L -v "$device"
            else
                echo "操作取消"
                exit 0
            fi
            ;;
        3)
            read -p "请输入备用超级块编号(默认32768): " sb_num
            sb_num=${sb_num:-32768}
            echo "使用备用超级块 $sb_num 修复..."
            sudo xfs_repair -o sb=$sb_num "$device"
            ;;
        *)
            echo "无效选择"
            exit 1
            ;;
    esac

    echo ""
    echo "第四步:验证修复结果"
    sudo xfs_repair -n "$device"

    if [ $? -eq 0 ]; then
        echo "修复成功!"
    else
        echo "修复后仍有错误,可能需要专业数据恢复"
    fi
else
    echo "未发现错误,无需修复"
fi

echo ""
echo "向导结束"

最佳实践

推荐做法
  • 使用xfs_repair -n替代xfs_check
  • 检查前确保文件系统已卸载
  • 定期检查文件系统健康状况
  • 检查前备份重要数据
  • 记录检查结果用于分析
  • 使用脚本自动化定期检查
  • 在系统空闲时进行检查
  • 监控磁盘SMART状态
避免的做法
  • 不要在已挂载的文件系统上运行检查
  • 不要在生产高峰期进行检查
  • 不要忽略检查发现的错误
  • 不要在没有备份的情况下运行修复
  • 不要随意使用-L选项
  • 不要混合使用新旧版本工具
  • 不要在磁盘故障时反复尝试修复
  • 不要忘记检查日志设备

相关命令

xfs_repair

XFS文件系统修复工具

# 检查模式
xfs_repair -n /dev/sdb1

# 修复模式
xfs_repair /dev/sdb1
xfs_db

XFS文件系统调试器

# 交互式调试
xfs_db /dev/sdb1

# 非交互式命令
xfs_db -x -c "sb 0" -c "print" /dev/sdb1
xfs_info

显示XFS文件系统信息

# 显示文件系统信息
xfs_info /dev/sdb1

# 或通过挂载点
xfs_info /data