+ -
当前位置:首页 → 问答吧 → 折腾了一晚上的fsdb,还是没弄懂?

折腾了一晚上的fsdb,还是没弄懂?

时间:2009-01-04

来源:互联网

看了rm的那个帖子,折腾了一晚上的fsdb,还是没有弄成功,那位老大能详细讲讲,怎么用fsdb恢复数据啊?这一招真的很吊

作者: 刘梓涵   发布时间: 2009-01-04

建了1个/dev/fslv02,/test2,文件1.log

rm 1.log
ls -id /test2
2
umount /test2
fsdb /test(红的是我输的)

2i
i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
szh:        0  szl:      512  (actual size:      512)
a0: 0x0b        a1: 0x00        a2: 0x00        a3: 0x00        
a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00        
at: Sun Jan 04 08:18:53 2009
mt: Sun Jan 04 08:18:40 2009
ct: Sun Jan 04 08:18:40 2009

a0b
0x000000b000  :  0x00000000 (0)

p128c
0x000000b000:   \0 \0 \0 \? \0 \? \0 \? .  \0 \0 \0 \0 \0 \0 \?
0x000000b010:   \0 \? \0 \? .  .  \0 \0 \0 \0 \0 \? \? ? \0 \n
0x000000b020:   l  o  s  t  +  f  o  u  n  d  \0 \0 \0 \0 \0 \?
0x000000b030:   \? ? \0 \? 1  .  l  o  g  \0 \0 \0 \0 \0 \0 \0
0x000000b040:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0x000000b050:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0x000000b060:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0x000000b070:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

p128e

0x000000b000:         0       2      12       1   11776       0       0       2
0x000000b010:        12       2   11822       0       0      16     488      10
0x000000b020:     27759   29556   11110   28533   28260       0       0      17
0x000000b030:       468       5   12590   27759   26368       0       0       0
0x000000b040:         0       0       0       0       0       0       0       0
0x000000b050:         0       0       0       0       0       0       0       0
0x000000b060:         0       0       0       0       0       0       0       0
0x000000b070:         0       0       0       0       0       0       0       0
0x000000b080:         0       0       0       0       0       0       0       0
0x000000b090:         0       0       0       0       0       0       0       0
0x000000b0a0:         0       0       0       0       0       0       0       0
0x000000b0b0:         0       0       0       0       0       0       0       0
0x000000b0c0:         0       0       0       0       0       0       0       0
0x000000b0d0:         0       0       0       0       0       0       0       0
0x000000b0e0:         0       0       0       0       0       0       0       0
0x000000b0f0:         0       0       0       0       0       0       0       0


后面就不太懂了,要修改什么,又怎么修改,谁来讲讲啊!

附上ibm上的文档,http://www-01.ibm.com/support/do ... 71b48256d40001f7b87

作者: 刘梓涵   发布时间: 2009-01-04

Jfs/jfs2恢复文件/目录的办法不止那一个。

fsdb的接触层面非常低了,你必须明白jfs1和jfs2的不同layout,jfs使用线性记录,jfs2使用B-tree,遍历办法不同。因此fsdb对jfs1和jfs2有完全不同的界面和子命令。

而且原来rm的帖子的文章只写了对jfs的操作过程,而没有告诉你原理,甚至计算大inode number的方法都没有讲。而且最终需要依赖fsck找回文件放在lost+found下。

作者: projects   发布时间: 2009-01-04

man fsdb

p128d  d是以目录格式显示 这样就会很清楚

如果删除文件,那么目录中的变化就是,这个被删除文件的上一个文件的名字长度会加长,把被删除文件的目录项覆盖

把长度给改回来,在fsck就可能恢复出来

好像是这样,记不清了,主要用d这个参数就很容易看懂了

作者: tenyears   发布时间: 2009-01-04

做个记号,明天来玩玩

作者: 闲云   发布时间: 2009-01-04

先看一下

作者: pengliangxian   发布时间: 2009-01-04

原帖由 projects 于 2009-1-4 23:14 发表
Jfs/jfs2恢复文件/目录的办法不止那一个。

fsdb的接触层面非常低了,你必须明白jfs1和jfs2的不同layout,jfs使用线性记录,jfs2使用B-tree,遍历办法不同。因此fsdb对jfs1和jfs2有完全不同的界面和子命令。
...



有什么更好的方法可以恢复rm的数据呢?我google了很多,基本都是那篇fsdb的文档啊。

作者: 刘梓涵   发布时间: 2009-01-04

就以你的例子解释。
首先说明,这些操作只对jfs1有效,jfs2有不同。#后是注释。麻烦自己识别字符,16进制和10进制数据及转换,以下不会特别注明。

ls -id /test2  #找文件系统目录i-node,这里用楼主inode 2
unmount /test2  

fsdb /test2  #启动fsdb

2i  #指向目录inode

a0b #指向第一个block. 通常jfs的目录会先占用头512byte, 如果不够会延伸4096byte. 所以要找的文件如果不在第一个block, 看后面的。

p128c  #字符形式显示前128,所以你显示256或者512也行,但一般都没有必要。

a0b     #必须输入,使指针回到 a0 处,否者显示的是下一个128.

p128e  #e为显示十进制数据。

0x000000b000:         0       2      12       1   11776       0       0       2
0x000000b010:        12       2   11822       0       0      16     488      10
0x000000b020:     27759   29556   11110   28533   28260       0       0      17
0x000000b030:       468       5   12590   27759   26368       0       0       0
0x000000b040:         0       0       0       0       0       0       0       0
0x000000b050:         0       0       0       0       0       0       0       0
0x000000b060:         0       0       0       0       0       0       0       0
0x000000b070:         0       0       0       0       0       0       0       0
0x000000b080:         0       0       0       0       0       0       0       0
0x000000b090:         0       0       0       0       0       0       0       0
0x000000b0a0:         0       0       0       0       0       0       0       0
0x000000b0b0:         0       0       0       0       0       0       0       0
0x000000b0c0:         0       0       0       0       0       0       0       0
0x000000b0d0:         0       0       0       0       0       0       0       0
0x000000b0e0:         0       0       0       0       0       0       0       0
0x000000b0f0:         0       0       0       0       0       0       0       0

#这里的关键是数据结构, i-node占前两位,然后是记录长度一位,然后是文件名长度一位,然后是文件名,这里不考虑长文件名和长目录记录的状况。你在p128c的时候可以看到被删除文件的文件名1.log, 这时可以记录文件名开始的位置0xb035,实际来说因为操作在同一屏幕对照看就行了。那么看p128e中0xb035的位置,是12590,这实际是1.log的开始位置,之前的5就是文件名长度,468就是记录长度,0和17就是inode。这里就涉及到计算的问题,原文很是模糊,这里是我的办法,当inode大于255的时候,也就是第一位也有数据那么就是:第一个数据x65536+第二位数据=inode, 这里就是0x65536+17=17.  这个数据其实p128d也能看得非常清楚,但明白起见,这里用p128e来看。

#题外一点,这里可以看到1.log的记录长度是468,也就是cover了512byte中除了前面数据剩下的全部数据,这也是告诉文件系统我后面没文件了,确实后面全是0。再看前面一条记录lost+found记录长度竟然是488,为什么?因为1.log被删除了,系统读lost+found记录时就认为后面没有记录了,如果1.log没有被删除,那么lost+found的记录长度就应该是20. 不信在删除前可以看看。系统是根据记录长度和文件名长度来读取文件名的,根据inode来找到真实数据的。在下一个文件名/目录名没有被写入时,我们都能将他们找回。

#然后的步骤就是看真实inode.LZ例子
17i
#这里会有"ln 0”显示。也就是说接下来的数据没有被链接。
17i.ln=1 #修改inode数据,将ln改为1,也就是告诉文件系统我是有用的,不过有错误而已。验证一下17i,这是ln 就会是1了。

q #退出fsdb

然后

fsck /dev/fslv02 #无需mount,也不建议mount检查文件系统,所有选项都是yes.

完成后
mount /test2

去lost+found你会找到类似17文件名的文件,这就是你要的文件,
cp /test/lost_found/17 /test/1.log.  #实际情况中除非你删掉的是目录中第一个记录,在不修改目录数据中丢失文件前一文件的记录长度时,不可能fsck后修复的文件以原始文件名还原到原始位置。至于如何修改前一记录长度涉及一点计算和修改操作,具体就man fsdb得了。

记住以上操作是基于jfs1,数据的记录方式是线性的,操作相对显而易见。jfs2用b-tree, 实际也无非找回家长树叶之类的,但相对非常灵活,在缺乏文档时理解和操作会更困难点。另外更高档一点修复丢失文件方式是snapshot或者logredo, 这毕竟是Journaled File System,也就是操作有记录并可回复的。

BTW,IBM的同学也确实要提高一下了,自己的东西拿人家的文章都不能解释清楚一点。

[ 本帖最后由 projects 于 2009-1-5 03:45 编辑 ]

作者: projects   发布时间: 2009-01-05

好人做到底,接下来玩一下如何直接回复文件名到原始目录,也就是IBM文章的第二部分,但他们写得太confuse了。我们可以用上面tenyears的idea
还是以上面LZ操作为例.
当操作到17i.ln=1的时候不退出fsdb
而是从新回到目录inode, (这一步早过修改数据inode链接都可,一定要注意指针指向正确的节点和block)

2i #指向目录inode
a0b #指向a0 block
p128d  #显示目录结构

删除1.log后应该显示(模拟的,具体可能有不同)
d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 488/10)
d4 (slot=512):    0   (d_reclen/d_namlen = 512/0)
d5 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
d6 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
d7 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
d8 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
d9 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
d10 (slot=3584):    0   (d_reclen/d_namlen = 512/0)

d2.rl=20  #d2是你需要修改的记录(你删除文件前的一项),rl是fsdb里用来改变记录长度(d_reclen)的子命令, 20是在p128e时488-468=20得出的,但实际上人工也可以数出来。

然后
a0b #回到a0

p128d #验证一下

会显示
d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 20/10)
d3 (slot=60):   17  1.log (d_reclen/d_namlen = 468/5)
d4 (slot=512):    0   (d_reclen/d_namlen = 512/0)
d5 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
d6 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
d7 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
d8 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
d9 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
d10 (slot=3584):    0   (d_reclen/d_namlen = 512/0)

q  #退出

fsck /dev/fslv02  #这只是为了保证文件系统的完整性. 实际上此时文件已经回到了原始的位置,而且毫发无损。你可以跳过这一步验证一下。因为rm除了修改了目录inode中前一记录长度和数据inode ln之外也修改了i-node map &/block map,而我们并没有改回,如果不做fsck,文件虽然可用,但此时文件系统的完整性得不到保证。

mount /test2

文件就在那里了。

到此,对rm jfs文件系统基本可以算完美了,整个过程主要依赖于fsdb和fsck来实现,fsdb是相当底层的工具,相比而言,fsck高层很多,可实现的功能更为复杂,以上的rm修复实际上两个步骤中单独一样+fsck都可以恢复,解释一下也就是方便大家搞明白原理。BTW 有谁弄明白了,大可以整理一下把两篇合二为一赚个精华也可以,标上lu和projects转载也行。Jfs2要复杂不少,打字太累了,有能力还是自己玩吧。good luck。

[ 本帖最后由 projects 于 2009-1-5 03:58 编辑 ]

作者: projects   发布时间: 2009-01-05

作者: zhangyanx   发布时间: 2009-01-05

projects 牛

作者: beginner-bj   发布时间: 2009-01-05

终于看到一篇说的比较清楚的了

作者: bpmf   发布时间: 2009-01-05

不错,好好研究一下

作者: brucewoo   发布时间: 2009-01-05

projecs,只能说我对你的敬仰犹如滔滔江水,连绵不绝…………

作者: 刘梓涵   发布时间: 2009-01-05

作者: zhangyi1201   发布时间: 2009-01-05

太强大了,我我我要认真学习

作者: lj_cd   发布时间: 2009-01-05

经典教学帖..学习了~~谢谢~

作者: ramon725   发布时间: 2009-01-05

很奇怪的问题,我按照project的方法做了,可以恢复出文件,但是用ls -l,就停在那里了,但是用ls就可以显示文件,是咋回事情啊?

作者: 刘梓涵   发布时间: 2009-01-05

嗯,不错,收藏一下 有空玩玩

作者: fhbkyo   发布时间: 2009-01-05

原帖由 刘梓涵 于 2009-1-5 11:27 发表
很奇怪的问题,我按照project的方法做了,可以恢复出文件,但是用ls -l,就停在那里了,但是用ls就可以显示文件,是咋回事情啊?


It happens. You may get the file name back, but no content; you may fix the link and file name, but did not fix the i-node map etc, that's why run fsck with file system unmount after. just be careful about your operations. check yourself. esp, point location, like which inode number you're running under, which block you are pointing to. Try to understand before do anything.

Also make a file with content for test, not just empty file. Otherwise u won't be able tell if you just get file name back or real file back. Also make more than one file under your test directory, compare data before rm and after, you will get more clear image that what you are doing.

Good luck.

[ 本帖最后由 projects 于 2009-1-5 12:23 编辑 ]

作者: projects   发布时间: 2009-01-05

咋说呢,只有一个字,“牛”

作者: 刘梓涵   发布时间: 2009-01-05

这个贴技术含量高。路过补个钙

作者: wwrko   发布时间: 2009-01-05

LU的技术专家,都不是一般的牛

作者: 老农   发布时间: 2009-01-05

project是不是在国外啊?

作者: 刘梓涵   发布时间: 2009-01-05

他在美国

作者: 老农   发布时间: 2009-01-05

创建一个jfs文件系统/test,并复制一个约51MB的文件aaa进去,然后再复制一份,叫做zzz,则/test下有两个内容一样的文件aaa,zzz。并用fsdb查看正常的目录inode

  1. [43p150:root:/] mklv -y testlv rootvg 4
  2. testlv
  3. [43p150:root:/] crfs -v jfs -d /dev/testlv -m /test
  4. Based on the parameters chosen, the new /test JFS file system
  5. is limited to a maximum size of 134217728 (512 byte blocks)
  6. New File System size is 524288
  7. [43p150:root:/] mount /test
  8. [43p150:root:/] cd test
  9. [43p150:root:/test] cp /setup/aaa .
  10. [43p150:root:/test] l
  11. total 100496
  12. -rw-r--r--   1 root     sys        51449856 Jan 08 10:26 aaa
  13. drwxrwx---   2 root     system          512 Jan 08 10:26 lost+found
  14. [43p150:root:/test] cp aaa zzz
  15. [43p150:root:/test] cd ..
  16. [43p150:root:/] umount /test
  17. [43p150:root:/] fsdb /test

  18. File System:                                 /test
  19. File System Size:                            524288  (512 byte blocks)
  20. Disk Map Size:                                    6  (4K blocks)
  21. Inode Map Size:                                   6  (4K blocks)
  22. Fragment Size:                                 4096  (bytes)
  23. Allocation Group Size:                         2048  (fragments)
  24. Inodes per Allocation Group:                   2048
  25. Total Inodes:                                 65536
  26. Total Fragments:                              65536
  27. 2i
  28. i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
  29. szh:        0  szl:      512  (actual size:      512)
  30. a0: 0x11        a1: 0x00        a2: 0x00        a3: 0x00
  31. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  32. at: Thu Jan 08 10:26:52 1970
  33. mt: Thu Jan 08 10:26:55 1970
  34. ct: Thu Jan 08 10:26:55 1970
  35. a0b
  36. 0x0000011000  :  0x00000000 (0)
  37. p128y
  38. 0x0000011000:  00 00 00 02 00 0C 00 01 2E 00 00 00 00 00 00 02
  39. 0x0000011010:  00 0C 00 02 2E 2E 00 00 00 00 00 10 00 14 00 0A
  40. 0x0000011020:  6C 6F 73 74 2B 66 6F 75 6E 64 00 00 00 00 00 11
  41. 0x0000011030:  00 0C 00 03 61 61 61 00 00 00 00 12 01 C8 00 03
  42. 0x0000011040:  7A 7A 7A 00 00 00 00 00 00 00 00 00 00 00 00 00
  43. 0x0000011050:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  44. 0x0000011060:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  45. 0x0000011070:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  46. q
  47. [43p150:root:/] fsck /test

  48. ** Checking /dev/rtestlv (/test)
  49. ** Phase 1 - Check Blocks and Sizes
  50. ** Phase 2 - Check Pathnames
  51. ** Phase 3 - Check Connectivity
  52. ** Phase 4 - Check Reference Counts
  53. ** Phase 5 - Check Inode Map
  54. ** Phase 6 - Check Block Map
  55. 10 files 217736 blocks 306552 free
复制代码


以上看到,文件aaa的inode号是00 00 00 11=17,记录长度是00 0C=12。文件zzz的inode号是00 00 00 12=18,记录长度是01 C8=456。

删除zzz,并作fsdb,先用第二种方法恢复,就是尝试将文件直接恢复到原目录原名称的方法,inode 18的link(ln)设置为1,然后修改前面一个文件aaa的记录长度为12(恢复成原样)。

  1. [43p150:root:/] mount /test
  2. [43p150:root:/] rm test/zzz
  3. [43p150:root:/] umount /test
  4. [43p150:root:/] fsck /test

  5. ** Checking /dev/rtestlv (/test)
  6. ** Phase 1 - Check Blocks and Sizes
  7. ** Phase 2 - Check Pathnames
  8. ** Phase 3 - Check Connectivity
  9. ** Phase 4 - Check Reference Counts
  10. ** Phase 5 - Check Inode Map
  11. ** Phase 6 - Check Block Map
  12. 9 files 117136 blocks 407152 free
  13. [43p150:root:/] fsdb /test

  14. File System:                                 /test
  15. File System Size:                            524288  (512 byte blocks)
  16. Disk Map Size:                                    6  (4K blocks)
  17. Inode Map Size:                                   6  (4K blocks)
  18. Fragment Size:                                 4096  (bytes)
  19. Allocation Group Size:                         2048  (fragments)
  20. Inodes per Allocation Group:                   2048
  21. Total Inodes:                                 65536
  22. Total Fragments:                              65536
  23. 2i
  24. i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
  25. szh:        0  szl:      512  (actual size:      512)
  26. a0: 0x11        a1: 0x00        a2: 0x00        a3: 0x00
  27. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  28. at: Thu Jan 08 10:26:52 1970
  29. mt: Thu Jan 08 10:32:24 1970
  30. ct: Thu Jan 08 10:32:24 1970
  31. a0b
  32. 0x0000011000  :  0x00000000 (0)
  33. p128y
  34. 0x0000011000:  00 00 00 02 00 0C 00 01 2E 00 00 00 00 00 00 02
  35. 0x0000011010:  00 0C 00 02 2E 2E 00 00 00 00 00 10 00 14 00 0A
  36. 0x0000011020:  6C 6F 73 74 2B 66 6F 75 6E 64 00 00 00 00 00 11
  37. 0x0000011030:  01 D4 00 03 61 61 61 00 00 00 00 12 01 C8 00 03
  38. 0x0000011040:  7A 7A 7A 00 00 00 00 00 00 00 00 00 00 00 00 00
  39. 0x0000011050:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  40. 0x0000011060:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  41. 0x0000011070:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  42. 18i.ln=1
  43. 0x0000020908  :  0x00000001 (1)
  44. 18i
  45. i#:     18  md: f---rw-r--r--  ln:    1  uid:    0  gid:    3
  46. szh:        0  szl:        0  (actual size:        0)
  47. a0: 0x00        a1: 0x00        a2: 0x00        a3: 0x00
  48. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  49. at: Thu Jan 08 10:26:55 1970
  50. mt: Thu Jan 08 10:26:58 1970
  51. ct: Thu Jan 08 10:32:24 1970
  52. 2i
  53. i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
  54. szh:        0  szl:      512  (actual size:      512)
  55. a0: 0x11        a1: 0x00        a2: 0x00        a3: 0x00
  56. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  57. at: Thu Jan 08 10:26:52 1970
  58. mt: Thu Jan 08 10:32:24 1970
  59. ct: Thu Jan 08 10:32:24 1970
  60. a0b
  61. 0x0000011000  :  0x00000000 (0)
  62. p128d
  63. d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
  64. d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
  65. d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 20/10)
  66. d3 (slot=44):   17  aaa (d_reclen/d_namlen = 468/3)
  67. d4 (slot=512):    0   (d_reclen/d_namlen = 512/0)
  68. d5 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
  69. d6 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
  70. d7 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
  71. d8 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
  72. d9 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
  73. d10 (slot=3584):    0   (d_reclen/d_namlen = 512/0)
  74. 0x0000011000  :  0x00000000 (0)
  75. d3.rl=12
  76. 0x0000011030  :  0x0000000c (12)
  77. a0b
  78. 0x0000011000  :  0x00000000 (0)
  79. p128d
  80. d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
  81. d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
  82. d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 20/10)
  83. d3 (slot=44):   17  aaa (d_reclen/d_namlen = 12/3)
  84. d4 (slot=56):   18  zzz (d_reclen/d_namlen = 456/3)
  85. d5 (slot=512):    0   (d_reclen/d_namlen = 512/0)
  86. d6 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
  87. d7 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
  88. d8 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
  89. d9 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
  90. d10 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
  91. d11 (slot=3584):    0   (d_reclen/d_namlen = 512/0)
  92. 0x0000011000  :  0x00000000 (0)
  93. q
复制代码


删除zzz之后,aaa的记录长度从12变为01 D4=468,修改回12。先不mount,直接fsck,就已经有错了,说明zzz的inode map有不同于原来的地方,而方法中没有讲到对此可能有恢复的需要。

  1. [43p150:root:/] fsck /test

  2. ** Checking /dev/rtestlv (/test)
  3. ** Phase 1 - Check Blocks and Sizes
  4. ** Phase 2 - Check Pathnames
  5. ** Phase 3 - Check Connectivity
  6. ** Phase 4 - Check Reference Counts
  7. ** Phase 5 - Check Inode Map
  8. Bad Inode Map; SALVAGE? ^C
复制代码


重新修改aaa的记录长度为zzz删除之后的状态,d3.rl=468,即回滚第二种方法多出的步骤,成为第一种方法,然后试图依赖fsck将文件自动恢复到lost+found

  1. [43p150:root:/] fsdb /test

  2. File System:                                 /test
  3. File System Size:                            524288  (512 byte blocks)
  4. Disk Map Size:                                    6  (4K blocks)
  5. Inode Map Size:                                   6  (4K blocks)
  6. Fragment Size:                                 4096  (bytes)
  7. Allocation Group Size:                         2048  (fragments)
  8. Inodes per Allocation Group:                   2048
  9. Total Inodes:                                 65536
  10. Total Fragments:                              65536
  11. 2i
  12. i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
  13. szh:        0  szl:      512  (actual size:      512)
  14. a0: 0x11        a1: 0x00        a2: 0x00        a3: 0x00
  15. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  16. at: Thu Jan 08 10:26:52 1970
  17. mt: Thu Jan 08 10:32:24 1970
  18. ct: Thu Jan 08 10:32:24 1970
  19. a0b
  20. 0x0000011000  :  0x00000000 (0)
  21. p128d
  22. d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
  23. d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
  24. d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 20/10)
  25. d3 (slot=44):   17  aaa (d_reclen/d_namlen = 12/3)
  26. d4 (slot=56):   18  zzz (d_reclen/d_namlen = 456/3)
  27. d5 (slot=512):    0   (d_reclen/d_namlen = 512/0)
  28. d6 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
  29. d7 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
  30. d8 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
  31. d9 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
  32. d10 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
  33. d11 (slot=3584):    0   (d_reclen/d_namlen = 512/0)
  34. 0x0000011000  :  0x00000000 (0)
  35. d3.rl=468
  36. 0x0000011030  :  0x000001d4 (468)
  37. a0b
  38. 0x0000011000  :  0x00000000 (0)
  39. p128d
  40. d0 (slot=0):    2  . (d_reclen/d_namlen = 12/1)
  41. d1 (slot=12):    2  .. (d_reclen/d_namlen = 12/2)
  42. d2 (slot=24):   16  lost+found (d_reclen/d_namlen = 20/10)
  43. d3 (slot=44):   17  aaa (d_reclen/d_namlen = 468/3)
  44. d4 (slot=512):    0   (d_reclen/d_namlen = 512/0)
  45. d5 (slot=1024):    0   (d_reclen/d_namlen = 512/0)
  46. d6 (slot=1536):    0   (d_reclen/d_namlen = 512/0)
  47. d7 (slot=2048):    0   (d_reclen/d_namlen = 512/0)
  48. d8 (slot=2560):    0   (d_reclen/d_namlen = 512/0)
  49. d9 (slot=3072):    0   (d_reclen/d_namlen = 512/0)
  50. d10 (slot=3584):    0   (d_reclen/d_namlen = 512/0)
  51. 0x0000011000  :  0x00000000 (0)
  52. q
  53. [43p150:root:/] fsck /test

  54. ** Checking /dev/rtestlv (/test)
  55. ** Phase 1 - Check Blocks and Sizes
  56. ** Phase 2 - Check Pathnames
  57. ** Phase 3 - Check Connectivity
  58. ** Phase 4 - Check Reference Counts
  59. Unreferenced file  I=18  owner=root mode=100644
  60. size=0 mtime=Jan 08 10:26 1970 ; RECONNECT? y
  61. ** Phase 5 - Check Inode Map
  62. Bad Inode Map; SALVAGE? ^C
  63. [43p150:root:/] oslevel -s
  64. 5300-07-06-0844
  65. [43p150:root:/]
复制代码


补丁集是AIX 5.3 TL7 SP6

fsck的结果一样有错,说明zzz的inode map确实在删除时有变化而没有恢复到。
这里我是中断了fsck,我做了试验,如果一路敲y让它修复下去,最后的结果,轻则对恢复出来的文件做sum,结果与sum aaa不一样,重则一访问zzz,机器就重启!

[ 本帖最后由 larryh 于 2009-1-5 16:59 编辑 ]

作者: larryh   发布时间: 2009-01-05

神仙也来凑热闹。

作者: 炸鸡   发布时间: 2009-01-05

也搞了一把, 数据没有还原, cat出来是空的。。。。
  1. # echo "salkjflsj" > asldjfl
  2. # rm asldjfl
  3. # cd /
  4. # umount /test
  5. # fsdb /test


  6. File System:                                 /test

  7. File System Size:                            262144  (512 byte blocks)
  8. Disk Map Size:                                    4  (4K blocks)
  9. Inode Map Size:                                   4  (4K blocks)
  10. Fragment Size:                                 4096  (bytes)
  11. Allocation Group Size:                         2048  (fragments)
  12. Inodes per Allocation Group:                   2048
  13. Total Inodes:                                 32768
  14. Total Fragments:                              32768

  15. 2i
  16. i#:      2  md: d-g-rwxr-xr-x  ln:    3  uid:    3  gid:    3
  17. szh:        0  szl:      512  (actual size:      512)
  18. a0: 0x0d        a1: 0x00        a2: 0x00        a3: 0x00
  19. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  20. at: Mon Jan 05 17:03:27 2009
  21. mt: Mon Jan 05 17:03:54 2009
  22. ct: Mon Jan 05 17:03:54 2009

  23. a0b
  24. 0x000000d000  :  0x00000000 (0)
  25. p128c

  26. 0x000000d000:   \0 \0 \0 \? \0 \? \0 \? .  \0 \0 \0 \0 \0 \0 \?
  27. 0x000000d010:   \0 \? \0 \? .  .  \0 \0 \0 \0 \0 \? \? ? \0 \n
  28. 0x000000d020:   l  o  s  t  +  f  o  u  n  d  \0 \0 \0 \0 \0 \?
  29. 0x000000d030:   \? ? \0 \a a  s  l  d  j  f  l  \0 \0 \0 \0 \0
  30. 0x000000d040:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
  31. 0x000000d050:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
  32. 0x000000d060:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
  33. 0x000000d070:   \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

  34. a0b
  35. 0x000000d000  :  0x00000000 (0)
  36. p128e

  37. 0x000000d000:         0       2      12       1   11776       0       0       2
  38. 0x000000d010:        12       2   11822       0       0      16     488      10
  39. 0x000000d020:     27759   29556   11110   28533   28260       0       0      18
  40. 0x000000d030:       468       7   24947   27748   27238   27648       0       0
  41. 0x000000d040:         0       0       0       0       0       0       0       0
  42. 0x000000d050:         0       0       0       0       0       0       0       0
  43. 0x000000d060:         0       0       0       0       0       0       0       0
  44. 0x000000d070:         0       0       0       0       0       0       0       0
  45. 0x000000d080:         0       0       0       0       0       0       0       0
  46. 0x000000d090:         0       0       0       0       0       0       0       0
  47. 0x000000d0a0:         0       0       0       0       0       0       0       0
  48. 0x000000d0b0:         0       0       0       0       0       0       0       0
  49. 0x000000d0c0:         0       0       0       0       0       0       0       0
  50. 0x000000d0d0:         0       0       0       0       0       0       0       0
  51. 0x000000d0e0:         0       0       0       0       0       0       0       0
  52. 0x000000d0f0:         0       0       0       0       0       0       0       0
  53. 18i
  54. i#:     18  md: f---rw-r--r--  ln:    0  uid:    0  gid:    3
  55. szh:        0  szl:       10  (actual size:       10)
  56. a0: 0x8000000f  a1: 0x00        a2: 0x00        a3: 0x00
  57. a4: 0x00        a5: 0x00        a6: 0x00        a7: 0x00
  58. at: Mon Jan 05 17:03:48 2009
  59. mt: Mon Jan 05 17:03:48 2009
  60. ct: Mon Jan 05 17:03:54 2009

  61. 18i.ln=1
  62. 0x0000020908  :  0x00000001 (1)
  63. q
  64. # fsck /test



  65. ** Checking /dev/rlv00 (/test)
  66. ** Phase 0 - Check Log
  67. log redo processing for /dev/rlv00
  68. ** Phase 1 - Check Blocks and Sizes
  69. ** Phase 2 - Check Pathnames
  70. ** Phase 3 - Check Connectivity
  71. ** Phase 4 - Check Reference Counts
  72. Unreferenced file  I=18  owner=root mode=100644
  73. size=10 mtime=Jan 05 17:03 2009 ; RECONNECT? y
  74. ** Phase 5 - Check Inode Map
  75. Bad Inode Map; SALVAGE? y
  76. ** Phase 5b - Salvage Inode Map
  77. ** Phase 6 - Check Block Map
  78. Bad Block Map; SALVAGE? y
  79. ** Phase 6b - Salvage Block Map
  80. 10 files 8328 blocks 253816 free
  81. ***** Filesystem was modified *****
  82. # mount /test
  83. # cd /test
  84. # ls
  85. lost+found
  86. # cd lost*
  87. # ls
  88. 17  18
  89. # cat 18
  90. # ^A
复制代码

作者: wwrko   发布时间: 2009-01-05

还没有试过,改天也要试下。先瞻仰一下前辈们的经验。

不过试了一下project说的snapshot,挺好玩。

bash-3.00# snapshot -q /ngd
Snapshots for /ngd
Current  Location        512-blocks  Free        Time
         /dev/fslv15     65536       64768       Mon Jan  5 15:05:29 BEIST 2009
*        /dev/fslv16     32768       29184       Mon Jan  5 15:11:14 BEIST 2009
bash-3.00#

但是也有缺点
bash-3.00# chfs -a size=1G /ngd
chfs: 0506-957 Shrinking filesystem with a snapshot is not supported.
bash-3.00#

project说的logredo还不知道咋用。

作者: 哞哞牛   发布时间: 2009-01-05

数据恢复,就不是一个简单的活。

作者: 老农   发布时间: 2009-01-05

很久不见技术贴了。。。。顶下

作者: =Lee=   发布时间: 2009-01-05

很强大啊!

作者: sempr   发布时间: 2009-01-05

没细看,一般来说最后运行fsck就是来修复inode map和block map的。另外可能跟你的43p150--32位系统有关。

作者: projects   发布时间: 2009-01-05

你的lost+found 下有两个文件?

作者: projects   发布时间: 2009-01-05

也真是,larryh怎么还用150啊

作者: 老农   发布时间: 2009-01-05

初略试了一下,
rm test/zzz

cd test
rm zzz
好像不同的,后者恢复没有问题,前者恢复后有时是空文件或者文件size内容都不对,但也有成功。

另外怀疑fsck phase1 check log,在一定情况下会做log redo, 这会对原始文件造成影响。

[ 本帖最后由 projects 于 2009-1-6 00:52 编辑 ]

作者: projects   发布时间: 2009-01-05