Szerencsére nem volt rá szükségem, de mégis, mi a szöszt kell Linux alatt kezdeni magunkkal, ha véletlenül letöröltünk egy fájlt? Ugyan a legtöbb grafikus környezet fájlkezelőjében van Kuka (ha valaki kivételt szeretne: LXDE), amelynek segítségével szépen megoldható a törlés utáni visszaállítás. Sőt, ahogyan olvasom, az Ubuntu 8.04-ben is bemutatkozó gvfs már tud fájlműveleteket visszagörgetni. Izgi mi? Egy másolásra is lehet azt mondani, hogy "mégse". :-)
A fájlrendszer, definíció szerint egyfajta módszer a fájljaink szervezésére és tárolására; és leírja hogy hogyan tudjuk a fájlokat rögzíteni, elérni és gyorsan megtalálni. A FAT (File Allocation Table) nevét arról kapta, ahogyan működik: van egy táblázat, amely leírja, hogy a diszk melyik területei szabadok és melyeken vannak fájlok. Ha egy fájlt törlünk, értelemszerűen nem íródik felül a diszken a tartalom, mindössze a táblázatban a megfelelő területnél bejegyzésre kerül, hogy "használható". Pofonegyszerű az egész megvalósítás, nem véletlen hogy szinte minden operációs rendszer támogatja és ezért használják a memóriakártyákon is (mellesleg szabványként is elfogadták). Egyetlen nagy hátránya (amellett, hogy nem nagy méretű diszkekre tervezték) az a bizonyos töredezettség, ami miatt folyton töredezettségmentesíteni kellett. Ez azért van, mert a területek lefoglalása a lemezen lineáris, így ha egy nem frissen létrehozott fájlhoz hozzáírunk, akkor már nem lesz szabad hely a plusz adatok mentésére ott, ahol a fájl többi része "fekszik"; az egyetlen megoldás, hogy a következő szabad helyet kell megkeresni, ami rossz esetben a fél merevlemezzel arrébb van. Nem csoda, hogy az írások-olvasások előbb-utóbb belassulnak.
Az ext2 fájlrendszer nem egyetlen, óriási táblát használ az adatok nyilvántartására, hanem egy fa-szerkezetet, amelyben blokkcsoportok az elágazások, és a blokkok a levelek (a fájl darabjai). Az ún. superblock a teljes fájlrendszerről tartalmaz infókat, mint pl. a teljes méret. Ez az első lefoglalt blokk a fájlrendszeren, enélkül nem találja meg a többi blokkot a merevlemezen. Szerencsére a superblockból van másolat mindegyik blokkcsoportban, így ha az sb megsemmisül, akkor is van lehetőség a fájlrendszer visszanyerésére. Az ún. inode-ok egy fájl minden adatát tartalmazzák, kivéve a nevét, amely ahhoz a könyvtárhoz van rendelve, amelyikben a fájl van. Amíg van legalább 15-20% szabad hely, a töredezettség létrejötte minimális, és az ext2 az egymást követő adatok olvasása/írása esetén baromi gyors; de a fájlok előkeresése csak átlagos, mivel előfordul, hogy végig kell haladni a fa egy részén.
Fogok még beszélni a proc fájlrendszerről is: ennek nem az adattárolás a célja, hanem a rendszer működésébe enged bepillantást. A /proc könyvtár alatt sok érdekes dolgot megtudhatunk az éppen futó programokról, megfelelő jogosultság megléte mellett.
Nade az igazi férfiak nem foglalkoznak holmi Kukákkal, nekem sajnos rossz szokásom Windows alatt is a shift-dellel törlés, és mivel Linuxon krónikus Midnight Commander-függő vagyok, a Kukára ott sem számíthatok. Ekkor jönnek az utolsó reménnyel kecsegtető dolgok:
0. "Biztosan van undelete Linuxra, hiszen már DOS-ban is volt" - Hát, jelentem, bukón állunk. Ugyan vannak pletykák, hogy az mc képest visszaállítani az ext2 fájlrendszert, de nekem nem volt még olyanom, amibe belefordították ezt a támogatást, így nem tudtam kipróbálni.
1. Kezdjünk komolyan foglalkozni a dologgal. Tegyük fel, hogy a fájlt letöröltük, de még meg van nyitva valamilyen alkalmazásban. Mondjuk ez egy fontos doksi, amit Ooo-ban szerkesztünk, de közben - több haszontalan fájllal együtt - véletlenül töröljük.
Ekkor jön be a képbe a /proc fájlrendszer. Ki ne lépjünk az OOo-ból! Amíg nem tesszük meg, addig sikeresen vissza tudjuk állíani a fájlt. Először is, nézzük meg, hogy mi az OOo process id-ja. A /proc könyvtár alatti, számozott könyvtárak ugyanis az éppen futó programok process id-jainak felelnek meg.bagoj@metal:~$ ps x|grep soffice
Tehát kinéztem a PID-et bal oldalon, és beléptem a /proc/<pid> könyvtárba. Itt sok infót össze tudunk szedegetni, pl. a cat cmdline kiírja, hogy milyen parancssorral indítottuk a programot stb. de erre legfeljebb akkor van szükség, ha arra gyanakszunk hogy gonosz emberek feltörték a gépünket és kicserélték a /bin/ps programot egy hamisra; így az nem mutatja a valós állapotot. (Ez az eset kicsit messzire vezetne, hagyjuk.) Amire nekünk szükségünk van, az az fd könyvtár, amely a megnyitott fájlokat tartalmazza (fd = file descriptor, fájl leíró). Lépjünk be a könyvtárba és listázzuk, mik vannak benne:
8810 ? Sl 0:08 /usr/lib/openoffice/program/soffice.bin -writer -splash-pipe=5
10100 pts/4 R+ 0:00 grep soffice
bagoj@metal:~$ cd /proc/8810/bagoj@metal:~$ cd fd
stb.... stb... itt egy rakás fájlt kiír, amit az Openoffice éppen nyitva tart. Nem érdekes, menjünk célirányosan, nekünk a fontos.doc kell:
bagoj@metal:~$ ls -la
összesen 0
dr-x------ 2 bagoj bagoj 0 2008-04-17 11:06 .
dr-xr-xr-x 6 bagoj bagoj 0 2008-04-17 09:23 ..
lr-x------ 1 bagoj bagoj 64 2008-04-17 11:10 0 -> /dev/null
l-wx------ 1 bagoj bagoj 64 2008-04-17 11:10 1 -> pipe:[14703]bagoj@metal:~$ ls -la | grep fontos
Láthatjuk, hogy meg van jelölve a fájl, mint törölt. Azonban a tartalmát még most is elérhetjük!
lrwx------ 1 bagoj bagoj 64 2008-04-17 11:10 48 -> /home/bagoj/fontos.doc (deleted)bagoj@metal:~$ cat 48 > /home/bagoj/alma.doc
Tehát egyszerűen belelistázzuk a törölt fájl tartalmát egy másikba, és máris helyreállítottuk a dokumentumot! A legjobb az egészben, hogy mivel én hoztam létre a fájlt, ezért a jogom is megvolt az egészehz, nem kellett, hogy root legyek.
bagoj@metal:~$ file /home/bagoj/alma.doc
/home/bagoj/alma.doc: Microsoft Word document data
Ezt a trükköt szokták alkalmazni gonosz emberek is, akik létrehoznak és rögtön törölnek is egy fájlt, de egy futó programmal "nyitva tartják". Ekkor hiába keresünk rá find-dal a "gyanús dolgok.txt"-re, semmit nem fogunk találni a gépünkről összegyűjtött adatokból. Ha azonban egy jól irányzott cat-tal operálunk a /proc alatt, akkor láthatjuk a törölt fájl tartalmát.
2. Letöröljük a fájlt és éppen nincs megnyitva egyik alkalmazásban sem
Sajnos ez sokkal rosszabb eset. Nem tudjuk, hogy hol helyezkedett el a fájl a merevlemezen, hiszen levágtuk azt a bizonyos ágat a fáról. Azonnal kapcsoljuk le a gépet és igyekezzünk minél kevesebb írási művelettel megúszni (hiszen bármilyen írás felülnyomhatja a fájlunk tartalmát, mivel az a terület már felhasználható). Én, ha tényleg fontos volt a fájl, terminálban kiadnék egy sync parancsot és kikapcsolnám a gépet a power gombbal. Ez tipikusan olyan, mint amikor kaszkadőr filmekben villog a felirat, hogy "don't try this at home!", de az esetek nagy százalékában nem okozhatunk nagy bajt. Mindenesetre ilyet tényleg csak végső esetben!
Ezek után a legjobb, ha nem a vinyóról bootolunk. Jó lehet erre egy boot cd, vagy ha másik gépbe pakoljuk át a vinyót. Ezek után először elmondom a nehéz utat, majd egy sokkal könnyebbet:
a) A "UNIX-megoldás"
Mint tuggyuk, a UNIX rendszereken minden fájl. Használjuk hát ki ezt! A fájl neve, mérete stb. már elveszett, de a tartalma talán még menthető. Fontos megjegyezni, hogy ha nem valami egyszerű text fájlról volt szó, akkor szinte el is felejthetjük, hogy vissza tudjuk szerezni. Tehát a lényeg, hogy a fájl tartalmára rá tudunk greppelni, bemeneti fájlnak megadva a kérdéses merevlemez eszköznevét:root@bootcd:~# grep --binary-files=text -B 1000 -C 4000 "Alma" /dev/hdb1 > kimenet.txt
Megpróbáljuk a teljes merevlemez tartalmát végigkeresni egy adott szövegre (jelen esetben "Alma"), és az előtte lévő 1000 sortól kezdve 4000 sort kiírunk ebből egy kimenet.txt nevű fájlba. Ugye, eléggé "lájtosan" hangzik; mert az állományban ezek után kézzel kellene böngészgetni, megkeresni hogy hol is kezdődik a fájl és valahogy ebből helyreállítani. Nem lehetetlen vállalkozás, de inkább ugorjunk a következőre!
b) Visszaállítás programmal
Hoppá, mégis van undelete? Valami hasonló. Ezt úgy hívják, hogy foremost, és jó, ha mindenki most azonnal felrakja:sudo apt-get install foremost
A programnak - velünk szemben - komoly előnye, hogy fejből ismeri az ext2 fájlrendszert, valamint egy csomó fájltípus (doc,ole,htm,pdf,jpg,gif,png,bmp,avi,mpg,wmv,mov,exe,rar,zip,wav,cpp) belső szerkezetét is, így kissé nagyobb esélyekkel indul, mintha mi néznénk jojózó szemekkel hexa editorban a kimentett raw merevlemez-tartalmat...
Én még mindig azt javaslom, hogy ha lehet, kapcsoljuk ki a gépet és végezzük a visszaállítást egy másikon, de simán megpróbálhatjuk a visszaállítást azonnal a véletlen törlés után, az összes fenti hókuszpókusz kihagyásával. Azt azért nem árt tudni, hogy melyik partíciót is kell vizsgálni:bagoj@metal:~$ mount
stb... stb... mivel az én home-om a / partíción van, nem késlekedem:
/dev/sda3 on / type ext3 (rw,erros=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)bagoj@metal:~$ sudo foremost -v -t ole,jpeg -d -T -i /dev/sda3 -o recovered
Ez a recovered könyvtárba rakja az összes Microsoft dokumentum vagy jpeg fájlt, amit képes megmenteni.
És most jön a poén: mi van, ha el sem vesztettünk semmit? Ha valaki kíváncsi, hogy mondjuk elvesztett/ellopott merevlemezéről mit lehetne helyreállítani, ki lehet próbálni, a -t all paraméterrel... főleg dualbootosok fognak igencsak meglepődni.
Utóiratok:
1. az ext3-ra minden vonatkozik, ami az ext2-re; kivéve hogy az ext2-höz gyártott recovery programot (asszem, ext2recover a neve) NE futtassátok ext3-on!
2. Tudom, hogy hülye példa volt, mivel az OOo-nak van dokumentum-visszaállító rendszere.