soodan sivut

arkisto

196 kirjotelmaa.

avainsanat

Kävipä kerran (jokseenkin reilu kuukausi sitten) vanhemmilla kylässä ollessa niin, että digiboksilta (telkusta usb-levylle tallennettua) leffaa katsoessa leffa jumittui kesken kaiken muutamaksi sekunniksi, jonka jälkeen digiboksi lopetti videon soittamisen ja palasi tv-tilaan. Hämmentyneenä katsottiin kiintolevyn tilaa valikoista, ja boksipa ei huomannut minkäänlaisen levyn olevan kiinni. Jotenkin vehjeyhdistelmä onnistui tuhoamaan tms. video-osion koko levyltä. No, ei kun kimppuun.

Ei ole tietoa, oliko vika digiboksissa (Division VDT8080B) vai Dealextremen halpis-usb-kiintolevykotelossa (halvalla saa). Jotain meni kuitenkin pieleen. Digiboksi luo levyä alustaessa kaksi osiota (näiden kokosuhteen voi valita; molemmat ovat kuitenkin pakollisia), yhden FAT-osion ilmeisesti käyttäjän omia tiedostoja (jpg, mp3 jne) varten sekä toisen ext2-osion itse leffoille ja niiden metadatalle. Manuaalikin speksaa erikseen, että videoita muualle kopioitaessa on kopioitava se video ensin tuohon fat-osiolle, ext2-osio on laitteen sisäistä käyttöä varten.

Siinä kuukausi sitten tuota vähän tosiaan tunkkasinkin. Kytkettäessä levyä linux-koneeseeni kerneli huomasi levyn ihan oikein. Osiotaulu näkyi kivasti, enkä siis sitä tutkinut enempää kun oletin sen olevan kunnossa. (Enää ei voi muistaa, näkyikö itseasiassa fat-osio digiboksissa/toisissa koneissa vai menikö sekin hassusti; ei tullut mieleen tutkia kun leffat olivat ext2-osiolla.) Video-osion mounttaaminen ei onnistunut, mount sanoi jotta superblock is corrupt blaa blaa. Ensi töikseni kopioin osion (160 GB) koneeni kiintolevylle, etten vahingossa rikkoisi alkuperäistä dataa enempää.

Superblock (käytän tässä lievää finglishiä näissä termeissä, sillä niille ei käytännössä ole kelvollisia suomenkielisiä vastineita) on yleinen termi, joka tarkoittaa läjää dataa, joka kuvaa tärkeimpiä asioita tiedostojärjestelmästä; ext2:n tapauksessa se sisältää mm. tunnistenumeron ja version, inodejen, blockien yms. määrät, vapaan tilan yms. Näitä on yleensä tiedostojärjestelmässä useampia varmuuden vuoksi, sillä jos laitteesta vaikka katkeaa virrat juuri kun se on kirjoittamassa dataa superblockiin, homma menee todennäköisesti rikki ja superblock korruptoituu.

Googlella löytää helposti aiheesta erinäisiä ohjeita, joista ei kyllä yksikään katsomani (niistä yli kymmenestä) auttanut tässä tapauksessa. Tarkemmin käsin tutkiessani ext2:n speksin mukaan bitti bitiltä löysin pääsuperblockin (helppoa) ja backupitkin siitä. Speksin mukaan superblockit sijaitsevat tiettyjen block groupien alussa: "The groups chosen are 0, 1 and powers of 3, 5 and 7.". Block groupien sijainnit taas riippuvat blocksizestä (tiedostojärjestelmissä tieto talletetaan tietyn kokoisissa kalikoissa tehokkuussyistä; näitä kutsutaan blockeiksi, yhden koko on blocksize). Juurikin näistä paikoista löytyi ihan toisiaan vastaavia noita. Muutamia arvoja tuon speksin ilmaisemista paikoista lueskelin käsin hexdumpin ja laskimen avulla, ja näyttivät ihan järkeviltä kaikki.

Pääongelma tässä lienee, että digiboksin ext2-tuki ei ole mitenkään kokonainen tai ihan speksin mukainen. Blocksize ainakin oli joka superblockin ilmoittaman luvun sekä niiden sijaintien mukaan ilmeisen epäortodoksinen; linuxin mke2fs:n (ext2:n luontityökalu) manuaalisivu sanoo, että kelvollisia arvoja blocksizelle ovat yksi, kaksi ja neljä kilotavua -- digiboksin levyssä tuo arvo oli 32 kilotavua. Suurempi arvo tuottaa kylläkin paremman suorituskyvyn isojen tiedostojen (videot) kanssa.

Ilmeisesti juurikin tästä syystä muutkaan työkalut (mount, debugfs, dumpe2fs, e2fsck, ...) eivät suostuneet hiplaamaan dataa. Tutkailin pitkään joka superblockia jotka osiolta dumppasin yksittäisiin tiedostoihin (superblock on vain kilotavun kokoinen, ja siitäkin hyötykäytössä vain parisataa tavua), eikä niissä näyttänyt eroavan käytännössä mikään arvo eli kaiken pitäisi olla kunnossa. Em. työkaluille voi kuitenkin ilmoittaa jonkun tietyn superblockin josta etsittäisiin tiedot, mutta siitä huolimatta eivät suostuneet tekemään mitään. Korruptoitunut superblock, ähhää ähhää, en osaa, valitteli kaikki. Myös blocksizen voi pakottaa käsin, mutta sekään ei auttanut.

Kyhäsin kokeilumielessä tuon em. speksin pohjalta pari pientä pythonskriptiä hakemistopuun tutkimiseen, ja se näytti olevan tallella ja kunnossa. Root-inodesta lähtien kun alkaa parsimaan hakemisto-nodeja, niin näkyy mitä tiedostoja levyllä on. Hassun muotoisia isoja videotiedostoja ja jotain pientä metadataa niille näytti siellä olevan.

Superblockeja voi yrittää raapustaa tiedostojärjestelmään uudelleen, jos tietää tarkasti mitä sen parametrien tulisi olla. Kuten googlatuista ohjeista, "mke2fs -S -t ext2 -m 0 -b 32768 -g 65536 -I 128 -F digiboksi.img" pitäisi jotenkin auttaa tässä ehkä. Eipä auttanut, e2fsck itkee tuon ajamisen jälkeen suurin piirtein joka kohdasta jotain. Mke2fs ei myöskään arvosta -g-vipuani vaan laittoi blocks per group -arvoksi 65528. Gnnh. Satunnainen eri arvojen sivistynyt arvailu ei myöskään tuottanut tulosta. Seuraavaksi pitäisi varmaan puukottaa esim. debugfs:n koodia ja laajentaa "rikki se on" -virheilmoa kertomaan, mikä meni rikki? Ei napannut.

Tänään tuli sitten googlailtua vähän lisää kun tenttikaudella tulee merkittävä houkutus keskityttyä lähinnä kaikkeen muuhun kun tentteihin kertaamiseen... Eipä auttanut lisägooglailukaan, kellään ei näyttäisi olevan vastaavaa ongelmaa. Noh, siinä se sitten. Pari telkusta tallennettua leffaa ei ole niin tärkeitä, että tuohon jaksaisi paria iltaa enempää uhrata aikaa. Jos joku päivä sattuu kokemaan jonkinlaisen ihan ihmeellisen valaistuksen tai jos on ihan erityisen tylsää, voisi kokeilla jotain uutta ideaa.

3 kommenttia

Oma kommenttisi

Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.

Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.

Hölmöt kommentit saatetaan moderoida pois jälkikäteen.

Nimimerkki:

Spammibottiesto: Mikä on nollan ja kahden erotus? (vastaus numeroina)