다음 이전 차례

10. 데이터 블럭을 복구한다.

복구할 화일이 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

이 화일은 6개 블럭을 가지고 있다. 'recoverde.001' 이라는 새화일에 정확히 기록하기 위해 다음과 같이 해보자.

# 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)

위의 것이 명확하기를 바란다. 화일이 단지 268 블럭 뿐이라면 이는 전적으로 가능하다. 이들은 12블럭 데이터이고 (이 번호는 inode 자체에 나타난다) indirect block 을 따르며 다른 256 제이터 블럭을 따른다. 만약 화일이 위의 것보다 길다면 두배의 indirect block 을 추가한다. 그 이후 각각의 부가적인 256 데이터 블럭에다 하나의 indirect block 과 256 데이터 블럭을 추가하는데 최대가 256 이다. 이보다 화일이 더 길다면 조각나 있지 않을 가능성은 거의 없지만 더 긴 화일에 그 조직이 이어져 나타날 수도 있다.

여러분의 블럭 크기는 모두 1024 bytes 이고 이는 표준값이다. 블럭이 이보다 크다면 약간의 번호들이 바뀌어 나타난다. 특별히: 각 블럭 번호가 4 bytes 딜다면 blocksize/4 는 각각의 indirect block 에 저장되는 블럭 번호이다. 그래서 매번 목차에 나타나는 256 이라는 번호를 blocksize/4 로 바꾸는 것이다.


다음 이전 차례