web-dev-qa-db-ja.com

debugfsのlsdelが機能しないのはなぜですか?

パーティション/dev/sdb1とファイルシステムext3/mnt/folderにマウントしています。

/mnt/folderのファイルをタップして、そのファイルを削除します。次に、debugfs /dev/sdb1を使用してlsdelと入力しますが、 "0個の削除されたiノードが見つかりました。"

問題は何ですか? debugfsでファイルを回復するにはどうすればよいですか?

4
Sajjad.mp

Ext3/ext4には適していません。

manから:

 list_deleted_inodes [limit] 
削除されたiノードをリストします。オプションで、limit
秒前に削除されたiノードに制限されます。 lsdel。
 
としても利用可能です。このコマンドは、誤ってファイルを削除した場合の復旧に役立ちました。
ext2ファイルシステムの場合。残念ながら、ファイルがext3またはext4を使用して削除された場合、iノードが解放された後はiノードの
データブロックが使用できなくなるため、この目的で使用することはできません。

例:

$ 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  ................
*
...

これは小さなファイルなので、ブロックは1つしかありません i_block (offset 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、1つのcan上記と同じ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

Iノードデータは次のとおりです。

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 |

ご覧のとおり、ブロックデータはゼロになっています。

6
Runium

Debugfsはnotファイル回復プログラムです。運が良ければ、削除されたファイルを復元できることもあります。

(MS-DOSなどではなく)実際のオペレーティングシステムでのファイルの回復は、「バックアップ」と綴られています。

3
msw