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, pokudmv
vyžaduje kopírování (na rozdíl od pouhého přesouvání položek adresáře), nové bloky budou přiděleny jakomv
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žítstrace
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ýchcp
příkaz. -
vi existing_file
. Pokudvi
je ve skutečnostivim
,: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 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
.