Obnova ztracených souborů

Všichni dobře víme, že důležité soubory je třeba pravidelně zálohovat. Přesto se občas stane, že o data přijdeme – nebo nás někdo požádá o radu s tímto nepříjemným problémem. V některých případech lze smazané soubory obnovit – dnes si povíme, jak na to.

27.8.2010 00:00 | František Kučera | přečteno 27988×

Odstraněním souboru většinou nedochází k přemazáním samotných dat – pouze je dané místo na disku označeno jako volné a může být kdykoli přepsáno novými daty. Rada tedy zní: nepropadat panice a hlavně na disk nic nezapisovat. Budeme-li se touto radou řídit, je šance na obnovu dat relativně vysoká. Musíme se vyvarovat všech zápisů na disk – nejde jen o očividné zápisy (např. když uložíme dokument v editoru nebo kopírujeme soubor), k zápisu na disk dojde např. i tehdy, když nám do schránky dorazí e-mail a náš poštovní klient ho uloží na disk, nebo když zavřeme nějaký program, který si ukládá nastavení – stačí třeba zavřít terminál – BASH si totiž ukládá historii příkazů a pokud budeme mít hodně velkou smůlu, přepíše se zrovna ten náš drahocený soubor.

Ti, kdo mají disk spravovaný pomocí LVM (Logical Volume Management), jsou teď ve výhodě. V jejich případě totiž stačí vytvořit tzv. snapshot disku – jeho obraz k určitému okamžiku. Na disk se tedy může klidně zapisovat a obraz zůstane nedotčen. Obraz vytvoříme tímto příkazem:

lvcreate -L1G -s -n obraz /dev/mapper/stroj-home

Předpokladem je, že ve skupině svazků (Volume Group – VG) máme ještě nějaké místo pro vytvoření snapshotu. Pokud jsme VG zaplnili až po okraj nebo LVM vůbec nepoužíváme, přemountujeme si disk do režimu pouze pro čtení:

mount -o remount,ro /home

Příklady předpokládají že data uživatelů máme na vlastním diskovém oddílu. V opačném případě, budeme muset takto přepojit celý root – pak nebudeme moci např. instalovat programy sloužící k obnově. Proto je dobré je mít nainstalované ještě před havárií. Další možností je nabootovat systém z živého CD (např. SystemRescueCd, použít se dají i mnohá instalační/živá CD distribucí) nebo disk připojit v jiném funkčním počítači.

Teď už máme klid na práci a můžeme se pustit do obnovy dat – tu provádíme buď z obrazu disku nebo z oddílu připojeného jen pro čtení (případně odpojeného).

Obnova z konkrétního souborového systému

Většinou víme, jaký souborový systém na disku máme, a proto se vyplatí začít s nástroji určenými právě pro ten náš.

Extended file system 2 (Ext2)

Pro obnovu souborů ze systému Ext2 slouží program e2undel. Pravděpodobně ho najdete ve své distribuci – např. v Debianu nebo Ubuntu ho nainstalujete pomocí příkazu:

aptitude install e2undel

Jedná se o interaktivní program, který nás provede procesem obnovy ztracených souborů. Spustíme ho s parametry určujícími blokové zařízení a adresář, kam se mají obnovovat soubory. Následně vybereme uživatele, kterému patřil soubor, a datum, kdy došlo ke smazání.

e2undel -d /dev/mapper/stroj-obraz -s temp/ -a -t
e2undel 0.82
Trying to recover files on /dev/mapper/stroj-obraz, saving them on temp/
Use '-t' to get some information about the content of deleted files

/dev/mapper/stroj-obraz opened for read-only access
/dev/mapper/stroj-obraz was not cleanly unmounted.
Do you want wo continue (y/n)? y
65536 inodes (65525 free)
262144 blocks of 4096 bytes (257701 free)
last mounted on (null)
reading log file: opening log file: No such file or directory
no entries for /dev/mapper/stroj-obraz in log file
searching for deleted inodes on /dev/mapper/stroj-obraz:
|==================================================|
65536 inodes scanned, 216 deleted files found

   user name | 1 <12 h | 2 <48 h | 3  <7 d | 4 <30 d | 5  <1 y | 6 older
-------------+---------+---------+---------+---------+---------+--------
        root |     216 |       0 |       0 |       0 |       0 |       0
Select user name from table or press enter to exit: root
Select time interval (1 to 6) or press enter to exit: 1

Díky parametru -t se program pokusí zjistit typ souborů – to nám společně s údajem o jejich velikosti pomůže identifikovat soubor, který hledáme. Většinou bohužel nebudeme mít k dispozici názvy smazaných souborů (pouze čísla inodů). Abychom názvy smazaných souborů měli, je třeba mít nainstalovanou knihovnu libundel, která loguje jména smazaných souborů (váže se na systémová volání unlink a remove). Tu bychom samozřejmě museli nainstalovat ještě před tím, než ke smazání daného souboru došlo – většinou se tedy budeme muset spokojit s obnovou souborů bez původních názvů.

Extended file system vyšších verzí (Ext3, Ext4)

Modernější Ext3 a Ext4 jsou tzv. žurnálovací souborové systémy a program e2undel na ně bohužel nelze použít. Ve wiki na kernel.org se dokonce dočteme:

Otázka: Can I undelete files in Ext4?
Odpověď: No, in the same way that the ext3 journal requirements to be consistent after a crash prevent undelete of ext3 files, it isn't possible to undelete ext4 files.

Přesto tu určitá naděje na obnovu smazaných souborů je – náš zachránce se jmenuje extundelete. Ve své distribuci ho pravděpodobně mezi standardními programy nenajdete, ale instalace ze zdrojových kódů je snadná. Program závisí na vývojových balíčcích e2fslibs a e2fsprogs. Pro instalaci potřebných závislostí by nám mělo stačit něco jako:

aptitude install build-essential e2fslibs-dev e2fsprogs

Stáhneme si archiv se zdrojovými kódy ze stránky programu a rozbalíme. Nainstaujeme extundelete pomocí klasické trojkombinace:

./configure
make
make install

Nyní už přistoupíme k vlastní obnově:

extundelete /dev/mapper/stroj-obraz --restore-all

Program vytvoří v aktuálním adresáři složku RECOVERED_FILES a do ní obnoví nalezené soubory (včetně jejich původních názvů). Potřebujeme tedy druhý disk s dostatkem místa – to může být např. kořenový oddíl, nebo USB disk případně disk vytvořený v paměti (tmpfs), pokud jí máme dostatek. Pomocí přepínačů --after a --before můžeme upřesnit okamžik smazání souboru a obnovovat jen data, která nás zajímají.

Poznámka autora: když jsem před časem zachraňoval omylem smazaný soubor, podařilo se ho právě pomocí extundelete obnovit. Při psaní tohoto článku jsem postup cvičně zopakoval, nahrál na disk soubory, smazal je a pokusil se je obnovit – extundelete našel všechny. Pokud tedy zareagujete dostatečně rychle a zabráníte zápisům na disk po smazání souboru, máte poměrně dost vysokou šanci, že jeho obnova bude úspěšná.

ReiserFS

Při nechtěném smazání souboru v systému ReiserFS se pokusíme o obnovu pomocí nástroje reiserfsck. Spustíme ho s následujícími parametry:

reiserfsck --rebuild-tree -S -l /root/reiserfs.log /dev/mapper/stroj-obraz

Program znovu sestaví souborový systém a zároveň dojde k obnově smazaných souborů – co šlo obnovit, to najdeme v adresáři lost+found po opětovném připojení souborového systému (resp. jeho obrazu). Tento příkaz je dobré spouštět nad obrazem nebo kopií disku – pokud byste ho spustili nad původním diskem, můžete nadělat více škody než užitku (všimněte si i důrazného varování při spuštění a otázky, zda skutečně víte, co děláte).

Poznámka autora: Tento postup jsem vyzkoušel na testovacím 1 GB disku – hotovo po 15 vteřinách a většina souborů obnovena – smazané soubory jsem po opětovném připojení nalezl v lost+found a u většiny byl zachován i jejich název.

Pro Reiser4 by měl fungovat podobný postup, ale s jinou syntaxí (netestováno):

fsck.reiser4 --build-fs -L /root/reiser4.log -f /dev/mapper/stroj-home

XFS

U tohoto systému je šance na obnovu ztracených souborů dost nízká a kromě jednoho komerčního programu (netestováno) pro něj asi nic nenajdete. Oficiální stránka píše: „There is no undelete in XFS“ a „Anyway, the best is to always keep backups. “ Pravděpodobně tedy budete muset využít obecných nástrojů pro obnovu resp. forenzní analýzu – viz níže.

NTFS

Program pro obnovu dat z NTFS disků má celkem předvídatelný název: ntfsundelete a v Debianu/Ubuntu ho najdete v balíčku ntfsprogs. Program spustíme nejprve jen s jedním parametrem – názvem blokového zařízení:

ntfsundelete /dev/mapper/stroj-obraz

Výsledkem je výpis souborů, které je možno obnovit. V druhém kroku provedeme obnovu – k tomu použijeme parametr -u a parametry -i nebo -m, pomocí nichž určíme číslo inodu nebo název souboru (masku).

Poznámka autora: v mém případě se nepodařilo zjistit názvy souborů, a tak bylo potřeba se řídit datem a velikostí souboru. Pomocí parametru -p můžete určit minimální hranici pro obnovu – např. -p100 bude obnovovat pouze soubory, které lze obnovit celé (100%).

FAT 32

Základní funkcionalitou pro obnovu smazaných souborů disponuje i program fsck.vfat (přepínač -u), nicméně mnohem pohodlnější je práce s programem TestDisk. Jedná se o víceúčelový interaktivní nástroj. Spustíme ho příkazem:

testdisk /dev/mapper/stroj-obraz

Potvrdíme disk a případně vybereme tabulku oddílů (u LVM máme asi souborový systém rovnou na LV, takže zvolíme None). V nabídce nás zajímá tato položka:

[ Advanced ]  Filesystem Utils

Pak zvolíme [Undelete] a už si procházíme strukturou disku, kde vidíme i smazané soubory. Ty, které potřebujeme, si pak pomocí klávesy c odkopírujeme na jiný disk.

Poznámka autora: TestDisk toho umí mnohem více (viz níže) a měl by umět obnovovat smazané soubory i z NTFS disků, to se mi ovšem nepovedlo – testdisk hlásil: No deleted file found., zatímco ntfsundelete je obnovit dokázal (ale názvy souborů stejně nenašel).

Obnova bez ohledu na souborový systém

Pro některé souborové systémy tyto nástroje neexistují nebo jsme pomocí nich nic nenašli. Případně je disk tak rozbitý, že ani nevíme, jaký je na něm souborový systém, nebo máme jen část tohoto disku (např. půlku RAIDu 0 – velmi nepříjemné). V takovou chvíli sáhneme např. po programu Foremost, který vznikl v americké Air Force Office of Special Investigations a jak název napovídá, je určen k forenzní analýze. Nebo použijeme jeho vylepšeného nástupce: Scalpel. Oba programy pracují na podobném principu, Scalpel, podle slov svých autorů, vznikl kompletním přepsáním Foremostu a přináší vyšší výkon a sníženou spotřebu paměti. Třetím programem tohoto typu je PhotoRec (od stejného autora, jako výše zmíněný TestDisk).

Jelikož většina souborových formátů má nějakou typickou hlavičku (např. spustitelné programy začínají .ELF), můžeme prostým sekvenčním procházením celého disku tyto soubory najít a obnovit je – přestože vůbec nerozumíme souborovému systému, který na disku byl. Pro tento postup je klíčová otázka fragmentace souborů: soubor, který je na disku v jednom kuse (nefragmentovaný), obnovíme relativně snadno (konec souboru je buď opět typická posloupnost bajtů, nebo ho uhodneme, nebo poznáme tak, že tam začíná hlavička jiného souboru). Pokud je ale soubor fragmentovaný, obnovíme jen jeho začátek, ale už nevíme, kde pokračuje. Zde mají výhodu textové formáty – pokud v něm např. píšeme knihu, budeme ji schopni obnovit i když bude fragmentovaná – jednotlivé nalezené kusy textu poskládáme tak, aby dávaly smysl. U binárních a hlavně proprietárních formátů je poskládání více částí úkol velice těžký až nemožný.

PhotoRec je interaktivní program pro textový režim (jako TestDisk). Vybereme v nabídce diskový oddíl, zvolíme adresář, kam se uloží nalezené soubory, a spustíme obnovu. Program postupně vypisuje, co našel:

Recovery completed.
jpg: 174 recovered
txt: 9 recovered
zip: 8 recovered

Programy foremost a scalpel jsou neinteraktivní konsolové. Příklad použití:

scalpel /dev/mapper/stroj-obraz -o /root/obnova

Před tím nezapomeneme odkomentovat požadované typy v souboru /etc/scalpel/scalpel.conf – zde si také můžeme doplnit podporu dalších formátů. Prozkoumáme několik souborů námi hledaného typu a zjistíme, čím typicky začínají a čím končí – např. pomocí:

hexdump -C /bin/bash | less

Hlavičky a patičky našeho formátu pak zapíšeme šestnáctkově do souboru /etc/scalpel/scalpel.conf – podobně, jako je to u jiných formátů. Do sloupečku case sensitive je obvykle dobré dát y, zvlášť u binárních formátů. Můžeme určit i maximální velikost – vhodné pro případ, že soubor bude fragmentovaný a jeho patička nebude k nalezení.

Poznámka autora: Nejpříznivější podmínky pro obnovu tímto způsobem jsou u málo zaplněných disků a malých souborů (malá tendence k fragmentaci). Není problém z běžného disku obnovit tisíce JPG nebo PNG obrázků. Typicky se jedná o náhledy obrázků z mezipaměti webového prohlížeče – tak lze zjistit zajímavé informace (i když si uživatel prohlížeče myslí, že historii důkladně promazal).

Smazaná tabulka oddílů

Tohle je chvíle, při které vám přeběhne mráz po zádech. Stačí si splést /dev/sda a /dev/sdb při vytváření tabulky oddílů. Naštěstí GNU/Linux je celkem odolný systém a i když si podřízneme větev, na které zrovna sedíme, systém běží vesele dál – alespoň do restartu.

Pro simulaci takové situace si na disku (nějakém volném, např. LVM) vytvoříme tabulku oddílů (GPT nebo starší msdos) a na ní nějaké oddíly a souborové systémy (pro kontrolu na ně nahrajeme pár souborů). Tabulku oddílů pak smažeme – nejjednodušší je vytvořit novou (pomocí příkazu fdisk nebo šikovnějšího parted). A podíváme se, že tabulka je skutečně smazaná (resp. přepsaná novou – prázdnou).

parted /dev/mapper/stroj-pokusy
(parted) print                                                            
Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/stroj-pokusy: 1074MB
Sector size (logical/physical): 512B/512B
Tabulka oddílů: msdos

Číslo  Začátek  Konec  Velikost  Typ  Systém souborů  Přepínače

(parted)

Teď spustíme TestDisk a obnovíme původní tabulku. Nejprve vybereme [ Analyse ] a [Quick Search]. Program prohledá disk a vypíše oddíly – dole vidíme jejich typ a velikost, pomocí klávesy P se můžeme podívat, jaké na nich jsou soubory (přestože tabulka oddílů chybí a systém je nevidí). Pokud TestDisk našel něco jiného, než co na disku má být, můžeme hodnoty upravit (začátky a konce oddílů a typy souborových systémů). Pokračujeme pomocí klávesy Enter a zvolíme [ Write ]. Tabulka oddílů se zapíše na disk a my ukončíme program.

Spustíme si parted a v něm příkaz print a už vidíme pěkně obnovenou tabulku oddílů. Příklad:

parted /dev/mapper/stroj-pokusy
GNU Parted 2.2
Používám /dev/mapper/stroj-pokusy
Vítá vás GNU Parted! Zobrazte seznam příkazů napsáním 'help'.
(parted) print
Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/stroj-pokusy: 1074MB
Sector size (logical/physical): 512B/512B
Tabulka oddílů: gpt

Číslo  Začátek  Konec  Velikost  Systém souborů  Název  Přepínače
 1     17,4kB   500MB  500MB     ext2
 2     500MB    600MB  99,6MB    fat16
 3     600MB    700MB  101MB     xfs
 4     700MB    800MB  99,6MB    ext4

(parted)

Pokud používáme modernější tabulku oddílů GPT vypíše nám program varování:

The backup GPT table is corrupt, but the primary appears OK, so that will be used.

Na discích s GPT jsou totiž tabulky dvě – jedna záložní je ještě na konci disku a tu TestDisk neobnovil. Přepíšeme ji tedy ručně tou primární. K tomu použijeme program gdisk (verze fdisku pro GPT).

gdisk /dev/mapper/stroj-pokusy
		r       recovery and transformation options (experts only)
		d       use main GPT header (rebuilding backup)
		w       write table to disk and exit

Závěr

Nejlepší bude, když to, co jsme se dnes naučili, nebudeme muset nikdy použít. Účinnou prevencí je samozřejmě zálohování (např. programem rdiff-backup), vhodné je také verzování souborů pomocí systémů, jako je Mercurial, Subversion, Git a další – to nás uchrání i před přepsanými soubory – můžeme se totiž vrátit ke starším verzím. Nezapomínejme ani na opatrnost a přemýšlení při práci s počítačem – protože to, co většinou selhává, není technika ale lidský faktor.

Pro dnešek se rozloučíme cítátem Linuse Torvaldse:

Jenom chudáci zálohují: skuteční borci prostě nahrají svoje důležité soubory na FTP a nechají zbytek světa, aby je kopíroval ;)

Zdroje a odkazy

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1755