GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum funktioniert Lsdel in Debugfs nicht?

Ich habe die Partition /dev/sdb1 mit Dateisystem ext3 gemountet unter /mnt/folder .

Ich berühre eine Datei in /mnt/folder und entferne diese Datei.
Dann verwende ich debugfs /dev/sdb1 und geben Sie dann lsdel ein ,
aber es heißt „0 gelöschte Inodes gefunden.“

Was ist das Problem? Wie ich meine Datei mit debugfs wiederherstelle ?

Akzeptierte Antwort:

Nicht geeignet für ext3/ext4.

Von Mann :

list_deleted_inodes [limit]
    List  deleted inodes, optionally limited to those deleted within limit
    seconds ago.  Also available as lsdel.

    This command was useful for recovering from accidental file  deletions
    for  ext2 file systems.  Unfortunately, it is not useful for this pur‐
    pose if the files were deleted using ext3 or ext4, since  the  inode's
    data blocks are no longer available after the inode is released.

Beispiel:

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

Da dies eine kleine Datei ist, haben wir nur einen Block i_block (Offset 0x28).

Das Obige kann wie folgt angelegt werden:

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

Wir können den Offset zu Daten in der Partition nach Blockgröße berechnen (hier 4096):

0x0b2f6cd3 * 4096 = 768644820992

Dann dump durch direktes Lesen:

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

Nun, wenn wir rm foo.txt , man kann Holen Sie die Daten mit demselben dd Befehl wie oben. Es kann aber jederzeit überschrieben werden.

Aber wenn wir diesen Offset nicht kennen, werden wir short.

$ 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

Die Inode-Daten sind jetzt:

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 |

Wie Sie sehen können, werden die Blockdaten auf Null gesetzt.

Verwandte:SSH – Wie mache ich einen Prozess, den ich während einer SSH-Sitzung starte, nachdem die Sitzung beendet wurde??
Linux
  1. Warum zeigt "find" diese Datei nicht an??

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Warum funktioniert das ~/.bash_profile nicht?

  4. Pam_unix2 / Warum existiert es auf einigen Distributionen nicht?

  5. Warum funktioniert die Variablenerweiterung ohne $ in Ausdrücken?

Warum zeigt „weniger“ keine fette Ausgabe?

Warum funktioniert Cryptkeeper nicht in 12.04?

6 Gründe, warum Linux nicht mehr Apps hat

Warum funktioniert `\d` nicht in regulären Ausdrücken in sed?

Warum funktioniert Bash `(())` nicht innerhalb von `[[]]`?

Warum Linux Bridge nicht funktioniert