fuse
DESCRIPTION
TRANSCRIPT
FUSEFilesystem in Userspace
Ce este un sistem de fisiere?• modul de organizare si stocare a informatiilor pe un
suport de memorie extern in vederea accesarii si prelucrarii lor de catre sistemul de operare
• sisteme virtuale de fisiere(VFS) – interfata intre nucleu si sistemul de fisiere concret; permite aplicatiilor client sa acceseze uniform sisteme de fisiere diferite
• inainte de aparitia sistemelor de fisiere in spatiul
utilizator dezvoltarea lor era facuta de catre programatorul nucleului, fapt ce necesita cunostinte in tehnologia si programarea nucleului
Ce este FUSE?librarie ce permite dezvoltarea propriului sistem de
fisiere functional in Linuxinterfata simpla pentru programele din spatiul utilizator
ce permite exportul unui sistem de fisiere virtual pe un nucleu Linux
util in scrierea sistemelor virtuale de fisiere; acestea nu salveaza datele propriu-zis ci sunt o traducere pentru un sistem de fisiere existent
detine recordul pentru stabilitate a aplicatiilor dezvoltatesuporta kernel 2.4.x si 2.6.xsuporta Java(FUSE-J) – nu doar C/C++
Ce ofera FUSE?API(Application programming interface) simplu
ce poate fi accesat si de utilizatorii neprivilegiatiimplementare siguranu necesita cunostinte de programare a
nucleuluidebug simplu – foloseste fisiere executabile modalitate simpla pentru useri neprivilegiati de
a crea si incarca propriile implementari a unor sisteme de fisiere
Cum functioneaza?
Componente:1. Libraria fuse2. Modul nucleu
1. Libraria Fuse
2. Modul kernelAre 2 componente:1. proc filesystem raspunde cererilor I/O pentru fisierul /dev/fuse functii: fuse_dev_read() – returneaza comenzi din lista de cereri fuse_dev_write() - pune datele trimise in structura req->out, de unde pot fi
returnate prin lista de cereri
2. apelurile sistem – apeleaza urmatoarele functii: request_send() – adauga cererea in lista de cereri si asteapta raspunsul request_send_nonblock() – comportament neblocant request_send_noreply() - nu asteapta raspuns
Cerinte si instalareo Linux kernel, versiunea 2.6.x, x>=9o Instalaredescarcati codul sursa FUSEdezarhivati pachetul tar –zxvf fuse2.8.1.tar.gz -veti obtine un director FUSE ce va contine:• ./doc – documentatia FUSE(install, faq etc)• ./kernel – codul sursa al modului nucleu• ./include – headerele necesare(fuse.h)• ./lib – codul sursa pentru crearea librariei FUSE• ./util – codul sursa pentru utilitatile librariei• ./example – exemple de utilizare./configure;make;make install;
Crearea primului sistem de fisiereEtape:1.Editati exemplul fusexmp.c conform configurarilor dorite2.Compilati fusexmp.c
3.Executati example/fusexmp /mnt/fuse –d4.Ls –al /mnt/fuse5.(Enjoy :d)
Intrebari?
Detalii implementare includem headerele necesare#include <fuse.h> // si cele obisnuite
#include<fuse_lowlevel.h>//pentru a folosi functii low level
definim functiile cu care va opera sistemul nostru de fisiere
completam structura de tip fuse_operations cu asocierile corespunzatoare functiilor definite anterior
in functia main apelam fuse_main(vezi functionarea librariei fuse)
Structura fuse_operations• struct fuse_operations {
int (*getattr) (const char *, struct stat *); //similar comenzii stat
int (*readlink) (const char *, char *, size_t); //citeste linkurile simbolice
int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t); //citeste continutul unui director
int (*mknod) (const char *, mode_t, dev_t); //creaza un nou nod in ierarhia de fisiere
int (*mkdir) (const char *, mode_t); //creaza director
int (*rmdir) (const char *); //sterge director
int (*link) (const char *, const char *); //creaza hard link
int (*unlink) (const char *); //sterge un fisier
int (*symlink) (const char *, const char *); //creaza link simbolic
int (*rename) (const char *, const char *); //redenumeste un fisier
int (*chmod) (const char *, mode_t); //schimba bitii pentru permisiuni
int (*chown) (const char *, uid_t, gid_t); //schimba proprietarul si grupul fisierului
int (*truncate) (const char *, off_t); //modifica marimea fisierului
int (*utime) (const char *, struct utimbuf *); //modifica numarul de accesari/modificari ale fisierului
int (*open) (const char *, struct fuse_file_info *); //deschide un fisier
int (*read) (const char *, char *, size_t, off_t, struct fuse_file_info *); //citeste date dintr-un fisier deschis
int (*write) (const char *, const char *, size_t, off_t,struct fuse_file_info *); //scrie date intr-un fisier deschis
int (*statfs) (const char *, struct statfs *); //returneaza statistici ale sistemului de fisiere
int (*flush) (const char *, struct fuse_file_info *);
int (*release) (const char *, struct fuse_file_info *); //apelata cand nu mai exista referinte la un fisier deschis
int (*fsync) (const char *, int, struct fuse_file_info *); //sincronizeaza/actualizeaza continuturile unui fisier
int (*setxattr) (const char *, const char *, const char *, size_t, int); //seteaza atribute speciale
int (*getxattr) (const char *, const char *, char *, size_t); //returneaza atribute speciale
int (*listxattr) (const char *, char *, size_t); //listeaza atribute speciale
int (*removexattr) (const char *, const char *); //sterge atribute speciale
};
Structura fuse_operations• Functiile enumerate nu sunt obligatorii dar multe din ele
sunt necesare pentru functionarea corecta a sistemului de fisiere
• Din motive tehnice urmatoarele explicatii vor fi facute pe baza exemplelor din documentatia librariei
Aplicatii• ExpanDrive: sistem de fisiere comercial ce implementeaza
SFTP/FTP/FTPS folosind FUSE• sistemul de fisiere Lustre cluster al Sun Mycrosystem va folosi
FUSE pentru a-I permite sa ruleze in spatiul utilizatorului, pentru a putea folosi FreeBSD
• Sector File System(sistem distribuit de fisiere dezvoltat pentru un numar mare de commodity computers): utilizeaza FUSE pentru a oferi o interfata montabila a unui sistem de fisiere locale
Stiati ca…• La momentul denumirii librariei exista un emulator
Speccy(8-bit personal home computer) cu acelasi nume - Fuse (the Free Unix Spectrum Emulator)
• Autorul librariei il cunostea pe autorul emulatorului si chiar crease si el un emulator asemanator
• Numele se voia a fi un acronim ingenios pentru “Filesystem in USErspace” dar s-a dovedit a fi o alegere nefericita
• De atunci autorul si-a promis sa nu mai denumeasca niciun proiect dupa un termen comun
Bibliografie• http://ebooks.unibuc.ro/informatica/Seiso/4.1_files/text.htm• http://www.ibm.com/developerworks/linux/library/l-fuse/• http://en.wikipedia.org/wiki/Filesystem_in_Userspace• Documentatia oficiala FUSE