POrtable Dodgy Filesystems in Userland (hacK)

(alias podfuk)

Proc vzniknul podfuk

Predpokladejme, ze mate cosi (v nasem pripade soubor.tar) a radi byste to pouzivali jako filesystem. (To cosi muze byt v podstate cokoliv - prostor ftp, nebo macintoshi disketa.) Jake mate moznosti?

Takze ted uz jste si asi domysleli, ze podfuk je tu od toho aby bylo mozne relativne jednoduse pridavat filesystemy, ktere nevyzaduji implementaci do jadra.

Nevyhody

Podfuk pouziva NFS, coz je asi nejvetsi vyhodou, ale take dost velkou slabinou. Protokol NFS je broken by design. (Nevim jak to prelozit, proste je spatne a nemuze nikdy uplne spolehlive fugnovat.) To nic nemeni na faktu ze v praxi docela dobre funguje. NFSv2 je na nekterych operacich (listing adresare) pomale. (ls v /overlay/dev trva neco jako sekundu.)

Universal NFS server byl staven jako jednothreadovy. To znamena ze v jeden okamzik vyrizuje vzdy jen jeden pozadavek (a tim padem se od pozadavku ceka ze budou trvat kratkou dobu). To je bohuzel pro mnohe filesystemy neprijatelne - cteni z konce souboru pristupneho po ftp muze take trvat hodinu. Tohle by jeste slo (relativne jednoduse) resit. Co je horsi, linuxova implementace nfs klienta moc nepocita s tim ze by NFS server mohl neco takoveho delat a napriklad pokud nfs server neodpovida na readdir neposle dalsi readdir.

Spravna vec by byla opravit nfs klienta v linuxu a potom dodelat do serveru multithreading. Na to prvni nemam zaludek :-(.

Jinymi slovy podfuk nepodporuje ftp filesystem ani sitovy mc filesystem.

Midnight commander

Midnight commander je klon znameho norton commanderu, vyvijeny pod GPL skupinou lidi kolem Miguela de Icazy. Jednou z jeho hezkych vlastnosti je to ze je portabilni, druhou peknou funkci jsou jeho virtualni filesystemy. Midnight obsahuje vrstvu vfs, ktera mu umoznuje relativne jednoduse pracovat s filesystemy jako je tar, ftp, zip, rar, deb, rpm a dalsi.

Vfs vrstva (v distribuci midnighta podadresar vfs/) navenek exportuje funkce jako mc_open(), mc_read(), mc_close(), mc_unlink(), ... Tyto funkce se od svych systemovych protejsku lisi tim, ze mohou pracovat s virtualnimi soubory. Takze

handle = mc_open( "soubor.tar#utar/README", O_RDONLY ); 
mc_read( handle, buffer, 10240 );
opravdu udela to co byste cekali: precte prvnich 10K ze souboru README zabaleneho do baliku soubor.tar.

Vfs vrstva byla puvodne neoddelitelnou soucasti midnight commanderu. To zustalo, ale nyni je mozne vfs skompilovat i samostatne: vznikne libvfs.so, kterou muze pouzivat kdokoliv. (Aktualne kdokoliv == kdokoliv kdo je napsan pod GPL, ale to se doufam zmeni.)

Dalsi krok je jednoduchy: udelat aby nfs server pouzival pro svoji funkce knihovnu vfs. V podstate to znamenalo nahradit cast vyskytu funkci xxx funkcemi mc_xxx.

Pouziti

Cesty vypadaji z hlediska podfuku takto: /cesta.../jmeno_realneho_souboru#operace[/cesta ve virtualnim strome].

Operace je v podstate jmeno jednoho z virtualnich filesystemu (napriklad #utar, #ugz), cesta je cesta v ramci tar souboru v pripade filesystemu jako #utar, nebo cesta v ramci ftp serveru v pripade #ftp: filesystemu. Cesta nema smysl pro filesystemy jako #ugz, ktere obsahuji prave jeden soubor.

Realny_soubor je jmeno souboru/adresare se kterym se pracuje, nebo / v pripade ze takova vec nema smysl (takze adresar midnight commanderu na sunsitu bude /#ftp:sunsite.ms.mff.cuni.cz/pub/GNU/mc/).

Na to, aby mohl modifikovany nfs ukazovat virtualni soubory, musi se dozvedet o pozadavku. Takze pokud mate podfuk namountovany na /overlay a chcete soubor README z baliku /tmp/balik.tar, musite pouzit cestu /overlay/tmp/balik.tar#utar/README (kdyby nebylo pocatecniho /overlay, kernel by nemel zadny duvod ptat se NFS-ka na tento soubor protoze by povazoval /tmp za lokalni cestu).

Kernelovy hack

Manualni pridavani /overlay k cestam se muze zdat nepohodlne. Co je horsi, ono to opravdu nepohodlne je. Nastesti existuje reseni v podobe kerneloveho hacku. Tento hack neni portabilni (ale to moc nevadi - podfuk funguje i bez nej i kdyz se nepouziva tak prijemne). Dela v podstate to, ze pokud se nejaka aplikace zepta na cestu s # ve jmene, a cesta neexistuje, zkusi kernel jeste cestu zacinajici /overlay.

Dalsi informace

Dalsi informace jsou na domaci strance podfuku.


Tento text byl vytvoren k referatu na seminari Linux (predneseneho 21.5.1998).

Pavel Machek
pavel@atrey.karlin.mff.cuni.cz