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
xfs_repair -n代替。
xfs_check [选项] 设备名
| 选项 | 说明 |
|---|---|
-v |
详细模式,显示更多信息 |
-s |
跳过某些检查以加快速度 |
-V |
显示版本信息 |
-h |
显示帮助信息 |
# 现代替代命令(推荐)
xfs_repair -n 设备名
# 详细检查
xfs_repair -n -v 设备名
# 跳过某些检查
xfs_repair -n -s 设备名
# 检查未挂载的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.
# 使用详细模式获取更多信息
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.
# 使用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
# 错误做法(在已挂载的文件系统上运行)
# 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
# XFS文件系统可能有外部日志设备
# 首先查看文件系统信息
sudo xfs_info /dev/sdb1
# 如果有外部日志,可以单独检查
# xfs_check /dev/sdc1 # 日志设备
# 使用xfs_repair检查带有外部日志的文件系统
sudo xfs_repair -n -l /dev/sdc1 /dev/sdb1
#!/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_check: not an XFS filesystem |
设备不是XFS文件系统 | 使用blkid或file -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. 检查文件系统
# 注意:检查前确保文件系统未挂载或挂载为只读
处理步骤:
# 如果文件系统还能挂载,先备份重要数据
mkdir /backup
mount -o ro /dev/sdb1 /mnt
rsync -av /mnt/ /backup/
umount /mnt
# 使用xfs_repair进行修复(不带-n选项)
sudo xfs_repair /dev/sdb1
# 如果有严重错误,可能需要-L选项(强制日志清零)
sudo xfs_repair -L /dev/sdb1
# 注意:-L选项会破坏未完成的写操作,可能导致数据丢失
# 再次检查
sudo xfs_repair -n /dev/sdb1
# 如果没有错误,挂载并验证数据
sudo mount /dev/sdb1 /mnt
ls -la /mnt
sudo umount /mnt
# 尝试使用备用超级块
# 首先查找备用超级块位置
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等 |
#!/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-L选项xfs_repairXFS文件系统修复工具
# 检查模式
xfs_repair -n /dev/sdb1
# 修复模式
xfs_repair /dev/sdb1
xfs_dbXFS文件系统调试器
# 交互式调试
xfs_db /dev/sdb1
# 非交互式命令
xfs_db -x -c "sb 0" -c "print" /dev/sdb1
xfs_info显示XFS文件系统信息
# 显示文件系统信息
xfs_info /dev/sdb1
# 或通过挂载点
xfs_info /data