복구할 화일이 12 블럭보다 길지 않다면 이 모든 자료의 블럭 번호는 inode 에 저장되어 있다. 이는 'stat' 명령으로 즉시 inode 를 출력해 읽을 수 있지만, 'fsgrab'를 사용하면 더 쉽게 할수 있다. 8장에서 봤던 예를 다시 보자.
debugfs: stat <148003>
Inode: 148003 Type: regular Mode: 0644 Flags: 0x0 Version: 1
User: 503 Group: 100 Size: 6065
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 12
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 1996
atime: 0x31a21dd1 -- Tue May 21 20:47:29 1996
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 1996
dtime: 0x31a9a574 -- Mon May 27 13:52:04 1996
BLOCKS:
594810 594811 594814 594815 594816 594817
TOTAL: 6
# fsgrab -c 2 -s 594810 /dev/hda5 > recovered.001 # fsgrab -c 4 -s 594817 /dev/hda5 >> recovered.001
끝부분의 'recovered.001'는 필요 없을 수도 있지만 별로 중요치 않다. 물론 하나 또는 그 이상의 관련된 블럭들이 덮여 쓰였을 가능성도 있다. 만약 그렇다면 운이 없는 것이니 그 블럭에 대해선 잊어 버려라.
문제는 화일이 12 블럭보다 길때 나타난다. 이때는 유닉스 화일시스템에 대해 약간은 알고 있어야 한다. 화일의 자료는 'block' 이라 불리는 집합체에 저장된다. 그리고 이 블럭들은 순차적으로 번호가 매겨져 있다. 또한 화일에는 소유자, 퍼미션, 종류등의 정보가 보관되어 있는 'inode' 라는 것이 있다. 이러한 블럭과 inode는 순차적으로 번호가 매겨져 있고 다른 순서를 갖는다. 그리고 디렉토리는 화일 이름과 inode 번호로 구성 된다.
퍼미션 정보 등등과 마찬가지로 inode 또한 화일 데이터의 위치를 보유한다. 처음 12 데이터 블럭은 inode 그 자체에 저장되는데 이를 direct blocks라 한다. 그러고 나면 inode 는 'indirect blocks'을 포함 하는데 여기서 블럭은 부가적인 direct blocks 번호를 포함한다. 또한 inode는 indirect blocks 번호 목록을 포함한 두배의 indirect blocks 번호를 가지고, 또 이를 포함한 목록을 가진 세배의 indirect blocks을 가진다.
다시 읽어보자 : 이는 복잡하지만 중요하다. 자, 불행하게도 최근의 커널 수행은 화일 deletion의 모든 indirect blocks 이 0이다.그래서 12블럭 보다 긴 화일이라면 필요한 모든 블럭의 번호를 발견할 수 있다는것 조차 보증할 수 없다. 그러한 것을 알아낼 유일한 방법은 그 화일들이 조각나지 않았다고 가정 하는 것이다. 만약 산산 조각이 났다면 문제가 있다. 화일에 indirect block 이 필요하다면 조각나지 않은 것들은 다음과 같이 나타난다.
#Blocks Contents
12 Data (direct blocks)
1 Indirect block
256 Data (blocks in the indirect block)
1 Doubly indirect block
[1 Indirect block of the doubly indirect block
256 Data
] (256 times -- one for each indirect block in the doubly indirect)
1 Triply indirect block
[[1 Doubly indirect block
256 Data
] (256 times -- one for each indirect block in the doubly indirect
block of the triply indirect block)
] (256 times -- one for each doubly indirect block in the triply
indirect block)
여러분의 블럭 크기는 모두 1024 bytes 이고 이는 표준값이다. 블럭이 이보다 크다면 약간의 번호들이 바뀌어 나타난다. 특별히: 각 블럭 번호가 4 bytes 딜다면 blocksize/4 는 각각의 indirect block 에 저장되는 블럭 번호이다. 그래서 매번 목차에 나타나는 256 이라는 번호를 blocksize/4 로 바꾸는 것이다.