Gli attuali sistemi operativi permettono di intercettare le chiamate di sistema a livello utente: un processo può essere informato quando un altro processo entra o esce da specifiche chiamate di sistema. Sebbene inizialmente questa funzionalità sia stata introdotta per esaminare e controllare l'esecuzione di tali chiamate, essa può essere utilizzata per modificarne il comportamento. Questa è l'idea alla base delle implementazioni Ufo[ADAS97] e AVFS [Eat01][Sze].
Ufo (User-level File Organizer), è un interessante tentativo
di gestire i file system remoti che risale all'anno 1997. È costituito
da un processo a livello utente che provvede a fornire servizi agli
altri processi intercettando le chiamate di sistema e dirottandole
ad un opportuno gestore. Le applicazioni non si accorgono della presenza
di Ufo, ma grazie ad esso possono operare su file remoti come se fossero
locali. I due moduli che compongono l'implementazione sono il Catcher
ed il modulo Ufo. Il Catcher si occupa di intercettare le chiamate
di sistema e di inoltrarle al modulo Ufo.
Quest'ultimo realizza l'astrazione
del file system remoto: identifica i file e li trasferisce utilizzando
vari plug-in che implementano i protocolli di trasferimento (NFS,
HTTP, FTP,...). Al suo interno è presente anche un meccanismo di caching
per velocizzare i successivi accessi agli stessi file.
Il Catcher deve esplicitamente agganciarsi al processo che intende
usufruire delle sue potenzialità. Sfruttando il file system procfs
(vedi sezione 3.1) può comandare al sistema
operativo di bloccare il processo in esecuzione non appena si verificano
determinati eventi. Una volta che il processo si è fermato, il Catcher
può leggere e modificare i parametri delle chiamate di sistema, inoltrare
la richiesta al modulo Ufo, inoltrare la chiamata di sistema modificata
al kernel, cambiare il risultato ottenuto dal kernel ed infine riattivare
il processo bloccato.
AVFS (A Virtual File System) è stato originalmente scritto
per i sistemi Solaris e Linux, con lo scopo di esportare moduli di
file system virtuali attraverso un'interfaccia implementata da una
libreria condivisa. Per utilizzarlo è necessario impostare la variabile
d'ambiente
che permette di intercettare le
chiamate di sistema prima che esse siano gestite dalla libreria C
e dal kernel. La libreria identificata da
invia i comandi ad un processo server tramite socket.
Il suo funzionamento era semplice ed efficace su entrambi i sistemi. Tuttavia, con il rilascio della versione 2.1 dei glibc, alcune funzioni vennero collegate staticamente ad altre routine per velocizzarne l'accesso, e così la libreria di precaricamento di AVFS non era più in grado di intercettarle. Inizialmente, l'ideatore di AVFS Miklos Szeredi decise di scrivere un programma per interfacciare la sua libreria al file system CODA chiamando il nuovo programma avfscoda. In questa fase l'implementazione comprendeva parti in spazio utente ed in spazio kernel (che coinvolgevano in particolare il modulo relativo a CODAFS), con i conseguenti svantaggi esaminati.
In seguito Frederik Eaton decise di riportare lo sviluppo di AVFS sulla via originalmente intrapresa dall'autore e pertanto implementò separatamente (anche con l'ausiliio di strumenti automatici) le funzioni che non potevano più essere intercettate. Attualmente AVFS gestisce ben 113 chiamate alla libreria glibc.
I tempi di esecuzione riportati nei test di Ufo [ADAS97] e di AVFS [Eat01] sono accettabili, e pertanto questa tecnica risulta essere molto promettente. Tuttavia come si è visto, le operazioni sul file system non si prestano ad un'interazione pulita con la libreria glibc. Inoltre queste implementazioni rappresentano un distaccamento dalla visione classica di file system: non esistono ad esempio operazioni di mount o unmount e soprattutto, le modifiche di comportamento sono limitate alle applicazioni esplicitamente collegate alle librerie modificate. english