How does it work? ( Currently this document is only in italian )
In questo documento tratteremo il funzionamento complessivo di CerbeRun e dei file .run.
Il punto principale e' sicuramente il formato .run, poichè CerbeRun non è altro che un interpete di questo formato.
Il formato .run, e' prima di tutto un file .tar, il quale svolge il compito di contenitore di tutto il necessario che serve all'esecutore
(CerbeRun) per eseguirne il contenuto.
Al suo interno, nella radice principale del file .run, c'è un file xml chiamato 'index.xml', in questo
file ci sono tutte le informazioni necessarie per far si che il tutto venga eseguito, oltre che varie meta-Informazioni
Poiche' il panorama attuale delle applicazioni esistenti, non puo' evidentemente e giustamente essere riscritto,
si e' sfruttata una caratteristica intrinseca degli Autotools, il parametro --prefix dello script 'configure', il quale permette di compilare
il codice sorgente in maniera tale da renderlo in grado di recuperare tutti i file ad esso necessari (tipo le icone del
programma) da una posizione del disco ben precisa e con path assoulta. Esempio: ./configure --prefix=/usr/local/programma , andrà
a configurare ed installare i sorgenti nella posizione '/usr/local/programma', e nessun altro file sara' quindi sparso per il disco.
Quindi, all'interno del file xml dentro al file .run, vi sarà un attributo che indicherà all'esecutore cosa e' stato passato
come opzione --prefix, in maniera ovvia questo parametro all'interno del file XML si chiama "prefix".
Ora, una volta compilato con tale opzione, basterà oltre che a dare le giuste informazioni nell'index.xml, copiare la directory ove
l'applicativo si e' andato ad installare all'interno di una gerarchia di directory, atta a rappresentare l'albero gerarchico delle architetture (non è obbligatorio farlo gerarchico, ma per chiarezza ed eleganza è meglio usare questo metodo).
Non e' sempre necessario compilare i programmi con l'opzione --prefix, poiche' se si progetta il codice del programma a fare uso
di path relativi anzichè path assoluti, allora non vi sarà necessità di indicare il valore del prefix. In questo caso
l'esecutore eseguirà in maniera diretta il binarui, senza dovr tradurre tutte le occorrenze di prefix.
In caso sia impostata l'opzione prefix nel file XML, l'esecutore, tradurrà questa stringa con la posizione di mounting del file .run
(esempio: prefix="/usr/local/programma" mountingPath="/tmp/cicciopasticcio", tutte le occorrenze di prefix, verranno sostituite con mountingPath,
cosiì che: "/usr/local/programma/share/pixmap/logo.png" --divverà--> "/tmp/cicciopasticcio/programma/share/pixmap/logo.png".
Il file index.xml e' formato da verie sezioni, le quali sono suddivise in maniera tale da offrire meta-informazioni generali, le icone associate,
e la possibilità di effettuare lo switch tra le architetture,
così da permettere ad un unico file .run di essere compatibile con più piattaforme e/o distribuzioni.
Ogni sezione dedicata ad un'architettura, contiene quale file eseguire, come impostare le variabili d'ambiente adeguate, qual'e' l'occorenza
da sotituire per prefix (nel caso vi sia un prefix impostato) ed un parametro che indica quali opzioni passare al programma.
Di seguito riportiamo un esempio di un index.xml:
<run version="0.1" date="040406"> <icons> <xsmall path="/./resources/icons/inks0.png> <small path="/./resources/icons/inks1.png> <normal path="/./resources/icons/inks2.png> <large path="/./resources/icons/inks3.png> <xlarge path="/./resources/icons/inks4.png> </icons> <info progname="inkscape" prefix="/tmp/cerberun/inkscape"> <description> A SVG graphic program </description> <authors> <auth name="ciccio pasticcio" mail="pippo@ciccio.it" nationality="Italy" telephone="+39061123456789" address="via piconcopallo 3, Italy"/> </authors> </info> <platform> <arch name="i386"> <sys> <dist name="ubuntu" versionFrom="5.10"/> <exec base="/./resources/i386/ubuntu/5.10/" path="/./resources/i386/ubuntu/5.10/bin/inkscape" exec_name="inkscape"/> <env name="LD_LIBRARY_PATH" value="/./resource/i386/ubuntu/5.10/lib:/./resource/i386/ubuntu/5.10/usr/lib:." /> </sys> <sys> <dist name="fedora" versionFrom="3"/> <exec base="/./resources/i386/fedora/3/" path="/./resources/i386/fedora/3/bin/inkscape" exec_name="inkscape"/> <env name="LD_LIBRARY_PATH" value="/./resource/i386/fedora/3/lib:/./resource/i386/fedora/3/usr/lib:." /> </sys> </arch> </platform> </run>
La sezione "info", e' dedicata alle meta informazioni e contiene l'indicazione di 'prefix' (uguale per tutte le sottosezioni),
"platform" è invece la sezione dedita all'architecture-switching e che riporta le informazioni necessarie per l'esecuzione dell'applicativo
e le info necessarie per l'impostazione delle variabili d'ambiente (il tag env).
Si noti "/./", che sta ad indicare il mount-point del file .run, che quando il file .xml verrà letto ed interpretato, tale
sottostringa verrà rimpiazzata con la path adeguata.
Parliamo un po' di più CerbeRun :
Il formato .run, quindi, viene interpretato da CerbeRun (ma nulla vieta altri sviluppi di altri runner); ora spiegheremo come CerbeRun lavora per arrivare all'esecuzione.
- Viene passato a CerbeRun il file: $ crun application.run (il comando prende il nome di crun)
- CerbeRun, monta tramite FUSE, il file .run in /tmp/ID_application.run e ne legge ed interpeta da subito l'index.xml (dove ID è un codice univoco generato a tempo di esecuzione)
- CerbeRun interpeta la sezione relativa all'architettura sulla quale viene eseguito e ne ricava le impostazioni
- A questo punto determina cosa avviare e cosa impostare (tipo le variabili d'ambiente, il prefix da "tradurre" con la string presente nell'opzione "base"
- Esegue ciò che deve eseguire, e nel caso debba tradurre, fa uso di ptrace per intercettare le systemCall a cui applicare la "traduzione" delle path
- A fine esecuzione, effettua l'unmounting di quanto montato precedentemente
Poichè CerbeRun fa uso di FUSE, per funzionare avrà necessità che l'utente sia abilitato a fare uso di fusermount, come indicato nella pagina delle FAQ di FUSE ( FUSE FAQ ); Seppure il comando fusermount abbia il suid impostato (necessità intrinseca per fare uso di FUSE), il comando crun da canto suo, rimane in esecuzioni con le credenziali dell'utente, senza avere la necessitè di effettuare una escalation di privilegi, il tutto per garantire maggior sicurezza per il sistema.