Ofrivillit mjukvaruprojekt. En JFS-recoverer!

Berätta om dina pågående projekt.
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Ofrivillit mjukvaruprojekt. En JFS-recoverer!

Inlägg av simon78 »

Av ett antal anledningar som jag inte orkar gå in på nu, så formaterade jag fel hårddisk för ett tag sedan. Obra... Men, det man inte har i huvudet får man ha i C++. Filsystemet var av typen JFS (från ibm). Det är ett modernt filsystem som allokerar inodes (metadata för filer och kataloger odyl.) dynamiskt. Äldre filsystem som ext2, IIRC, allokerar alla inodes i början av volymen, och inga fler sedan. Jag formaterade över JFS systemet med ext2/3 så det var bara början som var förstörd. Desssutom hade jag kört swap på volymen i några minuter, så det fanns lite slumpmässig inkonsistens inne på disken.

Efter att jag hade läst på lite om JFSs layout, samt gluttat på källkoden till JFSs analysprogram xpeek, så hade jag vad som behövdes.

Programmet kör i flera steg. Först scannar det efter troliga inodes, som den senare filtrerar enligt olika regler. När man har en mängd med OK inodes så skapar man först relationerna mellan dem (katalogstrukturen). Därefter extraherarr man alla namn, och efter det börjar själva dataåterskapningen.
I JFS är all data lagrad i B+träd, som man måste traversera för att hitta extent-deskriptorer. Dessa deskriptorer talar om var ett extent startar och slutar. Ett extent är ett kontinuerligt allokerat block av data. Har filen många extents/fragments så blir trädet stort och många fragment måste pusslas ihop för att få tillbaka filen. Vissa filer hade mer än 4000 fragment! inte undra på att disken har trashat lite!

Det här projektet är inte riktigt klart än, men det funkar nästan. Det har ett antal buggar som inte är helt fixade än men som sagt, det funkar.

Jag har fått det hostat på sourceforge.net (http://jfsrec.sourceforge.net). GPL förståss.

Ni får ursäkta detta titta-vad-jag-har-gjort-inlägg, men jag kunde inte uthärda tanken att lägga en månad eller mer på ett mer eller mindre ofrivilligt projekt utan att det resulterade i en tråd här. :roll:
Pjoms
EF Sponsor
Inlägg: 644
Blev medlem: 24 maj 2004, 12:18:40
Ort: Ö-vik

Inlägg av Pjoms »

Det låter lika jobbigt som imponerande det där! Verkar som om du har fått plöja igenom en hel del dokumentation...
Hoppas att du får tillbaka det mesta/viktigaste av din data.
Hur har du testat ditt program innan du går/gick lös på den "skarpa" disken? Har du bara tagit en annan disk med (oviktig :wink: ) data och formaterat som testobjekt, eller har du gjort på nå't annat sätt?
Och en sak till, fanns det inget recoveryprogram redan?
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Så länge man bara läser från den trasiga disken så funkar den väl utmärkt som testobjekt. Skulle man däremot skriva till den så blir det ju genast annorlunda.

Imponerande och intressant projekt!
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Men, det man inte har i huvudet får man ha i C++.
:D :D
Användarvisningsbild
simon78
Inlägg: 1091
Blev medlem: 8 juni 2004, 11:05:51
Ort: Vinninga/Lidköping
Kontakt:

Inlägg av simon78 »

Jag gjorde en liten imagefil på 128Mb som jag formaterade till jfs och fyllde med lite junk. Ganska smidigt sätt. När jag kör på min 500Gb disk så tar det ju ett par timmar att bara skippa igenom, tråkigt att debugga då...

Nu har man ju fått anledning att lära sig lite om filsystem, kanske kan komma till användning i en AVR i framtiden :)
Och using namespace boost:: har man ju också skrivit lite, boost är trevligt.
Skriv svar