HTML

Bagoj úr blogja

Kíváncsi Bagoj befigyel a Linux belsejébe, illetve különféle Linux terjesztéseket próbál ki. Ha jó napja van, scriptet ír Neked.

Friss topikok

Törölt fájlok visszaállítása

2008.04.16. 23:31 bagoj ur

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
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/
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:
bagoj@metal:~$ cd fd
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]
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 | grep fontos
lrwx------  1 bagoj bagoj 64 2008-04-17 11:10 48 -> /home/bagoj/fontos.doc (deleted)
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!
bagoj@metal:~$ cat 48 > /home/bagoj/alma.doc
bagoj@metal:~$ file /home/bagoj/alma.doc
/home/bagoj/alma.doc: Microsoft Word document data
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.
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.txtMegpró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 foremostA 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
/dev/sda3 on / type ext3 (rw,erros=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
stb... stb... mivel az én home-om a / partíción van, nem késlekedem:
bagoj@metal:~$ sudo foremost -v -t ole,jpeg -d -T -i /dev/sda3 -o recoveredEz 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.

 

1 komment

Címkék: linux gnome file törölt fájlkezelő fájlrendszerek helyreállítás recovery

A bejegyzés trackback címe:

https://bagojur.blog.hu/api/trackback/id/tr38612283

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Darkcomet 2010.08.20. 14:22:31

Nem kell ilyen brutálisan eljárni ilyenkor, hogy azonnal kapcsoljuk ki a gépet. :-) A linux kernel része már évek óta a Magic SysRq. Ezt a cuccot feltelepítve (ha nincs benne a disztroba), az Altgr+SySRq+s megnyomására kiad a rendszer egy sync parancsot, AltGr+SyS+u megnyomásával csak olvasható állapotba teszi a partíciókat, b billentyűvel újra indítja a rendszert (pl. ha egy live linux segítségével akarunk törölt fájlokat visszaállítani). Adat visszaállításra, meg egyéb rendszer javításra a legjobb a Sys Rescue live linux, weboldal itt: www.sysresccd.org/Main_Page a Magic SysRq-ról meg itt egy kimerítő magyarnyelvű írás: hup.hu/node/7247