AIX 手动修复 JFS2 脏文件系统
手动修复 JFS2 脏文件系统
发布于 2012年6月19日
我想,在系统管理员的职业生涯中,某个时候会在尝试挂载文件系统时看到下面的错误消息。
# mount /testReplaying log for /dev/fslv01.
mount: /dev/fslv01 on /test: Unformatted or incompatible media
The superblock on /dev/fslv01 is dirty. Run a full fsck to fix.
太好了!我们运行 fsck 命令,祈祷一切顺利,并希望超级块被修复,然后我们能够挂载文件系统。然而,假设这个脏文件系统大小为 3 TB 呢?取决于损坏的范围,在 3 TB 文件系统上运行 fsck 可能花费相当长的时间(我们说的是数小时!)。我们再来设想一个完美的情况,说我们愿意让 fsck 运行完,不管它需要多长时间(这是首选方法)。但是,如果 fsck 失败,而我们仍然无法挂载文件系统呢?这里我们有两个选项;选项 1 是从备份恢复文件系统,选项 2 是使用 fsdb 命令编辑超级块并将文件系统标记为干净。
摘自 fsdb 手册页:
“fsdb 命令使您能够检查、更改和调试由 FileSystem 参数指定的文件系统。该命令提供对文件系统对象(例如块、i 节点或目录)的访问。您可以使用 fsdb 命令检查和修补已损坏的文件系统。文件系统的关键组件可以通过符号方式引用。此功能简化了更正控制块条目以及向下遍历文件系统树的过程。”
在此阶段,我想指出,手动编辑文件系统对象是危险的。对于任何停机、数据丢失、肢体损失以及来自管理层的责骂,我概不负责。务必拥有文件系统数据的备份,在最坏的情况下,您可以从中恢复。
以下操作是在一个测试用的 10 GB JFS2 文件系统上完成的。在该示例之后,我会再多解释一些我们到底在修改什么。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | File System: /test File System Size: 20970472 (512 byte blocks) Aggregate Block Size: 4096 Allocation Group Size: 32768 (aggregate blocks) > su [1] s_magic: 'J2FS' [18] s_fscklog: 1 [2] s_version: 2 [19] s_fsckloglen: 50 [3] s_size: 0x00000000013ffbe8 [20] s_bsize: 4096 [4] s_logdev: 0x8000000a00000003 [21] s_logserial: 0x0000000a [5] s_l2bsize: 12 [22] s_logpxd.len: 0 [6] s_l2bfactor: 3 [23] s_logpxd.addr1: 0x00 [7] s_pbsize: 512 [24] s_logpxd.addr2: 0x00000000 [8] s_l2pbsize: 9 s_logpxd.address: 0 [9] s_rsv: Not Displayed [25] s_fsckpxd.len: 131 [10] s_agsize: 0x00008000 [26] s_fsckpxd.addr1: 0x00 [11] s_flag: 0x00000100 [27] s_fsckpxd.addr2: 0x0027ff7d s_fsckpxd.address: 2621309 [28] s_ait.len: 4 J2_GROUPCOMMIT [29] s_ait.addr1: 0x00 [30] s_ait.addr2: 0x0000000b s_ait.address: 11 [12] s_state: 0x00000002 [31] s_fpack: 'fslv01' FM_DIRTY [32] s_fname: '' [13] s_time.tj_sec: 0x000000004fdfdce1 [33] s_time.tj_nsec: 0x00000000 [14] s_ait2.len: 4 [34] s_xfsckpxd.len: 0 [15] s_ait2.addr1: 0x00 [35] s_xfsckpxd.addr1: 0x00 [16] s_ait2.addr2: 0x00000155 [36] s_xfsckpxd.addr2: 0x00000000 s_ait2.address: 341 s_xfsckpxd.address: 0 [17] s_xsize: 0x0000000000000000 [37] s_xlogpxd.len: 0 [40] feature_compat: 0x0000000000000001 [38] s_xlogpxd.addr1: 0x00 [41] feature_rdonly: 0x0000000000000000 [39] s_xlogpxd.addr2: 0x00000000 [42] feature_incompat: 0x0000000000000000 s_xlogpxd.address: 0 [43-49] <...snapshot info...> [50] s_maxext: 0x00000000 display_super: [m]odify, [s]napshot info or e[x]it: m Please enter: field-number value > 12 0x0 [1] s_magic: 'J2FS' [18] s_fscklog: 1 [2] s_version: 2 [19] s_fsckloglen: 50 [3] s_size: 0x00000000013ffbe8 [20] s_bsize: 4096 [4] s_logdev: 0x8000000a00000003 [21] s_logserial: 0x0000000a [5] s_l2bsize: 12 [22] s_logpxd.len: 0 [6] s_l2bfactor: 3 [23] s_logpxd.addr1: 0x00 [7] s_pbsize: 512 [24] s_logpxd.addr2: 0x00000000 [8] s_l2pbsize: 9 s_logpxd.address: 0 [9] s_rsv: Not Displayed [25] s_fsckpxd.len: 131 [10] s_agsize: 0x00008000 [26] s_fsckpxd.addr1: 0x00 [11] s_flag: 0x00000100 [27] s_fsckpxd.addr2: 0x0027ff7d s_fsckpxd.address: 2621309 [28] s_ait.len: 4 J2_GROUPCOMMIT [29] s_ait.addr1: 0x00 [30] s_ait.addr2: 0x0000000b s_ait.address: 11 [12] s_state: 0x00000000 [31] s_fpack: 'fslv01' FM_CLEAN [32] s_fname: '' [13] s_time.tj_sec: 0x000000004fdfdce1 [33] s_time.tj_nsec: 0x00000000 [14] s_ait2.len: 4 [34] s_xfsckpxd.len: 0 [15] s_ait2.addr1: 0x00 [35] s_xfsckpxd.addr1: 0x00 [16] s_ait2.addr2: 0x00000155 [36] s_xfsckpxd.addr2: 0x00000000 s_ait2.address: 341 s_xfsckpxd.address: 0 [17] s_xsize: 0x0000000000000000 [37] s_xlogpxd.len: 0 [40] feature_compat: 0x0000000000000001 [38] s_xlogpxd.addr1: 0x00 [41] feature_rdonly: 0x0000000000000000 [39] s_xlogpxd.addr2: 0x00000000 [42] feature_incompat: 0x0000000000000000 s_xlogpxd.address: 0 [43-49] <...snapshot info...> [50] s_maxext: 0x00000000 display_super: [m]odify, [s]napshot info or e[x]it: x > q Filesystem GB blocks Free %Used Iused %Iused Mounted on /dev/fslv01 10.00 10.00 1% 4 1% /test |
如示例所示,我们现在能够挂载 /test 文件系统。我们通过告知文件系统它已“干净”来实现这一点。下面是对重要行的逐项说明。
第 1 行 – 在 /test 文件系统上调用 fsdb。
第 9 行 – 显示超级块。
第 26 行 – 显示字段编号 [12] 的 s_state 被标记为 FM_DIRTY,由值 0x2 表示。
第 38 行 – 使 fsdb 进入修改模式。
第 39 行 – 通过将值改为 0x0,将字段编号 [12] 的 s_state 更改为 FM_CLEAN。
在所有情况下,你都应运行 fsck 来修复此问题。如果 fsck 失败,从备份恢复至少能确保数据完整性。我展示这种方法只是作为一种替代方法,供那些遇到阻碍、没有备份且需要尽可能挽救文件系统上数据的人使用。再次强调,使用此方法风险自负!
此条目发布于 AIX 并标记为 aix, 文件系统, fsdb, jfs2 由 Kristijan. 收藏 永久链接.
关于“手动修复脏 JFS2 文件系统”的 11 条想法
- Adriana 于 2013 年 8 月 30 日上午 7:03 说:
你的文章帮我度过了一段非常艰难的时期……非常感谢,真的非常感谢!!…
回复 ↓
- sagar 于 2014 年 3 月 5 日下午 7:32 说:
老兄,你真是帮了我大忙。
回复 ↓
- Gajanan 于 2014年5月14日下午2:13 说:
bash-3.2# mount /ora11g
Replaying log for /dev/fslv02.
mount: 0506-324 Cannot mount /dev/fslv02 on /ora11g: The media is not formatted or the format is not correct.
0506-342 The superblock on /dev/fslv02 is dirty. Run a full fsck to fix.bash-3.2# fsck -n /ora11gThe current volume is: /dev/fslv02
Primary superblock is valid.
*** Phase 1 – Initial inode scan
*** Phase 2 – Process remaining directories
*** Phase 3 – Process remaining files
*** Phase 4 – Check inode allocation map
*** Phase 5 – Check block allocation map
File system is clean.
File system is clean but is marked dirty.
使用 -p 参数运行 fsck 进行修复。
bash-3.2# fsck -p /ora11gThe current volume is: /dev/fslv02
Primary superblock is valid.
*** Phase 1 – Initial inode scan
*** Phase 2 – Process remaining directories
*** Phase 3 – Process remaining files
*** Phase 4 – Check and repair inode allocation map
*** Phase 5 – Check and repair block allocation map
File system is clean.
Superblock is marked dirty (FIXED)
All observed inconsistencies have been repaired.
bash-3.2# mount /ora11g回复 ↓
- Konundrum 于 2016年5月1日上午1:49 说:
老兄,你太棒了!你的解决方案帮我搞定了,非常感谢
回复 ↓
- Richie 于 2016年8月31日凌晨12:39 说:
非常感谢!你的解决方案帮我恢复了大量数据。
errpt showed:LABEL: J2_METADATA_CORRUPT
Description :FILE SYSTEM CORRUPTION
Detail Data: FILE SYSTEM DEVICE AND MOUNT POINT /dev/orabinlv, /u01
关机后 /u01 无法挂载,所以我运行了 fsck 进行修复
$ fsck -y /dev/orabinlvThe current volume is: /dev/orabinlv
Primary superblock is valid.
J2_LOGREDO:log redo processing for /dev/orabinlv Primary superblock is valid.
*** Phase 1 – Initial inode scan
Inode 3735694 has corrupt data (0).
Directory inode 3735694 has an invalid node (REMOVED) Superblock marked dirty because repairs are about to be written.
Inode 3735694 has a corrupt backward sibling chain (FIXED) Inode 3735694 has bad size (FIXED) Inode 3735694 has incorrect block count (FIXED) Inode 7618321 has insufficient size.
Cannot repair inode 7618321 (RELEASED)
*** Phase 2 – Process remaining directories
此时 fsck 已运行约 72h(整个周末),我们不知道它还要运行多久(在 /u01 上约有 500 万个文件),于是把它终止了,随后 mount 失败:
$ mount /u01
Replaying log for /dev/orabinlv.
mount: 0506-324 Cannot mount /dev/orabinlv on /u01: The media is not formatted or the format is not correct.
0506-342 The superblock on /dev/orabinlv is dirty. Run a full fsck to fix.然后我们尝试了你的解决方案,能够访问这些文件;进行备份;然后重新创建损坏的文件系统,并从备份中恢复文件。
再次感谢!!
回复 ↓
- Kristijan于 2016年8月31日上午6:52 说:
很高兴你能够恢复文件系统,也很高兴这篇博客文章能帮到你。
回复 ↓
- Manoj 于 2017年1月31日凌晨2:11 说:
非常感谢,你的信息对我帮助很大。
回复 ↓
- mike 于 2017年3月11日晚上11:49 说:
Kristijan——你的博客非常清楚,但我想弄明白我们正在修复什么?
我们是通过更改字段来使文件系统变为干净,还是因为文件系统现在显示为“干净”状态而使其变为“可挂载”?
回复 ↓
- Kristijan于 2017年3月15日上午8:26 说:
嗨,Mike,
本质上两者都是。
我们正在翻转那个将文件系统从脏标记变为干净标记的位,这正是 mount 命令在实际挂载文件系统之前会检查的内容。
回复 ↓
- Sid 于 2017年8月6日下午2:57 说:
太好了,真是太棒了。谢谢!!
非常感谢!!!感谢分享。
回复 ↓
- Chris 于 2018年4月24日凌晨3:03 说:
Kristijan,
这是我在尝试挂载文件系统 /u/db 时收到的错误。
# mount /u/db
Replaying log for /dev/fslv01.
Assertion failed: hi >= XTENTRYSTART, file ../../../../../../../src/bos/sbin/helpers/jfs2/libj2/xtree.cpp, line 102
mount: 0506-324 Cannot mount /dev/fslv01 on /u/db: The media is not formatted or the format is not correct.
0506-342 The superblock on /dev/fslv01 is dirty. Run a full fsck to fix.运行了 fsck /u/db 并收到此消息。
The current volume is: /dev/fslv01
Primary superblock is valid.
J2_LOGREDO:log redo processing for /dev/fslv01
Assertion failed: hi >= XTENTRYSTART, file ../../../../../../../src/bos/sbin/helpers/jfs2/libj2/xtree.cpp, line 102
exec module "/sbin/helpers/jfs2/logredo64" failed.
logredo failed (rc=255). fsck continuing.
Primary superblock is valid.
Invalid data detected in aggregate inode 1.
fsck: 0507-278 Cannot continue.
File system is dirty.
*** Phase 6 – Reformat inline log
已执行您上面建议的步骤,仍然无法挂载文件系统。
仍收到相同的挂载错误。您有什么想法?