Open Source Libferris: Chasing Alt er en File System Dream

Den åpen kildekode libferris prosjektet er et virtuelt filsystem som tar sikte på å gi en enkelt fil system grensesnitt for alle data. Jeg har vært fremme libferris mot dette målet i løpet av de siste ti årene. Over den gang har libferris fått støtte for montering relasjonsdatabaser; fysiske enheter som skrivere, webkameraer og skannere; sammensatte filer som Berkeley DB og XML-filer; applikasjoner som Amarok, Firefox, emacs, Pulseaudio, Xwindow, dbus, og evolusjon; og mer nylig webtjenester som GDrive, YouTube, Vimeo og Flickr, samt mange andre ting.

Libferris gir deg den samme filsystem tilgang til alle de ovennevnte datakildene. Hvorfor bør du ikke være i stand til å bruke en teksteditor av valget for å redigere en kommentar på Flickr eller din foretrukne bildeviser å se på en virtuell jpeg opprettet fra et webkamera. Gir et filsystem API lar alle applikasjoner tilgang (og potensielt oppdatere) noe libferris kan få på. For å gi tilgang til så mange ting som mulig libferris kjører i brukeradresseområdet. Ting som får tilgang til relasjonsdatabaser skal ikke måtte skje fra innsiden av Linux-kjernen selv. Når et filsystem er montert kan du grave i metadata, noe som gjør det enklere å finne, filter og indeksen.

Jeg har noen eksempler på kommandolinjen bruk av noen av disse funksjonene senere i artikkelen. Men først skal jeg gi deg litt mer bakgrunnsinformasjon om noen av de viktigste funksjonene.

Tilgang Metadata

Tidlig i prosjektets levetid, ble det klart at det å bruke bare kataloger og filer gjort det unaturlig og vanskelig å få tilgang til metadata, for eksempel små biter av informasjon som bredden og høyden på et bilde eller en artist av en lydfil. Moderne filsystemer tilbyr nå en utvidet Attribute (EA) grensesnitt som lar nøkkelverdipar å bli assosiert med filer. Bygger på den ideen ble EA-grensesnittet også virtualisert i libferris å la nøkkelverdipar å komme fra og gå til mange steder.

Å ha "mange steder" for metadata som kommer fra og går til kan virke forvirrende i begynnelsen, så forhåpentligvis noen eksempler vil klare ting opp litt. Lest "bredde" EA på en bildefil vil føre libferris å trene bredden i piksler i bildet og returnere det til deg som verdien av EA. Hvis du har kernel EA tilgjengelig i ditt hjemmeområde, skrive til "foo" EA på en bildefil i libferris vil føre til at EA skal lagres av Linux-kjernen filsystem i en på disk EA. Hvis du ikke har kernel EA support, eller filrettigheter ikke tillate deg å skrive en EA på en fil, libferris da vil lagre som EA for deg i en RDF depotet. Når du monterer en relasjonsdatabase eller XML-fil og deretter EA vil komme fra databasen tuples eller XML-attributter. Så mesteparten av tiden du trenger ikke å bry seg om detaljene, vil metadata lagring prøve å "gjøre hva du mener" og har RDF reserve.

Den fallback til å bruke RDF lar deg lagre metadata på alle virtuelle filsystem uavhengig av hva den underliggende lagrings tillater deg å gjøre. For eksempel kan du kommentere en nettside og libferris vil lagre det for deg i RDF og gjøre den tilgjengelig gjennom den samme EA grensesnitt som alle metadata er tilgjengelig gjennom. For de semantiske web fans der ute, kan du også smush din RDF metadata og koble flere nettadresser som skal logisk dele metadata.

Sorter og Filter Metadata

En enkelt fil Systemet API tillater kommandolinje verktøy som ls, cp, katt, io omdirigering og andre til å grave i en datakilde som libferris har tilgang til. På en lignende måte, med alle metadata tilbys gjennom EA nøkkelverdien grensesnittet tillater sortering og filtrering støtte i libferris å brukes på alle metadata. Hvis du ønsker å se bildene i en katalog sortert etter mime-type, blenderåpningen, og deretter ved modifisering tid kan du gjøre det med ferrisls. Hver EA kan ha typen informasjon knyttet til den, og de fleste gjør. Så libferris vet at "size" og "bredde" EA er tall og kan sortere verdiene som du forventer.

Index og Søk

Når filsystemet og metadata grensesnitt var tilgjengelig det var fornuftig å legge indeksere og søke støtte. Det er mange implementeringer av indeksering å velge mellom, og ingen enkel implementering av indeksen og søk gir de beste resultatene i alle situasjoner. Du vil kanskje bruke en liten minnetilordnede fil på et lavt strømforbruk NAS for å gi enkel isere (1) funksjonalitet, mens på et større filserver du kanskje vil bruke PostgreSQL for indeksering behov. Resultatene fra en spørring kan også returneres som en libferris filsystem. Så du kan direkte "katt" eller ferriscp resultatene av et søk.

Du kan også forbund flere libferris indekser sammen for å kombinere resultater fra flere steder, for eksempel en lokal indeks på ditt hjemmeområde på stasjonære maskinen og en filserver indeks.
Får tak i ...

OK, så nok med historie og oversikt, og videre med hvordan du installerer libferris (lenger nedenfor) og noen eksempler på ting som du kan finne nyttig å gjøre med det.

Tilgang og endre filer

Tenk nedenfor XML-filen som et eksempel inngang. Bruke ferrisls du kan nå langt inn i en XML-fil og liste elementene på alle nivå. Dette er en vanlig samspill stil i libferris for filer som kan sees på som sammensatt slik som XML, DB4, arkiver, csv og så videre. Du trenger ikke å bekymre deg for montering, bare lese filen som om det var en katalog.

Hvis du vet litt mer om strukturen til XML-filen, kan du velge hvilke XML attributter du vil bruker libferris filsystemet Utvidet Egenskap grensesnitt. Den --show-ea alternativ til ferrisls forteller den hva EA du ønsker å se i oppføringen. I dette tilfellet er det filsystemet EA opprettet fra og sende data til XML-attributter

 $ cat basic.xml. ≪ top > < person name = "alice" alder = "25" /> < person name = "bob" alder = "32" /> < person name = "cathy" alder = "35" >! boo < /person > < /top > $ ferrisls basic.xml /top 0 alice 0 bob 0 cathy $ ferrisls --show-ea = navn, alder basic.xml /topalice 25bob 32cathy 35 $ fcat basic.xml /topp /cathyboo! 

Libferris kan også utføre modifiserende tiltak på mange av sine virtuelle filsystemer, og sikkert for monterte XML-filer. Eksempelet nedenfor bruker pariser-redirect-kommandoen til å streame data fra sin standard inngang inn i noen libferris fil. Libferris har også FerrisFUSE som gir en implementering av Filesystem i userspace. Så du kan få tilgang libferris med noen verktøy som kan bruke en Linux i kernel filsystem hvis du vil. For eksempel kan du også montere basic.xml filen ved hjelp FerrisFUSE og bare bruke vanlig bash omdirigering å oppdatere den

Jeg har reimplemented mange av de grunnleggende filsystem verktøy for to grunner:. Slik at FUSE er ikke alltid nødvendig (ingen eksplisitt montering og demontering), og for å være i stand til å gi utvidet funksjonalitet som sortering og filtrering utgang på alle metadata at filsystemet tilbud. Du kan vurdere sekvensen | pariser-redirect filnavn
å være mye som > filnavn
i bash omdirigering men med pariser-omdirigere du kan skrive at data til flere steder. Som du kan se i under, jeg har oppdatert teksten innholdet i bob XML element ved hjelp io omdirigering

 $ echo "en veldig hyggelig fyr". | pariser-redirect basic.xml /topp /bob $ cat basic.xml <? xml version = "1.0" encoding = "UTF-8" standalone = "no" >? < top > < person alder = "25" name = "alice" /> < person alder = "32" name = "bob" > en veldig hyggelig fyr < /person > < person alder = "35" name = "cathy" >! boo < /person > < /top > 

Hvis du foretrekker binære filer til XML, kan du montere Berkeley DB4 på samme måte som XML med libferris. Nedenfor bruker jeg "fcreate" verktøy for å lage en ny tomt Berkeley DB4 fil. Den "RDN" betyr Relative Distinguished Name og er litt av en etterlevning fra tidlig bruk av noen LDAP navngiving. Jeg vil sannsynligvis konvertere "RDN" forekomster til "filnavn" gjennom koden i fremtiden. Fordi en montert DB4 fil og en montert XML-fil er utsatt i en svært lik måte, kan du kjøre XQuery på DB4 i stedet for XML-filer hvis du ønsker å øke hastigheten på noen av oppslagene i søket.

 $ fcreate --create-type = DB4 --rdn = foo.db .Created ny kontekst: file: ///tmp/foo.db$ ls -IH foo.db-rw -------. 1 ben ben 8.0K 30 desember 19:52 foo.db $ date | pariser-omdirigere foo.db /fil1 $ fcat foo.db /file1Mon 30 desember 19:52:41 EST 2013 $ db_dump -p foo.dbVERSION = 3format = Printtype = btreedb_pagesize = 4096HEADER = END fil1 man 30 desember 19:52:41 EST 2013 \\ 0aDATA = END 
Mount relasjonsdatabaser

Libferris kan også montere relasjonsdatabaser som filsystemer bruker QtSql og det har også eksplisitt støtte for montering PostgreSQL. Den utvidede attributtet Grensesnittet er svært nyttig her som tuples i en tabell kart pent til filer i filsystemet og kolonnene i et tuppel kart til EA for hver fil. Nedenfor lager jeg en enkel SQLite database med bare ett bord. Bruke ferrisls -IH viser at filen for hver tuppel heter hjelp av "navn" kolonnen fra bordet. Du kan liste opp noen bord å bruke banen format databasename /tabellnavn som vist. For PostgreSQL databaser kan du også få tilgang PostgreSQL funksjoner gjennom filsystemet.

ferrisls -0 alternativet utfyller normal -l lang oppføring muligheten til ls. Den viktigste forskjellen er at med -0 du spør filsystemet selv hva de mener er de mest interessante EA for deg å se. Noen ganger er det mer interessante ting enn størrelsen, beskyttelse biter, og mtime å se. I dette tilfellet blir hver kolonne fra databasen tabellen regnes som "interessant" sammen med en EA forteller deg hva primærnøkkelen for tuppel er. Dette er den gjentatte "id" på slutten av ferrisls -0 utgang. De --xml og --json alternativer bygge på -0 alternativet, men produsere et resultat i XML eller JSON format henholdsvis

 $ sqlite3 test.dbSQLite versjon 3.8.2 2013-12-06. 14: 53: 30Enter ".help" for instructionsEnter SQL-setninger avsluttet med en ";" sqlite > lage tabell trær (navn varchar, teller int, id heltall primærnøkkel autoincrement); sqlite > sette inn i trær (navn, telle) verdier ('General Sherman', 5); SQLite > sette inn i trær (navn, telle) verdier ('Gum', 44); sqlite > sette inn i trær (navn, telle) verdier ('Mahogany', 9); SQLite > select * fra trær, General Sherman | 5 | 1Gum | 44 | 2Mahogany | 9 | 3 $ ferrisls -LH test.db /trær 56 General Sherman 45 Gum 49 Mahogany $ ferrisls -0 test.db /treesGeneral Sherman 5 1 General Sherman idGum 44 2 Gum idMahogany 9 3 Mahogany id $ ferrisls --xml test.db /trær <? xml version = "1.0" encoding = "UTF-8" standalone = "ingen" >? < ferrisls > < ferrisls telle = "" id = "" name = "trær" primær-key = "id" url = "file: ///tmp/test.db/trees" > < sammenheng count = "5" id = "1" name = "General Sherman" primær-key = "id" /> < sammenheng count = "44" id = "2" name = "Gum" primær-key = "id" /> < sammenheng count = "9" id = "3" name = "Mahogany" primær-key = "id" /> < /ferrisls > < /ferrisls > $ ferrisls --json test.db /trær {"barn": {"1": {"name": "General Sherman"}, "2": {"name": "Gum"}, "3": {"name": "Mahogany"}}, "self": {"name": "trær"}} 
Oppdater databaser

Databaser kan også bli oppdatert gjennom filsystemet ved å skrive til EA, som vist nedenfor. -a Alternativ til pariser-redirect fører til at data som skal skrives til den gitte (utvidet) attributt i stedet for inn i hovedinnholdet i filen. Skjermbildet nedenfor er "ego" filbehandler som lar deg klikke direkte å redigere EA. Mye av funksjonaliteten til ego er tilgjengelig gjennom mange sidepaneler, dra og slipp, og kontekstmenyer. Dersom du monterer SQLite virker interessant, se min lengre blogginnlegg for mer informasjon inkludert opprette virtuelle tabeller i SQLite å få tilgang libferris og utsette en apache access_log fil gjennom libferris som en virtuell tabell

 $ echo -n Gum treet. | pariser-omdirigere -a navn test.db /trær /2 $ ferrisls -0 test.db /treesGeneral Sherman 5 1 General Sherman idGum Tre 44 2 Gum Tre idMahogany 9 3 Mahogany id 
Mount Google-regneark Anmeldelser

Når jeg ser tilbake på hvordan SQLite database tabeller blir eksponert gjennom filsystemet, er det ikke mye av en strekning å se at et regneark kan bli utsatt som én fil per rad og EA for å få tilgang til hver kolonne. Libferris har støtte for mange av Googles tjenester som regneark, YouTube, og Drive. Regnearket tilgang på cellenivå, slik at du kan opprette og oppdatere regneark fra kommandolinjen som jeg har gjort i eksempelet nedenfor. Det er mer informasjon om montering Google-regneark med libferris

 $ ferrisls -0 google. //Docsdrivespreadsheetsyoutube $ echo 20 | pariser-omdirigere -a c google: //regneark /smalltest1 /Sheet5 /2 $ echo 7 | pariser-omdirigere -a c google: //regneark /smalltest1 /Sheet5 /3 $ echo 14 | pariser-omdirigere -a c google: //regneark /smalltest1 /Sheet5 /4 $ echo -n "= sum (C2: C4)" | pariser-omdirigere --ea c google: //regneark /smalltest1 /Sheet5 /11 412 203 7 4 14 
Mount Google Drive

Støtte for montering Google Drive ble lagt tidligere i 2013. En viktig funksjon i nettlagringssteder er evnen til å selektivt dele filene dine med andre mennesker. For å gjøre dette med en montert Google Drive, bare ekko e-postadressen til den personen du ønsker å dele en opplastet fil med inn i "aksjer" EA med libferris

 $ ferriscp goodstuff.txt google. //Kjøretur /$ echo ". Denne e-postadressen er beskyttet mot programmer som samler Du må aktivere Javascript for å kunne se" \\ | pariser-redirect-a-aksjer "google: //drive/goodstuff.txt" $ echo ". Denne e-postadressen er beskyttet mot programmer som samler aktivere Javascript for å kunne se den" \\ | pariser-redirect-a-aksjer "google: //drive/goodstuff.txt" 
Mount applikasjoner

Flytte sammen til montering enkelte programmer, eksemplene nedenfor viser monterings Amarok, utklippstavlen , GStreamer, tilregnelig, og Flickr. Amarok har tre hoved kataloger i filsystemet; kontroll, strøm, og spilleliste. Ferrisls på Amarok: //kontroll vil også vise deg den nåværende tilstand av Amarok. I kontrollgruppen katalogen, kan play /pause veksle fil styre hvis Amarok spiller, kan du stille volumet ved å skrive inn en verdi (prosent av full volum) i volumet fil. Amarok spillelisten er avslørt som en virtuell katalog og du kan direkte "kopier" låtene fra det virtuelle katalogen til et annet filsystem hvis du vil.

utklippstavlen filsystem er støttet av Klippper slik at du ikke kan se det med mindre du bruker KDE. GStreamer filsystem gir deg tilgang til medier og få JPEG-bilder og videostrømmer gjennom den virtuelle filsystem. Så du kan få på den bærbare datamaskinen eller mobilkameraet over nettverket uten å måtte tenke på hvordan å lese bildedata fra disse enhetene. Skanneren og Flickr API er filsystemer du kan kopiere data fra skanneren direkte til nettet. Eller du kan hente data fra en hvilken som helst annen libferris filsystem som GStreamer eller faktisk en annen Flickr API implementere nettsted og kopiere den til web

 $ echo 1. | pariser-redirect amarok: //kontroll /toggle-play-pause $ echo 20 | pariser-omdirigere -T amarok: //kontroll /volum $ echo 89 | pariser-omdirigere -T amarok: //kontroll /volum $ ferrisls -0 amarok: //controlpause 0play 1toggle-play-pause 1volume 89 $ ferrisls -0 amarok: //playlist1 02:56 Mark Forry, Yvette ... fri programvare Song ... $ ferriscp amarok: //spilleliste /1 /media /portableplayer /$ ferrisls -0 Xwin: //localhost /clipboard0 Bueller ... Bueller .... 1 eksempler ... $ fcat Xwin: //localhost /utklippstavlen /0bueller ... Bueller .... $ fcat gstreamer: //capture/lid.jpg | okular - $ ferriscp skanner: //default/gray-full-300/scan.jpg flickr: //meg /laste opp 
Autentisering webtjenester

Autentisering med web-tjenester og andre datalagre er satt opp med pariser-capplet-auth. Dette håndterer OAuth handshaking med nettsteder som gir en implementering av Flickr API, Facebook, Vimeo, og Google-tjenester. Det er også her du kan konfigurere autentiseringsinformasjon til PostgreSQL, Zoneminder, og FerrisREST servere. På denne måten nettadresser i libferris ikke inneholder brukerlegitimasjon og absolutt ikke noen gang har passord i dem. Slik at risikoen for uhell dele en nettadresse med autentiseringsinformasjon i den blir dårligere. Du kan også bruke pariser-capplet-auth uten en GUI som vist nedenfor. Du vil bli gitt adresse du vil besøke for å autentisere libferris og ba om symboler på riktige tidspunkt for å fullføre håndtrykk. Detaljer om godkjenning er i en tidligere linux.com artikkelen.

 $ pariser-capplet-auth --auth-tjeneste GDrive --auth-med-site GDrive ... $ pariser-capplet-auth --list -auth-sitesfacebookflickr23hqpixelpipevimeogoogle 
Alternative tilgang

Noen ganger kan det være nyttig å få tilgang til ting som libferris kan montere gjennom andre systemer, liksom som å se på det motsatte av alt er et filsystem . For tiden kan du få tilgang libferris som KIO slave, gjennom FUSE, som KDE Plasma datakilde, som en SQLite virtuelle bordet, som en virtuell Xerces-C ++ DOM, og gjennom XQuery bruker XQilla. Det er også starten på språk bindinger, hovedsakelig rettet mot Guile og Perl. Å ha Perl støtte på IO :: All nivå er det endelige målet. Støtter foreløpig er det å knytte til en fil håndtak slik at under koden for å lage en PDF med gjeldende tid i det

 # /usr /bin /perluse Tid :: local;.! Bruke libferris; $ AVKORT = 0; mineoptions = (); push (options, "AVKORT») hvis $ AVKORT, slips (* FERRIS, 'libferris', '> skriver: //Cups-PDF/foo.pdf',options); skrive ut FERRIS ctime (), "\\ n"; løse (* FERRIS); 
Installer libferris

Hvis du er tilstrekkelig fascinert av prosjektet, gå prøve den ut. Jeg har oppdatert min Fedora 20 pakker på opensuse Build Tjenesten som er tilgjengelig på Fedora_20. Etter nedlasting hjem: monkeyiq.repo fra linken over for å /etc/yum.repos.d/du bør være i stand til å installere libferris ved hjelp av kommandoen nedenfor. Dette er de pakkene jeg bruker på min laptop og bygge jeg pleide å kjøre mange av eksemplene i denne artikkelen. Jeg har også noen pakker for Debian ARM hardfloat

 # yum install libferris-suite 

En styrke libferris er også en av sine svake punkter.; fordi det er støtte for montering mange datalagre, trekke ut metadata fra mange filer, og ulike indeks implementeringer, er det andre biblioteker som libferris bruker for mange av disse tingene som kan gjøre bygningen libferris litt skremmende for førstegangsbrukere. Mange av funksjonene er valgfrie, og det deaktiveres ved configure tid hvis bibliotekene ikke er installert på systemet ditt. Noen lavere nivå avhengigheter har blitt delt ut av libferris seg selv som libferrisstreams, stldb4 og fampp som gir noen C ++ std :: iostream støtte, et grensesnitt til Berkeley DB4, og filen endring overvåking hhv. De viktigste tingene som Libferris behov som du kanskje ikke har installert er Xerces-C 3, Boost, og utvikling overskrifter for en mime motor (KDE, GNOME, efsd, eller libfile). Hvis du ønsker å montere noen av web-tjenester så qjson og qoauth må installeres også.

Flere kommer

I fremtiden håper jeg å legge til støtte for monterings flere webtjenester og forbedre web front end til libferris. Montering webtjenester er mer av en utfordring enn lokale kilder på grunn av struping, nettverk ventetid, og REST API endre på innfall av selskapet kjører nettstedet. Jeg vil også fortsette min søken å ha libferris inkludert i en main stream Linux-distribusjon for å gjøre det enkelt å installere for flere mennesker.