Il sistema X Window Introduzione a XFree86 4.x Configurazione di XFree86 Il server Xfree86 I client X Accesso remoto e autenticazione Introduzione al sistema operativo Linux Il sistema grafico X -- Ringraziamenti -- Il materiale che segue è ripreso in larga parte e tradotto dal tutorial Introduction to XFree86 4.x di Chris Houser L’originale è consultabile gratuitamente grazie all’autore e ad IBM sul sito http://www-106.ibm.com/developerworks/linux/ seguendo i link Education -> Tutorials Introduzione al sistema operativo Linux Il sistema grafico X X Window System The X Window System (X) è un sistema client/server. I client sono applicazioni che, usando risorse di alto livello (bottoni, scrollbar, aree di testo, bitmaps, menu, …), vogliono ottenere un certo “aspetto grafico”. Il server è il device driver che gestisce l’hardware grafico e si occupa quindi di trasformare le richieste del client in immagini vere e proprie. X è uno standard multipiattaforma (POSIX) Æ esistono server per tutti le varianti di Unix, per Windows, per OS/2 e per Macintosh. Il server gratuito per Linux è chiamato Xfree86. Tutte le informazioni relative a X si possono trovare sui siti: http://www.xfree86.org, http://www.x.org/, http://www.x11.org/ Introduzione al sistema operativo Linux Il sistema grafico X Configurazione rapida di X La configurazione di X viene eseguita attraverso il programma xf86cfg. Verranno chieste informazioni su: ♦ marca e modello della scheda video (in alternativa: il chipset) ♦ marca e modello del monitor (in alternativa: le frequenze di refresh) ♦ Modi grafici desiderati Il risultato è la generazione del file /etc/X11/XF86config Il file di configurazione può trovarsi comunemente anche in directory come /etc/, /usr/X11R6/etc/X11/, /usr/X11R6/lib/X11/, o altre sotto /usr/lib/X11/ Per far partire manualmente X si usa il comando startx startx X server window manager X clients È possibile sostituire interamente l’interfaccia testo con xdm, che si occupa anche del login. Introduzione al sistema operativo Linux Il sistema grafico X Generare il file XF86Config Lanciando XFree86 -configure l’hardware viene automaticamente rilevato. Lo schermo si oscura e lampeggia, questo è normale e può durare alcuni secondi. Se al contrario appare imediatamente una linea d’errore come: XFree86: command not found, probabilmente il problema è che la directory contenente il comando Xfree86 (solitamente /usr/X11R6/bin) non è nel PATH soluzione: PATH="/usr/X11R6/bin:$PATH" Nota: ricordare di sistemare il PATH anche nei file di configurazione della shell, in modo che non sia necessario rifarlo manualmente ad ogni login. Il risultato dovrebbe essere un nuovo file di nome XF86Config.new nella home directory Per installarlo: cd /etc/X11 mv XF86Config XF86Config.orig cp ~/XF86Config.new XF86Config Introduzione al sistema operativo Linux Il sistema grafico X Testare XFree86 Il file generato contiene quanto di meglio XFree86 sia riuscito a ipotizzare sull’hardware. Per testare che le scelte fatte siano funzionanti basta lanciarlo senza altri parametri: XFree86 Lo schermo si oscurerà di nuovo, e dopo pochi istanti dovrebbe riempirsi di una puntinatura regolare bianca e nera (lo sfondo di default), con una X nel centro (il puntatore di default, che dovrebbe muoversi seguendo il mouse). Da ricordare: Per terminare XFree86 si può usare la combinazione di tasti Ctrl+Alt+Backspace Se non accade quanto atteso, probabilmente la causa è una situazione hardware o di sistema troppo specifica per poterla trattare in questa sede. Un buon punto di partenza è certamente verificare se la propria scheda grafica è supportata dalla versione installata del software, sul sito http://www.xfree86.org, e in tal caso se ci sono passi particolari per attivarla. Se tutto funzionasi può procedere ad analizzare nel dettaglio il contenuto del file di configurazione per conprendere le possibilità di regolazione più sofisticate. Introduzione al sistema operativo Linux Il sistema grafico X Il formato di XF86Config Si carichi il file in un editor di testo. Si nota immediatamente che il file è composto di varie sezioni, marcate dai delimitatori Section e EndSection. Ogni sezione raggruppa direttive di configurazione per un diverso componente hw o sw, il cui nome appare accanto a Section (ad esempio "ServerLayout", "InputDevice", "Monitor", ecc.) In generale, la maggior parte di queste sezioni può non essere modificata rispetto a come l’ha compilata il procedimento di autorilevazione descritto in precedenza. Introduzione al sistema operativo Linux Il sistema grafico X XF86Config: Mouse Section "InputDevice" Identifier "Mouse0" Driver "mouse" Option "Protocol" "PS/2" Option EndSection "Device" "/dev/psaux" Å nome simbolico libero Å fisso Å es. Auto, Microsoft, Logitech, MouseMan, PS/2, USB, Xqueue Å attenzione ai link Documentazione: man XF86Config man 4 mouse (attenzione, spesso ce ne sono altre con lo stesso nome, usare man –a e trovare quella che riporta Mouse input driver nel titolo) Introduzione al sistema operativo Linux Il sistema grafico X XF86Config: depth Esaminiamo la parte di configurazione riguardante le combinazioni ammesse di risoluzione e profondità di colore.Le informazioni si trovano nella Section “Screen”, solitamente alla fine del file. Deve esserci almeno una (ma probabilmente ce ne saranno molte) SubSection "Display" all’interno della sezione, ognuna riguardante una diversa profondità di colore (Depth), espressa come numero di bit per memorizzare il colore di ciascun pixel. Depth 1 4 8 15 16 24 Numero di colori 2 16 256 32,768 65,536 16,777,216 Modalità di scelta (bianco e nero) (su tavolozza) (su tavolozza) (approssimati) (approssimati) (True color) All’inizio dells sezione normalmente si dichiara quale depth usare di default, in questo modo: Section "Screen" DefaultDepth 24 […] EndSection Introduzione al sistema operativo Linux Il sistema grafico X XF86Config: modes Per ogni SubSection "Display" riguardante una certa depth, saranno definiti i modi di default, cioè le risoluzioni da utilizzare con questa depth. Per evitare confusione sarebbe bene usare la stessa specifica per tutte le SubSection, ma non è obbligatorio. Modes "1280x1024" "1024x768" "800x600" "640x480" Nota: benchè abbiano un significato evidente, i nomi usati non sono scelti a caso ma sono etichette di modi predefiniti in X. In altre parole, non si può usare una stringa del tipo “LARGHEZZAxALTEZZA” qualsiasi, ma bisogna averla definita “insegnando” a X come pilotare i sincronismi della scheda video per ottenere tale risoluzione. Come si vede si possono indicare diverse risoluzioni. X all’avvio elimina quelle incompatibili con scheda, monitor e depth, ed usa la prima che rimane Sarà poi possibile passare alle altre risoluzioni valide “al volo” con i tasti Ctrl+Alt++/-. Introduzione al sistema operativo Linux Il sistema grafico X XF86Config: la Section "Screen" completa A questo punto, la sezione dovrebbe assomigliare a questa: Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Depth 8 Modes "1280x1024" "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 16 Modes "1280x1024" "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 24 Modes "1280x1024" "1024x768" "800x600" "640x480" EndSubSection EndSection Introduzione al sistema operativo Linux Il sistema grafico X XF86Config: specifiche del monitor La scelta, accennata prima, che X compie sulle risoluzioni, dipende dalle caratteristiche della scheda video e del monitor (in particolare le frequenze massime). Se il monitor non viene riconosciuto correttamente, e si conoscono questi dati, si possono impostare a mano. Section "Monitor" Identifier VendorName ModelName HorizSync VertRefresh EndSection "Monitor0" "Monitor Vendor" "Monitor Model" 31.5 - 64.3 50 – 100 Åidentificatore libero Åidentificatore libero Åidentificatore libero ÅKHz ÅHz Nota: on-line e nei programmi di configurazione di X esistono dei monitor database che permettono di ricavare le frequenze sapendo marca e modello esatti. Introduzione al sistema operativo Linux Il sistema grafico X Disabilitare l’accesso remoto a X Il file di avvio del server X, che verrà discusso nel seguito, è /usr/X11R6/bin/startx La prima modifica che si dovrebbe fare se si intende usare la grafica solo in locale, per non permettere ad altri sistemi in rete di accedere al proprio display, è questa: cambiare la riga: serverargs="" in: serverargs="-nolisten tcp" Questo istruisce il server a non aprire la porta di rete su cui normalmente riceve richieste. Introduzione al sistema operativo Linux Il sistema grafico X Il server XFree86, come detto, oltre ad essere il device driver per l’hardware video/mouse/tastiera, è un server che consente l’accesso a tali risorse ai client che ne facciano richiesta. Poiché senza client il server sarebbe inutile, il comando startx si occupa di avviare il server e di leggere dal file .xinitrc nella home dell’utente quali client avviare automaticamente (terminal emulators, orologi, window managers o desktop environments. .xinitrc è uno shell script, quindi può essere creato con un editor di testo e reso eseguibile con gli strumenti standard. Nota: mentre l’installazione del server deve essere fatta da root, generalmente ogni utente può usarlo, e quindi può avere il proprio .xinitrc cd vi .xinitrc chmod +x .xinitrc Per iniziare si può mettere un unico comando nel file: exec xterm Nota: exec fa si che il comando seguente (xterm) rimpiazzi il processo shell, risparmiando risorse Introduzione al sistema operativo Linux Il sistema grafico X Startx Lanciando ora startx, apparirà un terminale sullo sfondi di default. Come si potrà notare, è privo di bordi con cui ridimensionarlo e spostarlo. XFree86 continua a funzionare finchè non è terminata l’esecuzione di .xinitrc. Uscendo dal terminale con exit o ctrl-d si termina il processo in cui la shell di .xinitrc si era trasformata, e quindi anche il server grafico. Se si desidera comporre manualmente un file .xinitrc bisogna essenzialmente scegliere un window manager, e tener conto del fatto che se il file .xinitrc giunge al termine l’intero sistema grafico si disattiva. Allora un file tipico avrà una struttura del tipo: xterm -geometry +1+1 & xterm -geometry +100+100 & exec twm Alternativamente, si può eseguire un desktop enviroment, cioè un ambiente completo che si faccia carico della configurazione dell’area di lavoro. Per passare il controllo al desktop environment basta mettere in .xinitrc l’unica riga exec gnome-session per Gnome, oppure exec startkde per KDE Introduzione al sistema operativo Linux Il sistema grafico X Utilizzo dell’interfaccia grafica L’interfaccia grafica fornita con Linux non si limita a X, ma comprende due sofisticati ambienti di gestione del desktop, KDE e Gnome. Questi ambienti mettono a disposizione strumenti grafici per la gestione dell’intero sistema, e ovviamente permettono di visualizzare in finestre anche tanti classici terminali testo quanti se ne desiderano. Introduzione al sistema operativo Linux Il sistema grafico X Configurazione degli X client Le applicazioni X sono centinaia e dei tipi più diversi. Per questo la configurazione risulta complessa, in quanto manca un vero e proprio standard: alcune applicazioni si configurano con un proprio file in /etc, altre si affidano ai meccanismi del desktop environment per cui sono state sviluppate, ecc… Uno dei meccanismi tradizionali per conservare i settaggi delle applicazioni X prende il nome di X Resource DataBase (xrdb). Questo database viene mantenuto in memoria da XFree86. Ogni applicazione, all’avvio, lo consulta per vedere se ci sono record che la riguardano. Ogni record dell’xrdb è costituito da un ResourceName e un Value orrispondente. Poiché il db è unico per molteplici applicazioni, il ResourceName deve specificare il nome caratteristico del settaggio che memorizza, ed anche il nome dell’applicazione a cui si applica. Per organizzare i dati in modo chiaro, i ResourceName specificano una gerarchia che inizia con il nome dell’applicazione e divengono sempre più specifici, fino al nome del settaggio. Introduzione al sistema operativo Linux Il sistema grafico X Esempi d’uso di xrdb Impostare lo sfondo degli xterm al colore rosso: echo "xterm*background: red" | xrdb xterm Interrogare il db per elencarne il contenuto: xrdb -query Æxterm*background: red Normalmente, tutti i settaggi che si vogliono ricaricare ad ogni avvio di X vengono raccolti in un file chiamato .Xresources o a volte .Xdefaults, e come prima azione di .xinitrc si specifica xrdb $HOME/.Xresources Esempio di Xresources (le linee che iniziano con ! sono commenti) ! use a light yellow background for everything except xterms *background: lightyellow xterm*background: white ! slim the widget borders on wish (TCL/TK) apps down to one pixel wide wish*borderWidth: 1 ! set the font for xterms to something a bit larger xterm*font: -misc-fixed-*-*-*-*-20-*-*-*-*-*-*-* Introduzione al sistema operativo Linux Il sistema grafico X Nomi delle risorse Non ha senso cercare di elencarli, vanno cercati nelle man pages delle applicazioni. Alcuni casi pratici: - nomi dei colori: si possono usare nomi simbolici (elencati in /usr/X11R6/lib/X11/rgb.txt assieme ai valori delle componenti RGB che li definiscono) o direttamente il valore RGB espresso come 6 cifre esadecimali ! specify a pure blue xterm background (#rrggbb) xterm*background: #0000ff - nomi di font: sono nomi molto lunghi composti da molte caratteristiche del font, ma esistono utility come xfontsel che permettono di navigare graficamente tra i caratteri disponibili Note finali: in ogni momento si può testare il contenuto del file Xresources con xrdb $HOME/.Xresources ricordando che comunque non verranno applicati i nuovi settaggi alle applicazioni in funzione Introduzione al sistema operativo Linux Il sistema grafico X L’accesso remoto ad X – lato server L’intero sistema grafico X è stato progettato per essere utilizzato in rete. E’ semplicissimo lanciare un’applicazione su un sistema e dirigere il suo output ad un server X operante su di un sistema distinto. Notare che il sistema da cui si lancia il client non deve necessariamente avere un server X configurato, anche se deve aver installate le librerie dinamiche necessarie. Naturalmente X prevede un sistema di autenticazione e autorizzazione, per poter discriminare i client autorizzati ad avvalersi di un server da quelli non autorizzati. 1) Generare un file .Xauthority sul server $ xauth list xauth: creating new authority file /home/c/.Xauthority se il file esiste anziché il messaggio sopra verrà mostrato il contenuto, del tipo: servermachine/unix:0 MIT-MAGIC-COOKIE-1 39849ced20eb2b62df87c714a251b8fc 2) nel caso sia apparso il messaggio di file creato, si procede alla generazione di una chiave $ xauth generate . 3) se la home non è condivisa tra client e server, copiare le credenziali sul client: $ xauth nextract myauth.xa $DISPLAY $ scp myauth.xa clientmachine:myauth.xa $ rm myauth.xa Introduzione al sistema operativo Linux Il sistema grafico X L’accesso remoto ad X – lato client 4) installare le credenziali sul client client$ xauth nmerge myauth.xa client$ rm myauth.xa 5) Settare la variabile d’ambiente DISPLAY: la macchina client deve poter trovare il server client$ export DISPLAY=servermachine.foo.bar.net:0 6) lanciare un comando client$ xeyes Introduzione al sistema operativo Linux Il sistema grafico X Risorse * The XFree86 home page (http://www.xfree86.org/) software, note per l’installazione, liste di hw supportato… * The X Consortium (http://www.x.org/), il sito ufficiale di X, di interesse soprattutto per gli sviluppatori esperti (protocollo, server design, etc.), * The Direct Rendering Infrastructure (DRI) (http://dri.sf.net/) è una piattaforma per implementazioni sicure ed efficienti di OpenGL, per la grafica 3D ad alte prestazioni * nVidia non supporta DRI ma fornisce i proprio server accelerato http:://www.nvidia.com/view.asp?PAGE=linux * GNOME http://gnome.org/. * K Desktop Environment (KDE) (http://www.kde.org/)