2015-07-24 15 views
9

Ho scoperto che la libreria dello spazio utente FUSE e l'interfaccia del kernel sono stati portati, sin dal suo inizio su Linux, a molti altri sistemi e presenta un'API relativamente stabile con una superficie apparentemente piccola. Se volessi creare un filesystem in userspace e non fossi su Plan 9 o Hurd, penserei che FUSE sia la scelta migliore.Come posso creare un filesystem userspace con FUSE senza usare libfuse?

Tuttavia, non ho intenzione di utilizzare libfuse. Ciò è parzialmente dovuto al pragmatismo; usare C è difficile nella mia lingua di scelta (Monte). È anche perché non sono totalmente interessato a scrivere il codice di supporto C, e l'uso consigliato da libfuse è incompatibile con la filosofia Monte. Questo non dovrebbe essere un problema, dal momento che C non è magico e/dev/fuse può essere aperto con chiamate di sistema standard.

Andando a cercare documentazione, tuttavia, non ne ho trovato nessuno. Non c'è documentazione che io possa trovare per/dev/fuse ABI/API, e nessuna storia di altri che prendono questa stessa rotta non legata a C. Frustrante.

Esiste qualche tipo di documentazione su come interagire in un modo agnostico con/dev/fuse e il sottosistema FUSE del kernel? Se è così, potresti indicarmi? Grazie!

Aggiornamento: esiste go-fuse, che è in Go, un linguaggio leggermente più leggibile di C. Tuttavia, non contiene alcuna documentazione ABI/API.

Aggiornamento: noto che le persone hanno votato per chiudere questo. Non preoccuparti, non ce n'è bisogno. Mi sono accertato che la documentazione che desidero non esiste ancora. Scriverò personalmente la documentazione, la pubblicherò e quindi la collegherò in una risposta accettata. Speriamo che la prossima persona a cercare questa documentazione non rimarrà delusa.

+0

Conosco C; Sono in giro da un po '(https://www.openhub.net/accounts/MostAwesomeDude). Monte ha una filosofia di sicurezza che significa che la maggior parte del codice C esistente non è utilizzabile. Sono felice di esporlo in un post sul blog, se c'è una domanda. Ancora più importante, C non ha privilegi nella sua meccanica. Posso creare syscalls da qualsiasi piattaforma competente, e strace mi mostra che libfuse rende syscalls. Voglio evitare di dover decodificare una libreria open-source. – Corbin

+0

Non è necessario eseguire la decodifica nulla poiché è possibile leggere semplicemente il codice sorgente e la [documentazione] (http://fuse.sourceforge.net/doxygen/index.html) – hek2mgl

+0

La documentazione a cui si è collegato non coprire l'ABI di/dev/fuse, né i numeri magici che sono cosparsi in tutto il codice sorgente. (Non copre nemmeno i file sorgente principali di libfuse, solo un esempio di utilizzo!) Capisco che il codice sorgente sia disponibile; L'ho letto per circa 2-3 ore prima di porre questa domanda. Non sto affermando che la mancanza di documentazione sia insormontabile; Sto sostenendo che preferirei non sprecare tempo nel reverse-engineering, cosa che potrebbe già essere documentato da qualche parte. – Corbin

risposta

9

(non sto accettando questo finché non è completa Nel frattempo, le modifiche sono i benvenuti.!)

La struttura di base di una sessione FUSE:

  • open() è chiamato a /dev/fuse. Chiamerò il FD risultante con il controllo FD.
  • mount() viene chiamato con il punto di montaggio di destinazione, il tipo di file system "fuse" per la modalità normale o "fuseblk" per la modalità blocco-dispositivo e le opzioni che includono "fd = X" dove X è il controllo FD.
  • Le strutture specifiche del FUSE vengono trasferite ripetutamente sul controllo FD. Il modello generale di comunicazione segue un modello di richiesta-risposta, in cui il programma il file system read() s comanda il controllo FD e quindi le risposte write() s.
  • umount() viene chiamato con il punto di montaggio di destinazione.
  • close() viene chiamato sul controllo FD.

Detto questo, c'è una manciata di complicazioni di cui dovresti essere a conoscenza. Innanzitutto, mount() è quasi sempre un syscall privilegiato, quindi dovrai essere root per montare un filesystem FUSE. Tuttavia, come si può notare, i programmi FUSE possono essere generalmente avviati come non-root! Come?

C'è un helper, /bin/fusermount, installato setuid. L'utilizzo è totalmente non documentato, ma è per questo che sono qui.Invece di open() ing /dev/fuse, esegui fusermount come sottoprocesso, passando il punto di montaggio di destinazione come argomento, eventuali opzioni di montaggio aggiuntive che ti piacciono con -o e (in modo cruciale) esportate e impostate sulla stringa ASCII di un open FD, che chiamerò il comm FD. Devi creare tu stesso il FD comm utilizzando ad es. pipe(). fusermount chiamerà per voi open() e mount() e condividerà il controllo FD lungo il FD comm, utilizzando il trucco sendmsg() per la condivisione di FD. Utilizzare recvmsg() per leggerlo di nuovo.

Editorial: Io davvero non capisco perché questo è strutturato per essere così difficile. I FD sono ereditati da sottoprocessi; sarebbe stato molto più facile per open() il controllo FD nel processo in alto e passarlo in fusermount. È vero, ci sono alcuni pericoli confusi, ma fusermount è già installato, setuid e pericoloso.

In ogni caso! fusermount cronicamente demonizzerà e si prenderà cura di chiamare umount() e close() per ripulire una volta che il processo principale si chiude.

Le cose non ancora coperti:

  • Come non è bloccando l'accesso a FUSE gestito? È possibile avviare il controllo FD in modalità non bloccante? In realtà non si blocca, o si comporta come un normale file e blocca segretamente l'accesso?
  • I layout della struttura. Questi possono essere più o meno riscoperti dalla sorgente C o Go, ma non è una scusa. Li documenterò più seriamente quando avrò elaborato un masochismo sufficiente.
+0

Penso che tu abbia già trovato la risposta. Potresti essere interessato al codice fusermount. http://read.pudn.com/downloads96/sourcecode/unix_linux/392124/fuse-2.6.5/util/fusermount.c__.htm –

+0

@Corbin quindi ... ha mai ottenuto la risposta alle domande rimanenti e l'ha fatto effettivamente utilizzare questo approccio? – aurora

+0

Mi sono reso conto che FUSE non era proprio quello che volevo. C'è una differenza tra "in userspace" e "unprivileged", e volevo quest'ultimo. Non ho fatto ricerche su questo da allora, mi dispiace. – Corbin

Problemi correlati