***** I SEGRETI DI X

***** La configurazione dell'ambiente grafico di Linux alla portata di tutti

Ivan Fabris 

L'ambiente grafico di Linux è uno dei programmi che un utente casalingo usa di più. Lo dimostra il proliferare di "costruttori di finestre", tra cui spicca il K Desktop Environment ( KDE ), ed ultimamente il GNU Network Oriented Model Environment ( GNOME ), giunti alla ribalta in tempi relativamente recenti,.
X Windows System ( d'ora in poi X per brevità ) è un potente sistema grafico sviluppato al M.I.T. e diffuso, in varie versioni, su tutte le piattaforme Unix-like. Su Linux si usa Xfree86 ( http://www.xfree86.org ), una versione gratuita per processori Intel, la cui versione 4 è ormai in dirittura d'arrivo. Poiché tutto ciò che viene fatto sotto X può essere ugualmente fatto dalla linea di comando ( giochi a parte ) potrebbe venire la tentazione di assimilare il server X del Linux a ciò che è stato Windows 3.1 per MS-DOS, ossia una interfaccia grafica che facilita le operazioni di configurazione e gestione delle risorse, e permetteva di risparmiare la tastiera consumando invece il mouse. Tutto ciò è vero, ma la realtà è molto più complicata. X è composto da vari programmi che operano insieme e forniscono funzioni che in Windows 9x non esistono. Inoltre X è diviso in server e client , è così possibile sfruttare la potenza grafica di una workstation remota usando un miserrimo host, o anche più di uno contemporaneamente. Nel caso a noi più familiare sia il server che il client girano sullo stesso computer, ma nulla impedisce che il client possa funzionare su altre macchine anche di differente architettura. Il server si incarica di smistare i flussi di input provenienti da mouse, tastiera , tavolette grafiche o altri dispositivi, di indirizzare correttamente l'output, di gestire l'hardware grafico e non ultimo di pensare alla sicurezza delle connessioni. Il client invece , che può funzionare anche su un sistema privo di hardware grafico, sfrutterà le risorse della macchina server. Il concetto è identico per esempio a ftp, in cui un server remoto riconosce le richieste di un client , valuta le regole di sicurezza, e decide se soddisfarle o meno.
Il server X di per sé non è in grado di generare un desktop o delle finestre. Tutto ciò è affidato al WindowManager ( WM ), che colora e da forma a tutti gli oggetti sullo schermo. Questo discorso apparirà chiaro osservando le figure riportate su queste pagine: si va dal server X completamente nudo, che per in mancanza di specifiche lancia una finestra terminale sul solito motivo grafico grigio, ai desktop più diversi ed elaborati. Tuttavia, prima di poter lanciare un WM è necessario configurare a dovere il server X. Di seguito, per quel che riguarda il percorso ed i contenuti dei file, farò riferimento alla distribuzione Mandrake/Red Hat

**** Configurazione di base
Il file di configurazione che controlla le impostazioni principali di X è XF86Config, e viene generato del tool XF86Setup, che va lanciato dal superuser ( root ).
Si trova in genere in /etc/X11 ma può anche essere in 
   <Xrootdirectory>/lib/X11/XF86Config.hostname
   <Xrootdirectory>/lib/X11/XF86Config 
dove con Xrootdirectory si intende la directory in cui è installato X, di solito /usr/X11R6. Questo file contiene diverse sezioni, organizzate in questo modo:

Section "nomesezione"  
	opzioni
EndSection

dove nomesezione è una delle seguenti voci, delle quali analizzeremo in dettaglio le più utili. Per le altre rimando alla man page di XF86Config ( man XF86Config ).
   
Files (File pathnames) :  In questa sezione potremo settare rgbpath, fontpath, e modulepath. Questi sono i percorsi in cui X cerca il set di colori RGB, i propri font ed eventuali moduli da caricare.

 Section "Files"
   RgbPath    "/usr/X11R6/lib/X11/rgb"  
   FontPath   "unix/:-1"   
   FontPath   "/usr/X11R6/lib/X11/fonts/100dpi"
   FontPath   "/usr/X11R6/lib/X11/fonts/75dpi"
   FontPath   "/usr/X11R6/lib/X11/fonts/misc"
   FontPath   "/usr/X11R6/lib/X11/fonts/Type1"
   FontPath   "/usr/X11R6/lib/X11/fonts/Speedo"
   FontPath   "/usr/X11R6/lib/X11/fonts/TrueType"
   ModulePath	"/usr/X11R6/lib/modules"
EndSection

Forse non tutti voi avete la linea dei TrueType, ma vedremo più avanti come aggiungerla; il Modulepath indica al sistema alcuni moduli opzionali per applicazioni particolari

- Module (Dynamic module loading) : Se nella sezione Files compare la voce ModulePath, e abbiamo moduli esterni da caricare, qui possiamo indicarli. Le linee di seguito caricano il modulo per il joystick

 Section "Module"
 Load "xf86Jstk.so"
 EndSection

 - ServerFlags (Server flags) : Alcuni settaggi particolari di X, come l'intercettazione di segnali, il divieto di cambiare la risoluzione video, ed altro. I più interessanti sono DontZoom, che impedisce di variare la risoluzione grafica, scegliendo tra quelle disponibili, premendo i tasti CTRL + ALT + NUMERICPADPLUS o NUMERICPADMINUS, e DontZap, che impedisce di uscire da X premendo CTRL + ALT + BACKSPACE.
 - Keyboard (Keyboard configuration) : Controlla il tipo di tastiera, la mappatura dei tasti, i led, la velocità di ripetizione e molto altro ancora. Le opzioni sono troppe per essere trattate dettagliatamente, ma  XF86Setup accede a tutte le impostazioni
 - Pointer (Pointer configuration) : Stesso discorso, se avete dei mouse particolari leggetevi bene la man page.
 - Monitor (Monitor description) : Qui le cose sono un po' più serie, inserire dei parametri errati può veramente causare guai, specialmente ai monitor più vecchi che sono privi di protezioni. Configurate questa sezione usando XF86Setup e leggete bene il manuale del monitor per le frequenze di refresh 
 - Device (Graphics device description) : Anche questa è una zona un po' pericolosa, che può anche essere evitata perché X all'avvio esegue un test per determinare il tipo di scheda grafica ed i parametri di configurazione. Diventa necessaria una configurazione manuale per quelle schede che non sono supportate dal server. Possono essere presenti più di una sezione Device, ciascuna identificata da un diverso Identifier. Possiamo specificare comunque il tipo di scheda, il chipset, la quantità di ram, la frequenza di lavoro, e tutte le informazioni di cui disponiamo sulla scheda grafica.
 - Screen (Screen configuration) : Qui specifichiamo il monitor e la  scheda grafica che viene usata per ogni particolare tipo di server ( Accel, Mono, SVGA, VGA2, VGA16 ). Ogni server supporta un certo numero di schede grafiche, e di solito, tranne che per le ultimissime schede 2d/3d, ciò che viene rilevato di XF86Setup va bene. Comunque questa sezione controlla la risoluzione, la profondità di colore e la dimensione del desktop per il server X scelto, in questo caso il SuperVGA

Section "Screen"
   Driver          "SVGA" 	( * )
   Device          "My Video Card"
   Monitor         "My Monitor"
   DefaultColorDepth 16     ( * )
   BlankTime       0
   StandbyTime    0
   SuspendTime     0
   OffTime         0
   SubSection "Display"
      Depth        8
      Modes        "1024x768" "800x600"
   EndSubSection
   SubSection "Display"  
      Depth        16
      Modes        "1024x768" "800x600"    ( ** )
      Virtual       1024x768    ( *** )
      ViewPort     0 0
   EndSubSection
   SubSection "Display"
      Depth        24
      Modes        "1024x768" "800x600"
   EndSubSection
   SubSection "Display"
      Depth        32
      Modes        "1024x768" "800x600"
   EndSubSection
EndSection

Questa sezione Screen riguarda il server  XF86_SVGA , e gli comunica che :
1) intendiamo usare una profondità di colore di 16 bit ( * )
2) vogliamo avere  due risoluzioni, 1024x768 e 800x600, e di voler partire con la prima di esse, ( ** )
3) vogliamo un desktop da 1024x768 a 16 bit per pixel anche a risoluzione 800x600 ( *** )
Le altre sottosezioni vengono ignorate, mentre i parametri di BlankTime, StandbyTime, SuspendTime e OffTime specificano dopo quanti minuti si attiveranno i processi DPMS di risparmio dell'energia
Possono esserci altre sezioni Screen, ogni X server leggerà quella che lo riguarda. Gli X server attualmente disponibili sono XF86_SVGA, XF86_VGA16, XF86_Mono,  XF86_S3, XF86_8514,  XF86_Mach8, XF86_Mach32, XF86_P9000, XF86_AGX, XF86_W32 e ogni utente lancia quello adatto al suo sistema: più avanti vedremo come.
 - XInput (Extended Input devices configuration) :  Questa sezione è opzionale, serve a specificare dispositivi di input particolari, come il joystick, e le tavolette grafiche. Ogni dispositivo ha la sua sottosezione di configurazione. Nel caso del joystick, possiamo specificare il path al file di dispositivo cui e' collegato, il nome che lo identifica in ambiente X, ed i parametri che lo caratterizzano, come i tempi di risposta, la posizione centrale e gli estremi del movimento: le seguenti linee caricano e configurano il joystick:
                                    
 Section "Xinput"
    SubSection "Joystick"
        Port "/dev/joy0"
        DeviceName "Joystick"
        TimeOut 10
        MinimumXPosition 100
        MaximumXPosition 1300
        MinimumYPosition 100
        MaximumYPosition 1100
        CenterX 700
        CenterY 600
        Delta 20
    EndSubSection
 EndSection

**** Attivare!
Ora che abbiamo posto le basi, possiamo avviare il server ed il WM che lo sfrutterà.
X può essere lanciato in molti modi. Dalla versione 6 di Mandrake si può anche scegliere di partire direttamente in ambiente grafico già in fase di installazione. Manualmente dovremo invece editare il file /etc/inittab, sostituendo il runlevel di partenza, solitamente il 3, col 5, nella linea

id:3:initdefault 

La linea di inittab x:5:respawn:/etc/X11/prefdm -nodaemon significa che in caso di runlevel 5 verrà eseguito il file /etc/X11/prefdm, che è un link a /usr/bin/gdm o a /usr/bin/xdm, entrambi gestori di login grafiche; simili nell'aspetto e nel funzionamento, ricevono userid e password ed avviano X ed il WM preferito dall'utente. Se questa linea non c'è, e volete il login grafico, aggiungetela ( man inittab )
Se invece si e' scelto di partire con la shell e si desidera entrare in ambiente grafico, si possono sfruttare gli script di configurazione predefiniti oppure modificarli secondo le proprie esigenze. 
 - startx : Normalmente il comando che lancia il server X è "startx": questo è uno script di shell che fa da front-end a xinit, e provvede ad inizializzare alcune variabili di sistema e variabili personali dell'utilizzatore per poter avviare il server ed il WM  che avete scelto tra i tanti disponibili ( KDE, GNOME, AfterStep, il nuovissimo XFCE e tantissimi altri ).
Come prima cosa, startx cerca un file di configurazione personale dell'utilizzatore, il file .xinitrc, posto nella directory home dell'utilizzatore stesso. Se questo esiste, viene letto ed eseguito, altrimenti viene cercato il file xinitrc ( n.b. non c'è il punto davanti, questa volta ) nella directory delle librerie di X, di solito /usr/X11R6/lib/X11/xinit. Se nemmeno questa volta  avrà successo, vi troverete di fronte al WM più rapido e stabile possibile, anche se un po' spartano: il server X al servizio solo di una finestra terminale, impostato secondo quando stabilito da XF86Config. Da qui potrete comunque lanciare manualmente tutti i programmi che vorrete. 
startx cercherà poi altri file di configurazione sia locali  ( posti nella directory HOME di ciascun utente, e caratterizzati dal punto davanti al proprio nome ) sia di sistema, posti nella directory summenzionata. Si tratta nell'ordine di 

$HOME/.xinitrc , $HOME/.xserverrc	( cercati di default da xinit )
/etc/X11/xinit/xinitrc , /etc/X11/xinit/xserverrc 
$HOME/.Xclients , /etc/X11/xinit/Xclients  

Se i file di configurazione personali mancano, quelli di sistema garantiscono comunque l'integrità al server, provvedendo ad identificare correttamente il display, a garantire la sicurezza ( riquadro "X in rete"  ), ed infine a lanciare il WM predefinito. Se vi piace cambiare WM tutti i giorni potete prepararvi uno script di shell che modifichi il file .Xclients a seconda di quale volete avviare: non e' certo la soluzione più elegante, ma è una delle più semplici. Inclusi nella distribuzione ci sono anche  alcuni script prefabbricati, come RunWM, in grado di configurare alcuni WM  tra i più comuni.
 
-xinit :  è il programma che avvia il server X. Se nell'invocazione non viene specificato nessun parametro, come per esempio può accadere se lo lanciate direttamente, cercherà  $HOME/.xinitrc : in mancanza di quello, apparirà il già citato WM superveloce. Inoltre, se xinit non trova il file di configurazione del server .xserverrc, lancerà di default il comando predefinito "X", il quale è un link a al server X adeguato

- X : Il link al server X adeguato al vostro sistema, di solito risiede il /usr/X11R6/bin oppure in /etc/X11. Potrebbe anche essere un link a /usr/X11r6/bin/Xwrapper, un programma che si incarica di lanciare il server X in assenza di ogni altro inizializzatore, in quanto il server può essere lanciato solo da root  
      
Tutta questa catena potete visualizzarla semplicemente avviando il server e listando tutti i processi attivi con 'ps -U nomeutente' in una finestra terminale: il PID ( Process Identifier ) più basso lo avrà startx, seguito da xinit e da X.
L'ultimo problema sarà quello configurare l'aspetto del proprio WM: ognuno ha i suoi programmi appositi, i suoi file di configurazione e anche i suoi temi desktop già pronti; la descrizione di come configurare una decina e più di WM esula comunque dagli scopi di questo articolo. 

**** titoletto: I font
Una volta configurato per bene il server grafico, possiamo arricchirlo installando nuovi font e nuovi tipi di font. Ritorniamo al file di configurazione XF86Config , nella sezione "Files" : e vediamo quali font offre.
I font a 100dpi e 75dpi ( estensione .pcf, Portable Compiled Font ).Sono font in formato binario per font di tipo bitmap, facili da gestire, in quanto supportati nativamente, ma piuttosto poveri nell'aspetto; possono essere portati su più piattaforme.
I Type1 ( estensione .pfa e .pfb ).Sono i font PostScript, ideati da Adobe circa nel 1985 per le  applicazioni di publishing di alto livello: il linguaggio PostScript si impose come standard per la descrizione del formato delle pagine e per le periferiche di elevata qualità come stampanti e monitor. I font Type 1 sono di tipo Multipiattaforma, ossia sono indipendenti dal sistema operativo, ed Outline, che significa che ogni carattere è definito da un contorno, il glyph, consistente in una serie di linee e di curve. Questa caratteristica permette di variare la dimensione del carattere stesso senza che subisca degradazioni o deformazioni. Inoltre questo tipo di font supporta l'hinting, che è la possibilità di codificare all'interno del font stesso alcune informazioni aggiuntive per gestire la rappresentazione dei caratteri in condizioni estreme di risoluzioni o di dimensioni. Era quindi sempre garantita una elevata qualità nella rasterizzazione del font, ossia la sua conversione in una serie di punti sullo schermo o sulla  carta.
Tuttavia una eccessiva segretezza della Adobe nelle specifiche dei font Type 1 ne ha portato al quasi totale abbandono, in favore di un nuovo standard sviluppato pochi anni dopo da una collaborazione tra Apple e Microsoft, il TrueType.
I True Type condividono le stesse proprietà dei Type1, ma la loro tecnologia "open source" ne ha favorito la diffusione fino a conquistare la la quasi totalità  dei PC MacOS e Windows, ed ultimamente sono arrivati anche su Linux. Infatti dalla versione 4 di X il TT sarà supportato nativamente. 
Vediamo ora quali strumenti abbiamo a disposizione per gestire i font

****titoletto: Le utility per i font
 - chkfontpath : Serve a fornire al server dei font xfs tutte le informazioni che gli servono per effettuare il rendering dei font: questo programma  controlla la directory del font contenuta nel path di xfs per verificare la presenza del file fonts.dir, dopodiché aggiorna il file di configurazione /etc/X11/fs/config aggiungendo la nuova directory in cui xfs cercherà i font.
 - mkfontdir : Crea una descrizione dei font contenuti in una directory data, contenuta nel file fonts.dir ( o fonts.scale per i font scalabili, comunque il loro formato è uguale ) Il font server usa questo file di configurazione per trovare i font. Una volta che questo file è stato creato o aggiornato, è possibile aggiungere la directory od il singolo font a quelli usati da X. Per esempio, per aggiungere un font 100dpi lo si metterà nella directory apposita ( /usr/X11R6/lib/X11/fonts/100dpi ), dopodiché si rigenererà il file fonts.dir. Poiché i font 100dpi sono già inseriti nel path di xfs, non sarà necessario lanciare anche chkfontpath. Questo programma  gestisce font di tipo pcf ( già descritti  ), snf ( Server Normal Font ,vecchi font bitmap non portabili ), bdf ( Bitmap Dstribution Font ,font bitmap di proprietà di Adobe ) e dalla versione X11R6 anche i Type 1 di Adobe. Per i True Type  serve qualcos'altro.
 - ttmkfdir : Utility esplicitamente progettata per far riconoscere a X i font True Type. Dalla release 4 di XFree verranno riconosciuti nativamente, ma per ora dovremo usare questo programma. L'unica cosa che dobbiamo fare è lanciarlo nella directory contenente i font TT, in modo che venga creato o aggiornato il file fonts.dir, dopodiché se la directory è nuova dovremmo lanciare anche   chkfontdir con l'opzione --add nomedirectory e infine far ripartire xfs.
 - xset : Setta varie proprietà di X, come il tipo di display, il tipo di suono emesso dall'altoparlante, il click della tastiera, il path per i fonts ( utile soprattutto il comando `xset fp rehash` che forza la rilettura delle directory dei font, da utilizzare dopo una modifica nelle stesse , e `xset q`, per conoscere i settaggi attuali ), alcuni parametri del mouse, i parametri DPMS ( Energy Star ) e molto altro ancora. Normalmente, eccetto che per la rilettura del fontpath, non avrete bisogno di utilizzare questo comando.
 - xfontsel : Un utile programma grafico per controllare le proprietà di tutti i font riconosciuti da X

**** Siamo alla fine?
Non è ovviamente finita qui: ogni distribuzione ha i suoi strumenti per configurare l'ambiente, chi non vuole mettere le mani direttamente nei file di configurazione può usare quelli; inoltre  ogni WM  ha i suoi tool grafici per configurare se stesso: uno per tutti il Centro di Controllo del KDE, capace di configurazioni veramente capillari. 
Per quel che riguarda il problema di far riconoscere ad X un font, basta inserirne correttamente le caratteristiche in un file fonts.dir, anche se  a seconda del tipo di font dovremo usare ora un programma ora un altro, o addirittura fare qualche esperimento editando il file manualmente. 
La configurazione di base di X invece è ormai quasi automatica, ( lo sfruttamento a fondo di questo server resta invece un affare per utenti un po' esperti ). 
Linux insomma si sta notevolmente semplificando, stanno comparendo sempre più programmi ad interfaccia grafica  ( i più smaliziati magari continueranno a preferire le utility a linea di comando o addirittura la modifica manuale dei file di configurazione ), inoltre la documentazione è molto ricca, tutte le distribuzioni comprendono una raccolta pressoché completa di How-To e di file di spiegazioni in formato PostScript ( estensione .ps ) o in HTML. Per i più esigenti in fatto di notizie, sul cd troverete alcuni dei link di partenza per trovare altre utili informazioni e news, nello stesso formato HTML dei bookmarks di Netscape.
Ricordate comunque che tutte le volte che incontrate un comando, in un articolo, o curiosando in uno script di shell, dovunque insomma, fate un bel `man nomecomando' o 'info nomecomando'. La vostra conoscenza del Linux non ne trarrà che giovamento.

**** BOX: X in rete
Solo un accenno per quella che è la caratteristica più potente di X, ma che difficilmente si userà sul pc domestico : la possibilità di scaricare il lavoro grafico su un server potente e di accedervi con client modesti, favorendo il risparmio di hardware e sfruttando al massimo ciò di cui si dispone. A causa di questa dualità le comunicazioni tra client e server sono necessari dei protocolli di sicurezza per evitare intrusioni: i protocolli usati sono: 

- Host Access : Comodo e facile da usare, è molto poco sicuro: col comando "xhost - " si disabilitano i collegamenti al nostro server, mentre con "xhost +nomehost " si abilita il solo 'nomehost'
- MIT-Magic-Cookies : E' il metodo predefinito di Mandrake/RedHat, si basa su un cookie da 128 bit che viene generato da xdm al momento del login, e passato sia al server X che all'utente: l'unico difetto è che i cookie vengono trasmessi non criptati e quindi possono essere intercettati.
- XDM-Auth-1 : Versione evoluta del precedente, in cui i cookie vengono criptati con l'algoritmo DES a 56 bit, ma a causa delle restrizioni del governo americano sulle esportazioni di tecnologie di cifratura, equiparate ad armi, questo metodo non è disponibile fuori dagli U.S.A.
- SUN-DES-1 : Meccanismo di autenticazione per Solaris
- MIT-Kerberos-5 : Il sistema più sicuro in assoluto, funziona come Host Access ma vengono criptati tutti gli scambi tra server e client

**** FINE BOX

***** DIDA

FOTO 1:	x-hpxf86.jpg
La home page di Xfree86, il punto di partenza per le tematiche relative ad X

FOTO 2:	x-ps.jpg
La catena di comandi per lanciare X in modo ottimale.

FOTO 3:	x-kde.jpg
Il KDE, uno dei WM migliori e più stabili, anche se non il più veloce

FOTO 4:	x-as.jpg
Afterstep, un altro glorioso WM, con applicazioni GNOME 

FOTO 5:	x-miscdesk.jpg
Il trionfo della libertà, il WM xfce che fa girare il file manager di KDE e altre applicazioni per X. 

FOTO 6:	x-q3.jpg
Con  X ovviamente si puo anche giocare: questo lo riconoscete? E' uscito prima per Linux che per Windows

FOTO 7:	x-tt.jpg
I caratteri True Type in Gimp e nel Desktop fanno molto "in"

NOTA PER L'IMPAGINAZIONE: se dovete tagliare qualche foto, tagliate pure la 1 e la 2, e se proprio dovete anche la 4