AIX 手动修复 JFS2 脏文件系统

手动修复 JFS2 脏文件系统

发布于 2012年6月19日

我想,在系统管理员的职业生涯中,某个时候会在尝试挂载文件系统时看到下面的错误消息。

# mount /test

Replaying 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

# fsdb /test

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

# mount /test
# df -g /test

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 条想法

  1. Adriana 于 2013 年 8 月 30 日上午 7:03 说:

你的文章帮我度过了一段非常艰难的时期……非常感谢,真的非常感谢!!…

回复 ↓

  1. sagar 于 2014 年 3 月 5 日下午 7:32 说:

老兄,你真是帮了我大忙。

回复 ↓

  1. 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 /ora11g

The 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 /ora11g

The 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

回复 ↓

  1. Konundrum 于 2016年5月1日上午1:49 说:

老兄,你太棒了!你的解决方案帮我搞定了,非常感谢

回复 ↓

  1. 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/orabinlv

The 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.

然后我们尝试了你的解决方案,能够访问这些文件;进行备份;然后重新创建损坏的文件系统,并从备份中恢复文件。

再次感谢!!

回复 ↓

  1. Kristijan于 2016年8月31日上午6:52 说:

很高兴你能够恢复文件系统,也很高兴这篇博客文章能帮到你。

回复 ↓

  1. Manoj 于 2017年1月31日凌晨2:11 说:

非常感谢,你的信息对我帮助很大。

回复 ↓

  1. mike 于 2017年3月11日晚上11:49 说:

Kristijan——你的博客非常清楚,但我想弄明白我们正在修复什么?
我们是通过更改字段来使文件系统变为干净,还是因为文件系统现在显示为“干净”状态而使其变为“可挂载”?

回复 ↓

  1. Kristijan于 2017年3月15日上午8:26 说:

嗨,Mike,

本质上两者都是。
我们正在翻转那个将文件系统从脏标记变为干净标记的位,这正是 mount 命令在实际挂载文件系统之前会检查的内容。

回复 ↓

  1. Sid 于 2017年8月6日下午2:57 说:

太好了,真是太棒了。谢谢!!

非常感谢!!!感谢分享。

回复 ↓

  1. 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

已执行您上面建议的步骤,仍然无法挂载文件系统。
仍收到相同的挂载错误。您有什么想法?

13 次浏览 更新于 2026-11-07

同组文章性能与故障案例

查看本组全部 6 篇

没有找到想要的答案?

上传日志让 AI 帮你诊断,或者在控制台里直接向 AI 提问。