debugfs의 lsdel이 작동하지 않는 이유는 무엇입니까?

debugfs의 lsdel이 작동하지 않는 이유는 무엇입니까?

내 파티션 /dev/sdb1의 파일 시스템이 ext3마운트되었습니다 /mnt/folder.

파일을 터치해서 /mnt/folder삭제합니다. 그런 다음 debugfs /dev/sdb1Enter를 사용 lsdel하지만 다음과 같이 표시됩니다."0개의 삭제된 inode를 찾았습니다."

문제는 무엇입니까? 내 파일을 어떻게 복구하나요?디버그 파일?

답변1

ext3/ext4에는 적합하지 않습니다.

~에서남성:

list_deleted_inodes [제한 사항]
    삭제된 inode를 나열합니다. 선택적으로 다음 범위 내의 삭제된 inode로 제한됩니다.한계
    몇 초 전에. 다음으로도 사용 가능이스델.

    이 명령은 실수로 파일을 삭제한 경우를 복구하는 데 유용합니다.
    ext2 파일 시스템의 경우. 불행히도 이 목적에는 유용하지 않습니다.
    inode 때문에 ext3이나 ext4를 사용해 파일을 삭제하는 경우
    inode가 해제된 후에는 데이터 블록을 더 이상 사용할 수 없습니다.

예:

$ echo Hello > foo.txt
$ ls -ial
35692596 .
35692545 ..
35692597 foo.txt

$ sudo debugfs -R 'inode_dump <35692597>' /dev/sdc5

0000  b481 e803 0600 0000 82d0 d056 82d0 d056  ...........V...V
0020  82d0 d056 0000 0000 e803 0100 0800 0000  ...V............
0040  0000 0000 0100 0000 d36c 2f0b 0000 0000  .........l/.....
0060  0000 0000 0000 0000 0000 0000 0000 0000  ................
*
...

이것은 작은 파일이므로 블록이 하나만 있습니다.i_block(오프셋 0x28).

위의 공식은 다음과 같이 구성될 수 있습니다.

b481      |      81b4 = i_mode        : 0100664 (octal)
e803      |      03e8 = i_uid         :    1000
0600 0000 | 0000 0006 = i_size_lo     :       6
dbd7 d056 | 56d0 d7db = i_atime       : Fri Feb 26 23:55:23 CET 2016
dbd7 d056 | 56d0 d7db = i_ctime       : Fri Feb 26 23:55:23 CET 2016
dbd7 d056 | 56d0 d7db = i_mtime       : Fri Feb 26 23:55:23 CET 2016
0000 0000 | 0000 0000 = i_dtime       :       0
e803      |      03e8 = i_gid         :    1000
0100      |      0001 = i_links_count :       1
0800 0000 | 0000 0008 = i_blocks_lo   :       8, 8 * 512 = 4096 b
0000 0000 | 0000 0000 = i_flags       :       0
0100 0000 | 0000 0001 = i_osd1        :       1

Direct Block Address:

d36c 2f0b | 0b2f 6cd3 = i_block[0]    : 187657427
0000 0000 | 0000 0000 = ... no more

블록 크기(여기서는 4096)를 기준으로 파티션에 있는 데이터의 오프셋을 계산할 수 있습니다.

0x0b2f6cd3 * 4096 = 768644820992

그런 다음 덤프를 직접 읽으십시오.

$ sudo dd if=/dev/sdc5 bs=1 skip=768644820992 count=6 | hd
00000000  48 65 6c 6c 6f 0a                                 |Hello.|

이제, 만약 우리 rm foo.txt할 수 있는dd위와 동일한 명령으로 데이터를 가져옵니다. 하지만 언제든지 덮어쓸 수 있습니다.

하지만 이 오프셋을 모르면 부족해집니다.

$ ls -ai1
35692596 .
35692545 ..

$ sudo debugfs -R 'ls -d <35692596>' /dev/sdc5
 35692596  (12) .    35692545  (4084) ..   <35692597> (4072) foo.txt

$ sudo debugfs -R 'inode_dump <35692597>' /dev/sdc5

현재 인덱스 노드 데이터는 다음과 같습니다.

b481      | 
e803      |
0000 0000 | 0000 0000 = i_size_o      : 0                            *changed
dbd7 d056 | 56d0 d7db = i_atime       : Fri Feb 26 23:55:23 CET 2016
e5d7 d056 | 56d0 d7e5 = i_ctime       : Fri Feb 26 23:55:33 CET 2016 *changed
e5d7 d056 | 56d0 d7e5 = i_mtime       : Fri Feb 26 23:55:33 CET 2016 *changed
e5d7 d056 | 56d0 d7e5 = i_dtime       : Fri Feb 26 23:55:33 CET 2016 *changed
e803      |
0000      |      0000 = i_links_count : 0                            *changed
0000 0000 | 0000 0000 = i_blocks_lo   : 0                            *changed
0000 0000 |
0100 0000 |

0000 0000 | 0000 0000 = i_block[0]    : Zeroed out.                  *changed
0000 0000 |
0000 0000 |

보시다시피 블록 데이터가 지워졌습니다.

답변2

디버깅은아니요파일 복구 프로그램. 운이 좋으면 실수로 삭제된 파일을 복구하는 경우도 있습니다.

실제 운영 체제(예: MS-DOS와 반대)에서의 파일 복구는 "백업"으로 표기됩니다.

관련 정보