Undeletion i Ext3
Få tillbaka oavsiktligt raderade filer på Ext3-partitioner
"Undeletion", att få tillbaka filer man oavsiktligen tagit bort, är inte alltid så enkelt. Enklaste fallet är när man lagt något i "papperskorgen" och kan få tillbaka det med några musklick. Än jobbigare är det om man måste köra någon programvara för att leta genom disken efter filer, med fortfarande kan detta ge bra resultat på filsystem såsom FAT, NTFS, ReiserFS, Ext2 m fl, men Ext3, som antagligen är det mest använda filsystemet på hemmarknaden för Linuxsystem idag, är "duktigare" än alternativen på att radera, vilket i detta fall blir till en stor nackdel.
Kort sagt så är borttagna filer på Ext3 "mer" borttagna än filer på exempelvis Ext2 vilket gör att det är mycket svårt att genomföra en enkel återställningsprocess. Varför det är på detta viset går att läsa om på exempelvis Wikipedia eller internet i allmänhet, men det är inte det denna guide ska handla om; här ska man få tips om hur man med lite jobb kan få tillbaka åtminstone en del information från en rensad Ext3-disk.
Något man kan säga direkt för att inte ge falska förhoppningar är att rena textfiler är relativt lätta att återskapa; binära filer är desto krångligare då de är mycket svårare att söka efter i en stor klump av data. Det är ofta också väldigt svårt att identifiera början och slutet på en binär fil så att man kan extrahera och återskapa den. Är det något väldigt viktigt dokument det handlar om är man dock kanske villig att spendera lite tid på det för att få tillbaka sina data.
~$ rm -r Grim\ Fandango *
Exakt det kommandot körde jag av misstag en gång i en terminal. Ett oavsiktligt mellanslag innan `*` som kom från oförsiktighet i samband med symboliska länkar och tab completion gjorde att jag helt plötsligt rensade det mesta av min hemkatalog innan jag hann trycka Ctrl-c. Jag visste att det var jäkligt att få tillbaka filer från en Ext3-partition, men jag kunde lika gärna försöka.
———————————————————
Det första att göra är att se till att man inte skriver någon information till partitionen. När data tas bort så rensas de inte från hårddisken, men deras utrymme blir tillgängligt för operativsystemet att skriva över med nya data. Ger man dock inte operativsystemet någon anledning att skriva till partitionen så kan man "ha kvar" de flesta filerna rent fysiskt.
Stäng alltså ner alla program som eventuellt kan få för sig att skriva till partitionen. I mitt fall med hemkatalogen gällde det IM-klienter som loggar konversationer, några skript jag körde i crontab, webbläsare som sparar cache och historik i hemkatalogen och lite annat.
Har man möjlighet så bör man avmontera partitionen så att man kan vara helt säker på att inget skrivs till den. Det kan vara problematiskt om det exempelvis handlar om /, men är det bara en lagringsdisk är det lätt gjort.
Partitionen det gällde för mig låg bara på 6 GB, så jag hade plats att göra en rå kopia så som den såg ut för tillfället och lagra den på en annan disk:
# dd if=/dev/hda1 of=backup_image.ext3
fixade detta för mig. Detta kommando läser av `/dev/hda1` bit för bit och sparar den som `backup_image.ext` i den aktuella katalogen. Här kan man göra stor skada på systemet om man inte är försiktig. Bara att söka lite på nätet för att hitta mängder med människor som rensat hela diskar och gjort systemet oanvändbart på grund av oaktsamhet med `dd`. Behandlas med respekt.
Nu hade jag en exakt avbild av partitionen att operera på utan att oroa mig för att skriva över viktig information.
Har man avmonterat en partition så kan man operera på den utan risk för att något skrivs över. Ligger det dock till så att man inte kan avmontera partitionen av skälen nämnda ovan, samtidigt som den är så stor att man inte kan göra en kopia av den på en alternativ partition så får man leva lite farligt och försöka att störa partitionen så lite som möjligt. Det bör strävas efter att skapa en kopia enligt ovan.
—
Tillvägagångssättet man har att tillgå när det gäller Ext3 är nu att söka igenom den ohanterliga datamängden efter mönster man snillrikt får välja för att försöka hitta delar av filer man letar efter. Handlar det om en vanlig textfil är det lättare att komma på något smart att söka efter; handlar det om en videofil eller liknande kan det vara övermäktigt. Jag blev inte av med mycket av värde förutom just rena textfiler, vilket får räknas som tur i oturen, antar jag.
Det handlar i vilket fall om att `grep`:a efter kända strängar och lägga på en växel så att man får med ett anpassat antal rader före och efter den sökta frasen. Ett typiskt kommando kunde för mig se ut enligt
grep --binary-files=text -1000 "subsection" backup_image.ext3 > temptext
`grep` behöver växeln `--binary-files=text` för att förstå att den ska hantera indata som en textfil trots att de ser ut att vara av binärtyp. `-1000` anger att `grep` ska skriva ut 1000 rader före och efter den matchade raden. 1000 är i värsta laget; man kan experimentera sig fram, men då det kan ta ett bra tag att `grep`:a en fil på ett stort antal GB så kan det vara trevligare att i efterhand få skala bort en del rader än att behöva göra om sökningen för att man inte fick med början på dokumentet.
Man kan i stället för `-1000` exempelvis ange växlarna `-B100 -A500`. Då skriver `grep` ut 100 rader före (before) och 500 rader efter (after) den matchade raden.
"subsection" var den sträng jag sökte efter, vilket var en sträng jag med säkerhet visste fanns med i en del LaTeX-dokument jag ville ha tillbaka.
Jag omdirigerar output till en fil så att den blir lättare att hantera.
—
Tycker man det blir alltför mycket rappakalja i resultatet kan man med fördel pipe:a outputen från `grep` genom `strings`: ett kommando som rensar bort en hel del tråkiga tecken (se `man strings` för mer info). Som standard räknas "åäö" som konstiga tecken, så man bör ge strings växeln `--encoding=S` för att åtminstone tillåta 8-bitarstecken, såsom våra svenska stoltheter. Mina filer var i teckenkodningen ISO-8859-1; jag har inte testat hur `strings` hanterar UTF-8.
`strings` har dock oegenheten att det även rensar bort blankrader vilket gör att exempelvis mina LaTeX-dokument ser röriga ut. Jag valde att inte använda det och hellre stå ut med en del skräptecken när jag rensade.
—
Mer avancerade sökningar går att göra genom användning av exempelvis `awk` och våra andra vänner. Lite programmering skulle säkert kunna automatisera processen också, möjligheterna är i stort sett obegränsade.
———————————————————
Är detta roligt? Nej. Blir resultatet 100%:igt? Nej. Gör backuper på känslig data med jämna mellanrum. Det kvittar dock hur många gånger man hör det, man lär sig inte förrän man förlorar viktiga data på ett eller annat sätt. Det är dock en fantastisk känsla att kunna återställa en helt förlorad partition med några enkla kommandon. I mitt fall hade jag faktiskt en backup, men den var någon månad gammal så den saknade en del dokument. Jag klarade mig dock utan någon allvarlig dataförlust, även om det var vansinnigt nära att det hade gått helt åt pipan. Hade jag inte Ctrl-c:at i tid så hade min situation varit storleksordningar värre. Så går det när man är slarvig med sina backup-rutiner.