GNU/Linux >> Znalost Linux >  >> Linux

Lze obnovit přepsané soubory?

Nemluvím o obnově smazaných souborů, ale o přepsaných soubory. Konkrétně následujícími metodami:

# move
mv new_file old_file

# copy
cp new_file old_file

# edit
vi existing_file
> D
> i new_content
> :x

Je možné něco získat, pokud se provede některá z výše uvedených tří akcí za předpokladu, že na počítači s linuxem nejsou nainstalovány žádné speciální programy?

Přijatá odpověď:

Odpověď je "Pravděpodobně ano, ale záleží na typu souborového systému a načasování."

Žádný z těchto tří příkladů nepřepíše fyzické datové bloky old_file nebo existující_file, leda náhodou.

  • mv new_file old_file . Tím se odpojí starý_soubor. Pokud existují další pevné odkazy na old_file, bloky zůstanou v těchto zbývajících odkazech nezměněny. Jinak budou bloky obecně (záleží na typu souborového systému) umístěny na volný seznam. Pak, pokud mv vyžaduje kopírování (na rozdíl od pouhého přesouvání položek adresáře), nové bloky budou přiděleny jako mv píše.

    Tyto nově přidělené bloky mohou nebo nemusí být tytéž, které byly právě uvolněny . Na souborových systémech, jako je UFS, jsou bloky alokovány, pokud je to možné, ze stejné skupiny válců jako adresář, ve kterém byl soubor vytvořen. Existuje tedy šance, že zrušením propojení souboru z adresáře a vytvořením souboru ve stejném adresáři bude znovu použito ( a přepsat) některé ze stejných bloků, které byly právě uvolněny. To je důvod, proč standardní rada lidem, kteří omylem odstraní soubor, je nezapisovat žádná nová data do souborů v jejich adresářovém stromu (a pokud možno ne do celého souborového systému), dokud se někdo nepokusí o obnovu souboru.

  • cp new_file old_file provede následující (můžete použít strace pro zobrazení systémových volání):

    open("old_file", O_WRONLY|O_TRUNC) = 4

    Příznak O_TRUNC způsobí uvolnění všech datových bloků, stejně jako mv udělal výše. A jako výše, budou obecně přidány na bezplatný seznam a mohou nebo nemusí být znovu použity při následných zápisech provedených cp příkaz.

  • vi existing_file . Pokud vi je ve skutečnosti vim , :x příkaz provede následující:

    unlink("existing_file~") = -1 ENOENT (No such file or directory)
    rename("existing_file", "existing_file~") = 0
    open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3

    Takže ani neodstraní stará data; data jsou uchována v záložním souboru.

    Na FreeBSD, vi dělá open("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664) , který bude mít stejnou sémantiku jako cp , výše.

Některá nebo všechna data můžete obnovit bez speciálních programů; vše, co potřebujete, je grep a dd a přístup k nezpracovanému zařízení.

Pro malé textové soubory jeden grep příkaz v odpovědi od @Steven D v otázce, na kterou jste odkazovali, je nejjednodušší způsob:

grep -i -a -B100 -A100 'text in the deleted file' /dev/sda1

Ale pro větší soubory, které mohou být ve více nesouvislých blocích, dělám toto:

grep -a -b "text in the deleted file" /dev/sda1
13813610612:this is some text in the deleted file

což vám dá offset v bajtech odpovídající čáry. Poté následujte sérií dd příkazy počínaje

dd if=/dev/sda1 count=1 skip=$(expr 13813610612 / 512)

Také byste si chtěli přečíst některé bloky před a po tomto bloku. Na UFS mají bloky souborů obvykle 8 KB a jsou obvykle alokovány poměrně souvisle, bloky jednoho souboru jsou prokládány střídavě s 8KB bloky z jiných souborů nebo volného místa. Konec souboru na UFS je až 7 1KB fragmentů, které mohou, ale nemusí být souvislé.

Související:Zřetězit konkrétní soubory do jednoho souboru?

Samozřejmě na souborových systémech, které komprimují nebo šifrují data, nemusí být obnova tak přímočará.

Ve skutečnosti existuje v Unixu velmi málo nástrojů, které přepíší datové bloky existujícího souboru. Jeden, který mě napadá, je dd conv=notrunc . Další je shred .


Linux
  1. Jak mohu symbolicky propojit soubor v Linuxu?

  2. Proč nelze pomocí inodu manipulovat se soubory?

  3. Proč v systému Linux nemohu vytvářet soubory větší než 2 GB?

  1. Přesouvání souborů na Linuxu bez mv

  2. Nelze odpojit soubor zálohovaný smyčkou, ale nejsou zde žádné otevřené soubory?

  3. Nemohu smazat soubory 'rm:nelze odebrat X souborový systém pouze pro čtení'

  1. Proč může Rm odebrat soubory pouze pro čtení?

  2. Skrytí dat v souborových systémech?

  3. Počítejte řádky ve velkých souborech