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, pokudmvvyžaduje kopírování (na rozdíl od pouhého přesouvání položek adresáře), nové bloky budou přiděleny jakomvpíš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_fileprovede následující (můžete použítstracepro zobrazení systémových volání):open("old_file", O_WRONLY|O_TRUNC) = 4Příznak O_TRUNC způsobí uvolnění všech datových bloků, stejně jako
mvudě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ýchcppříkaz. -
vi existing_file. Pokudvije ve skutečnostivim,:xpříkaz provede následující:unlink("existing_file~") = -1 ENOENT (No such file or directory)rename("existing_file", "existing_file~") = 0open("existing_file", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 3Takže ani neodstraní stará data; data jsou uchována v záložním souboru.
Na FreeBSD,
viděláopen("existing_file",O_WRONLY|O_CREAT|O_TRUNC, 0664), který bude mít stejnou sémantiku jakocp, 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 .