xfs文件系统损坏修复
1.报错信息
(1)进入/data目录(服务器存放业务数据的目录)会报如下错误,进入其他目录正常
[root@localhost /]# cd /data
[root@localhost data]# ls
ls: cannot open directory .: Input/output error
(2)执行dmesg命令,内核日志报错:
[78652.038949] Call Trace:
[78652.038958] [<ffffffff9bfb1bec>] dump_stack+0x19/0x1f
[78652.039009] [<ffffffffc065cbaf>] xfs_error_report+0x3f/0x50 [xfs]
[78652.039038] [<ffffffffc061a92d>] ? xfs_alloc_ag_vextent_near+0x58d/0xa50 [xfs]
[78652.039063] [<ffffffffc0617fe4>] xfs_alloc_fixup_trees+0x2c4/0x370 [xfs]
[78652.039089] [<ffffffffc061a92d>] xfs_alloc_ag_vextent_near+0x58d/0xa50 [xfs]
[78652.039116] [<ffffffffc061b19d>] xfs_alloc_ag_vextent+0x10d/0x150 [xfs]
[78652.039142] [<ffffffffc061bceb>] xfs_alloc_vextent+0x3fb/0x520 [xfs]
[78652.039185] [<ffffffffc062a1e8>] xfs_bmap_btalloc+0x7b8/0x7e0 [xfs]
[78652.039217] [<ffffffffc062a21e>] xfs_bmap_alloc+0xe/0x20 [xfs]
[78652.039251] [<ffffffffc062bbf7>] xfs_bmapi_write+0x4c7/0xb70 [xfs]
[78652.039300] [<ffffffffc067ac67>] ? kmem_zone_alloc+0x97/0x130 [xfs]
[78652.039347] [<ffffffffc06696f2>] xfs_iomap_write_allocate+0x182/0x390 [xfs]
[78652.039389] [<ffffffffc06527b6>] xfs_map_blocks+0x1a6/0x220 [xfs]
[78652.039428] [<ffffffffc0653834>] xfs_do_writepage+0x174/0x550 [xfs]
[78652.039434] [<ffffffff9b9d599c>] write_cache_pages+0x21c/0x480
[78652.039468] [<ffffffffc06536c0>] ? xfs_vm_writepages+0xb0/0xb0 [xfs]
[78652.039477] [<ffffffff9bb6a650>] ? submit_bio+0x70/0x150
[78652.039483] [<ffffffff9b8ee4c8>] ? update_group_power+0x28/0x280
[78652.039491] [<ffffffff9bb9c485>] ? cpumask_next_and+0x35/0x50
[78652.039520] [<ffffffffc065367b>] xfs_vm_writepages+0x6b/0xb0 [xfs]
[78652.039527] [<ffffffff9b9d6a41>] do_writepages+0x21/0x50
[78652.039534] [<ffffffff9ba8cc80>] __writeback_single_inode+0x40/0x260
[78652.039540] [<ffffffff9b8cc745>] ? wake_up_bit+0x25/0x30
[78652.039545] [<ffffffff9ba8d84c>] writeback_sb_inodes+0x1cc/0x430
[78652.039551] [<ffffffff9ba8db57>] __writeback_inodes_wb+0xa7/0xe0
[78652.039556] [<ffffffff9ba8e033>] wb_writeback+0x263/0x2f0
[78652.039562] [<ffffffff9ba78ffc>] ? get_nr_inodes+0x4c/0x70
[78652.039568] [<ffffffff9ba8ec3f>] bdi_writeback_workfn+0x2cf/0x470
[78652.039576] [<ffffffff9b8c32ef>] process_one_work+0x17f/0x440
[78652.039582] [<ffffffff9b8c4436>] worker_thread+0x126/0x3c0
[78652.039588] [<ffffffff9b8c4310>] ? manage_workers.isra.26+0x2b0/0x2b0
[78652.039592] [<ffffffff9b8cb621>] kthread+0xd1/0xe0
[78652.039598] [<ffffffff9b8cb550>] ? insert_kthread_work+0x40/0x40
[78652.039603] [<ffffffff9bfc51dd>] ret_from_fork_nospec_begin+0x7/0x21
[78652.039608] [<ffffffff9b8cb550>] ? insert_kthread_work+0x40/0x40
[78652.039621] XFS (dm-1): page discard on page ffffd36080563680, inode 0x880002a0f, offset 99975168.
[78677.041710] XFS (dm-1): Internal error XFS_WANT_CORRUPTED_RETURN at line 429 of file fs/xfs/libxfs/xfs_alloc.c. Caller xfs_alloc_ag_vextent_near+0x58d/0xa50 [xfs]
[78677.049267] CPU: 2 PID: 16607 Comm: kworker/u129:1 Kdump: loaded Tainted: P OE ------------ T 3.10.0-1160.92.1.el7.x86_64 #1
[78677.049271] Hardware name: New H3C Technologies Co., Ltd. H3C UniServer R4900 G5/RS35M2C16SB, BIOS 5.62.10 06/01/2023
[78677.049282] Workqueue: writeback bdi_writeback_workfn (flush-253:1)
2.当前磁盘现状
物理磁盘/dev/sdc 做成LVM逻辑卷/dev/mapper/vgdata-lvdata 挂载到 /data目录,作为业务的数据目录。
3.问题分析
(1)错误位置:XFS (dm-1): Internal error XFS_WANT_CORRUPTED_RETURN at line 429 of file fs/xfs/libxfs/xfs_alloc.c
- 表示 XFS 文件系统的空间分配器(allocator)检测到元数据不一致。
触发点:后台写回进程(bdi_writeback_workfn)尝试分配磁盘块时失败。
(2)根本原因
- 元数据损坏:可能是突然断电、硬件故障或内核 Bug 导致文件系统结构(如空闲空间树)损坏。
硬件风险:日志中反复出现 I/O 错误(page discard),需优先排查磁盘健康。
4.处理方法
(1)卸载文件系统
umount /data
- 如提示:Device or resource busy:,则执行
umount -l /data
(2)修复磁盘说明
- 需要修复的是逻辑卷设备
xfs_repair -vL /dev/mapper/vgdata-lvdata
或
xfs_repair -vL /dev/vgdata/lvdata
- 为什么不是 /dev/sdc?/dev/sdc是物理磁盘,其上可能有LVM的物理卷(PV)结构,但实际文件系统建立在逻辑卷(LV)上。直接操作 /dev/sdc会破坏LVM元数据,导致更严重的问题。
(3)运行xfs修复工具(centos自带的)
xfs_repair -vL /dev/mapper/vgdata-lvdata
- 报错如下:
[root@localhost /]# xfs_repair -vL /dev/mapper/vgdata-lvdata
xfs_repair: cannot open /dev/mapper/vgdata-lvdata: Device or resource busy
- 上述报错是因为LVM还有进程在占用,无法卸载,可以将自动挂载去掉,重启服务器来解除占用
[root@localhost ~]# cat /etc/fstab
# /dev/vgdata/lvdata /data xfs defaults 0 0
- 重启服务器
reboot
(4)重启服务器后,继续执行xfs修复
xfs_repair -vL /dev/mapper/vgdata-lvdata
- 修复成功会显示:
Phase 7 - Verify and correct inode counts...
done
5.测试修复是否成功
(1)cd /data 或者 ls /data 不会再输出”Input/output error“
(2)可以正常创建文件和目录

浙公网安备 33010602011771号