추출된 inode가 가리키는 데이터 블록이 파일의 데이터와 일치할 수 없습니다.

추출된 inode가 가리키는 데이터 블록이 파일의 데이터와 일치할 수 없습니다.

이 질문은 다음 질문의 파생물입니다.디스크에서 원시 ext3 inode 데이터를 추출하는 방법은 무엇입니까?

내용이 간단한 텍스트 문자열 "AAA"인 /tmp/foo 파일이 있습니다. 이 데이터가 있는 디스크 블록 #을 찾고 해당 블록의 데이터를 추출하여 실제로 "AAA"가 포함되어 있는지 확인하고 싶습니다. 그래서 나는 다음을 수행했습니다.

  1. stat foo아이노드 번호가 318903이라고 나와요
  2. debugfs -R 'imap <318903>' /dev/vda3이 inode가 블록 1277956, 오프셋 0x0600에 있음을 알려줍니다.
  3. dumpe2fs /dev/vda3이는 블록 크기가 4096(바이트)이고 inode 크기가 256(바이트)임을 나타냅니다.
  4. 디스크 시작을 기준으로 256바이트 블록의 inode 오프셋을 계산합니다(dd를 사용하여 256바이트 블록을 추출하는 것이 더 쉬워짐): (1277956 x 4096) + (1536) / 256 = 20447302
  5. 디스크에서 inode(원시 데이터) 추출: dd if=/dev/sda3 of=/tmp/inode.0 bs=256 count=1 Skip=20447302
  6. ext2 inode 테이블의 구조를 살펴보십시오(ext3 inode는 동일한 구조를 가짐).http://www.nongnu.org/ext2-doc/ext2.html#INODE-TABLE
  7. 올바른 inode 블록을 추출하고 있는지 확인하기 위해 몇 가지 테스트를 수행합니다 chgrp 1 /tmp/foo; dd if=/dev/sda3 of=/tmp/inode.1 bs=256 count=1 skip=20447302; cmp -l /tmp/inode.1 /tmp/inode.0. cmp의 출력은 다음과 같습니다.
13 217 362
14 225 222
25   1   0

inode 구조를 참조하면 바이트 25가 i_gid에 해당한다는 것을 알 수 있으므로 이는 실제로 디스크에서 올바른 inode 블록을 가져왔음을 확인시켜 줍니다(이전에는 그룹이 0이었지만 현재는 1입니다). 소유권 변경, 데이터 추가를 통한 파일 크기 변경, 디스크에서 inode 재추출과 같은 유사한 테스트도 수행할 수 있습니다. 이러한 테스트를 통해 올바른 inode 블록이 있는지 계속 확인합니다.

  1. 이제 문서에 따르면 inode 테이블의 바이트 41-44에는 데이터 블록(파일의 실제 내용에 대한 블록 번호 - 파일 데이터)에 대한 포인터가 포함되어 있습니다. inode를 0 파일과 바이트별로 비교하면 바이트 41-44의 값을 볼 수 있습니다.cmp -l /tmp/inode.1 /tmp/zero.256
 25   1   0
 27   1   0
 29  10   0
 41  56   0
 42 220   0
 43  23   0
101 275   0
102  53   0
103 240   0
104 374   0

"cmp"는 8진수 값을 제공합니다. 따라서 바이트 44가 상위 바이트라고 가정하면 8진수 포인터의 값은 23 | 220 | 220 56입니다. 이를 이진수 = 10011110 또는 100111001000000101110으로 변환합니다. 10진수로 변환하면 = 1282094

  1. 이제 "1282094"가 우리 데이터에 적합한 블록 번호입니까? dumpefs의 출력을 다시 보면 inode(블록 1277956)와 데이터(블록 1282094)가 모두 블록 그룹 39에 포함되는 범위에 속하는 것을 볼 수 있으므로 합리적인 숫자를 갖는 것처럼 보입니다.

그룹 39: (블록 1277952-1310719) 1277954-1278464의 Inode 테이블(+2)

  1. 따라서 dd를 사용하여 디스크에서 데이터 블록을 추출하고 해당 내용을 확인할 수 있어야 하며 파일 내용("AAA")과 일치해야 합니다. 그러나 그것은 진실이 아니다. 데이터 블록에 다른 콘텐츠가 포함되어 있고 어디에도 "AAA"가 없습니다.dd if=/dev/vda3 of=/tmp/data bs=4096 count=1 skip=1282094; cmp -l /tmp/data /tmp/zero.4096
   1 333   0
   2 335   0
   3   4   0
   5  14   0
   7   1   0
   8   2   0
   9  56   0
  13 221   0
  14 335   0
  15   4   0
  17 364   0
  18  17   0
  19   2   0
  20   2   0
  21  56   0
  22  56   0

이는 /tmp/foo의 내용과 같지 않습니다. 블록에서 벗어난 것이 아닐까 생각하여 주변 블록(1282093 및 1282095)도 추출했지만 여전히 원하는 것을 찾지 못했습니다.

여기서 무슨 일이 일어나고 있는 걸까요? 이 추가 기능은 무엇입니까? 왜 "AAA"가 없나요?

11/14. 해결되었습니다. 파일 시스템에 몇 가지 문제(고아 inode 등)가 있는 것으로 밝혀졌는데, fsck로 문제를 해결했고 이제 모든 것이 예상대로 실행됩니다. 귀중한 통찰력과 제안을 많이 제공해 주신 Wumpus와 derobert(댓글 참조)에게 큰 감사를 전하고 싶습니다. 놀라운.

관련 정보