2015-07-24 11 views
9

Odkryłem, że biblioteka przestrzeni użytkownika FUSE i interfejs jądra zostały przeniesione, od momentu powstania na Linuksa, do wielu innych systemów i przedstawia względnie stabilny interfejs API o rzekomo małej powierzchni. Gdybym chciał stworzyć system plików w przestrzeni użytkownika, a ja nie byłbym w Planie 9 lub Hurd, sądziłbym, że FUSE to mój najlepszy wybór.Jak mogę utworzyć system plików przestrzeni użytkownika za pomocą FUSE bez użycia libfuse?

Jednak nie zamierzam używać libfuse. Częściowo jest to spowodowane pragmatyzmem; używanie C jest trudne w moim języku wyboru (Monte). Jest to również dlatego, że nie interesuje mnie napisanie kodu pomocniczego C, a zalecane użycie libfuse jest niezgodne z filozofią Monte. Nie powinno to stanowić problemu, ponieważ C nie jest magiczne i/dev/fuse można otworzyć za pomocą standardowych wywołań systemowych.

Idę jednak szukać dokumentacji, ale nie znalazłem żadnej. Nie ma dokumentacji, która mogłaby znaleźć dla/dev/fuse ABI/API, ani żadnych historii innych osób korzystających z tej samej trasy niezwiązanej z C. Denerwujący.

Czy istnieje jakaś dokumentacja dotycząca interakcji w sposób nieobowiązujący językowo z/dev/fuse i podsystemem FUSE jądra? Jeśli tak, czy możesz wskazać mi to? Dzięki!

Aktualizacja: istnieje go-fuse, który jest w Go, nieco bardziej czytelnym języku niż C. Jednak nie zawiera też żadnej dokumentacji ABI/API.

Aktualizacja: Widzę, że ludzie zagłosowali, aby to zamknąć. Nie martw się, nie ma takiej potrzeby. Przekonałem się, że dokumentacja, której pragnę, jeszcze nie istnieje. Napisam dokumentację, opublikuję ją, a następnie dołączę do niej w zaakceptowanej odpowiedzi. Mam nadzieję, że następna osoba, która wyszuka tę dokumentację, nie będzie zawiedziona.

+0

Wiem C; Byłem już przez jakiś czas (https://www.openhub.net/accounts/MostAwesomeDude). Monte ma filozofię bezpieczeństwa, co oznacza, że ​​większość zachowanych kodów C nie nadaje się do użytku. Cieszę się, że mogę to wyjaśnić na blogu, jeśli jest na to popyt. Co ważniejsze, C nie jest uprzywilejowany w swojej mechanice. Mogę tworzyć syscalls z dowolnej kompetentnej platformy, a strace pokazuje mi, że libfuse tworzy platformy. Chcę uniknąć konieczności inżynierii wstecznej biblioteki otwartego oprogramowania. – Corbin

+0

Nie trzeba niczego odtwarzać wstecz, ponieważ można po prostu odczytać kod źródłowy i dokumentację (http://fuse.sourceforge.net/doxygen/index.html). – hek2mgl

+0

Dokumentacja, do której masz link, nie przykryj ABI/dev/fuse, ani magiczne numery, które są posypane przez kod źródłowy. (Nie obejmuje nawet głównych plików źródłowych libfuse, tylko przykład użycia!) Rozumiem, że kod źródłowy jest dostępny; Przeczytałem to na około 2-3 h przed zadaniem tego pytania SO. Nie twierdzę, że brak dokumentacji jest nie do pokonania; Twierdzę, że wolałbym nie tracić czasu na inżynierię odwrotną, co może być już gdzieś udokumentowane. – Corbin

Odpowiedz

9

(nie jestem akceptując to, aż będzie pełna W międzyczasie zmiany są mile widziane.!)

podstawowy zarys sesji Bezpiecznik:

  • open() nazywa na /dev/fuse. Nazwę wynikowy FD kontrolką FD.
  • jest wywoływany z punktem montowania celu, typem systemu plików "bezpiecznik" dla trybu normalnego lub "bezpiecznikiem blokowym" dla trybu urządzenia blokowego, a opcje, w tym "fd = X", gdzie X jest sterownikiem FD.
  • Struktury specyficzne dla FUSE są przesyłane wielokrotnie na kontrolce FD. Ogólny wzorzec komunikacji jest zgodny ze wzorcem żądanie-odpowiedź, w którym polecenia systemu plików z odpowiedzi kontrolnej FD, a następnie z powrotem, otrzymują od siebie.
  • umount() jest wywoływana z punktem podłączenia celu.
  • close() jest wywoływana na sterowniku FD.

Po tym wszystkim powiedziane, istnieje garść komplikacji, o których należy pamiętać. Po pierwsze, mount() jest prawie zawsze uprzywilejowanym systemem, więc będziesz musiał być rootem, aby zamontować system plików FUSE. Jednak, jak można zauważyć, programy FUSE mogą być generalnie uruchamiane jako root. W jaki sposób?

Jest pomocnik, /bin/fusermount, zainstalowany setuid. Używanie jest całkowicie nieudokumentowane, ale po to tu jestem.Zamiast samodzielnego uruchomienia, należy wykonać jako podproces, przekazując docelowy punkt montowania jako argument, dowolne dodatkowe opcje montowania, które lubisz z -o i (co najważniejsze) z wyeksportowaną zmienną środowiskową _FUSE_COMMFD i ustawioną na ciąg ASCII otwartego FD, który nazwałbym comm FD. Musisz utworzyć Comm FD sam, używając np. pipe(). fusermount zadzwoni pod numer open() i mount(), a następnie udostępni kontroler FD z powrotem w komunikatorze FD, podając sztuczkę sendmsg() do udostępniania FD. Użyj recvmsg(), aby go odczytać.

Od redakcji: Naprawdę nie rozumiem, dlaczego jest to tak trudne. FD są dziedziczone przez podprocesy; O wiele łatwiej byłoby uzyskać kontrolkę FD w górnym procesie i przekazać ją do fusermount. To prawda, że ​​istnieje pewne zdezorientowane zagrożenia, ale fusermount jest już zainstalowany i ustawiony na niebezpieczny.

W każdym razie! fusermount będzie z łatwością demonizować i zadbać o wywołanie umount() i do czyszczenia po zakończeniu głównego procesu.

Sprawy nie objęte jeszcze:

  • Jak bez blokowania dostępu do FUSE obchodzić? Czy kontrola FD może być po prostu kopnięta w tryb bez blokowania? Czy faktycznie nie blokuje, czy zachowuje się jak zwykły plik i potajemnie blokuje dostęp?
  • Układy strukturalne. Mogą one być mniej lub bardziej odkrywane na nowo ze źródła C lub Go, ale to nie jest żadna wymówka. Będę dokumentował je bardziej poważnie, gdy rozwinąłem wystarczający masochizm.
+0

Myślę, że już znalazłeś odpowiedź. Możesz zainteresować się kodem do sfałszowania. http://read.pudn.com/downloads96/sourcecode/unix_linux/392124/fuse-2.6.5/util/fusermount.c__.htm –

+0

@Corbin, więc ... czy kiedykolwiek otrzymałeś odpowiedź na pozostałe pytania i czy faktycznie używasz tego podejścia? – aurora

+0

Zdałem sobie sprawę, że BEZPIECZNIK nie jest tym, czego chciałem. Jest różnica między "w przestrzeni użytkownika" i "nieuprzywilejowanym", a ja chciałem to drugie. Nie zrobiłem żadnych badań na ten temat, przepraszam. – Corbin