Alcuni esempi di configurazione di XDM per più display

  In questa sezione si tratta del gestore di display standard del server grafico UNIX X11: XDM, X11 Display Manager.  In particolare le configurazioni che seguono sono state provate su un PC 586 con un server grafico Xorg X Window System Version 1.3.0 e XDM versione 1.1.6, anche se sono state usate in precedenza su versioni precedenti di Xorg e anche su XFree86 fino alla versione 4.3.

   Con gestore di display X11 in campo UNIX si intende un programma che:
  1. autentichi un utente leggendo in input il nome utente e la corrispondente parola d'accesso (password);
  2. ad autenticazione completata con successo, mandi in esecuzione un gestore di finestre, un window manager, ossia un programma che gestisca l'apertura e la chiusura nell'ambiente grafico delle finestre nelle quali i vari applicativi dell'utente gestiscono il loro input ed output, e che ne gestisca anche le varie proprietà, caratteristiche, scambio informazioni con gli altri processi e i vari eventi e segnali dell'ambiente grafico.
   XDM è stato uno dei primi gestori di display per UNIX e, da quanto so, è disponibile per tutti i sistemi UNIX, sia quelli liberi (come Linux, i vari BSD e OpenSolaris), sia quelli proprietari, come Solaris, AIX, HP-UX, IRIX, SCO eccetera.

  Il resto della guida riflette la configurazione di XDM su sistemi GNU/Linux (in particolare è stata sperimentata su distribuzioni Gentoo e Fedora13), ma mi aspetto che su altri UNIX questa funzioni in modo abbastanza simile per versioni simili di XDM.

  Il file principale che regola il funzionamento di XDM è il file /etc/X11/xdm/xdm-config; in questo file compaiono le indicazioni su quali programmi vanno eseguiti nelle diverse fasi di preparazione ed esercizio di XDM.  Ad esempio, questo file può contenere le righe seguenti:

! $Xorg: xdm-conf.cpp,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
! $XdotOrg: $
!
! $XFree86: xc/programs/xdm/config/xdm-conf.cpp,v 1.10 2002/11/30 19:11:32 herrb Exp $
!

DisplayManager.errorLogFile: /var/log/xdm.log
DisplayManager.pidFile: /var/run/xdm.pid
DisplayManager.keyFile: /etc/X11/xdm/xdm-keys
DisplayManager.servers: /etc/X11/xdm/Xservers
DisplayManager.accessFile: /etc/X11/xdm/Xaccess
DisplayManager*resources: /etc/X11/xdm/Xresources
DisplayManager.willing: /usr/lib/X11/xdm/Xwilling
! All displays should use authorization, but we cannot be sure
! X terminals may not be configured that way, so they will require
! individual resource settings.
DisplayManager*authorize: true
!DisplayManager._0.authorize: true
!
DisplayManager*chooser: /usr/lib/X11/xdm/chooser
DisplayManager*startup: /usr/lib/X11/xdm/Xstartup
!DisplayManager*startup: /etc/X11/xdm/Xstartup_other
DisplayManager*session: /usr/lib/X11/xdm/Xsession
DisplayManager*reset: /usr/lib/X11/xdm/Xreset
DisplayManager*authComplain: true
! The following three resources set up display :0 as the console.
DisplayManager._0.setup: /etc/X11/xdm/Xsetup_0
DisplayManager._0.startup: /etc/X11/xdm/Xstartup_0
DisplayManager._0.reset: /etc/X11/xdm/Xreset_0
DisplayManager._1.setup: /etc/X11/xdm/Xsetup_1
DisplayManager._1.startup: /etc/X11/xdm/Xstartup_1
DisplayManager._1.reset: /etc/X11/xdm/Xreset_1


DisplayManager*loginmoveInterval: 10

! SECURITY: do not listen for XDMCP or Chooser requests
! Comment out this line if you want to manage X terminals with xdm
!DisplayManager.requestPort: 0

  Le righe più interessanti di questo file di configurazione sono spiegate nel seguito:
  1. DisplayManager._n.setup:        /etc/X11/xdm/Xsetup_n
    quando il server X11 si appronta a gestire il display :n, si esegue il file Xsetup_n.  Questo script legge il file di configurazione /etc/X11/xdm/xdm.options e ne effettua le azioni che lo riguardano, che in genere vuol dire che manda in esecuzione programmi i cui identificativi di processo sono salvati in file nella cartella /var/run/; al termine della sua esecuzione appare la finestra grafica di login sul server X11.
  2. DisplayManager._n.startup:      /etc/X11/xdm/Xstartup_n
    Dopo che l'utente ha effettuato con successo la propria autenticazione, è mandato in esecuzione il file /etc/X11/xdm/Xstartup_n. Dopo aver cambiato il proprietario del dispositivo /dev/console all'utente che ha effettuato il login, questo script rilegge il file di configurazione xdm.options e termina l'esecuzione di quei programmi che erano stati avviati nel passo (1), inviando un segnale TERM ai processi i cui identificativi erano stati salvati nei corrispondenti file in /var/run/.
  3. DisplayManager._n.reset:        /etc/X11/xdm/Xreset_n
    Quando l'utente cessa la sua sessione X11 e chiude il gestore delle finestre, si manda in esecuzione il file /etc/X11/xdm/Xreset_n, che fa le operazioni di pulizia che possono essere necessarie prima di approntare una nuova schermata di login con corrispondente riesecuzione del passo (1);
  4. DisplayManager.servers:         /etc/X11/xdm/Xservers
    Le operazioni indicate nei punti sopra elencati sono eseguite per sessioni XDM lanciate per ciascuno dei server X11 definiti nel file Xservers.
  Nel passo (1), quando XDM deve gestire il display numero :n (con n numero intero), manda in esecuzione il file /etc/X11/xdm/Xsetup_n.
In questo file possono essere eseguiti comandi che usano le funzioni dell'interfaccia grafica X11, ma non le funzioni del gestore di finestre.  Ad esempio, si può aprire una finestra che mostri l'ora del sistema locale, ma non saranno disponibili le barre di scorrimento, i pulsanti o i bordi trascinabili per spostare o ridimensionare la finestra con il puntatore (mouse).

  Negli script che seguono si usa la shell /bin/dash invece della shell bash che è quella di default nelle distribuzioni Linux.  Si è scelta questa shell per via delle sue molto ridotte dimensioni (110KiB invece dei 732KiB della bash in Linux Gentoo 1.12.11.1) e per la sua rapidità di esecuzione degli script confronto alla bash.

  Segue un esempio di file Xsetup_0 che esegue le operazioni di cui il passo (1):

#!/bin/dash
#
# /etc/X11/xdm/Xsetup_0
#
# This script is run whenever xdm is asked to manage a display on :0

XDM_OPTIONS='/etc/X11/xdm/xdm.options'
MYDISPLAY=$(echo $DISPLAY | tr \: _)
SYSMODMAP='/etc/X11/Xmodmap'

if grep -qs ^run-xconsole_0 "$XDM_OPTIONS"
then if test -f "/var/run/xconsole_$MYDISPLAY.pid"
# kill any running xconsole
then pid=$(cat "/var/run/xconsole_$MYDISPLAY.pid")
if test "$pid"
then kill $pid 2> /dev/null
fi
rm -f "/var/run/xconsole_$MYDISPLAY.pid"
fi
# start fresh xconsole and store its PID
xconsole -geometry 600x130-0-0 -notify -verbose -fn fixed \
-exitOnFail -saveLines 200 -file /dev/xconsole &
echo $! > "/var/run/xconsole_$MYDISPLAY.pid"
fi

if test -x /usr/bin/xmodmap -a -f "$SYSMODMAP"
then xmodmap "$SYSMODMAP"
fi

if grep -qs ^run-xscreensaver_0 "$XDM_OPTIONS"
then if test -f "/var/run/xscreensaver_$MYDISPLAY.pid"
then xspid=$(cat "/var/run/xscreensaver_$MYDISPLAY.pid")
if test -n "$xspid"
then kill -TERM "$xspid" 2> /dev/null
fi
rm -f "/var/run/xscreensaver_$MYDISPLAY.pid"
fi
xhost +localhost # This gives X access to anyone capable of logging in locally
xscreensaver-command -exit
xscreensaver -no-splash &
echo $! > "/var/run/xscreensaver_$MYDISPLAY.pid"
fi

if grep -qs ^run-xclock_0 "$XDM_OPTIONS"
then if test -f "/var/run/xclock_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xclock_$MYDISPLAY.pid") 2>/dev/null
 rm -f "/var/run/xclock_$MYDISPLAY.pid"
fi
if test -x /usr/bin/xclock
then /usr/bin/xclock -analog -update 1 -geometry 200x200+0+0 &
echo $! > "/var/run/xclock_$MYDISPLAY.pid"
fi
fi

if grep -qs ^run-xload_0 "$XDM_OPTIONS"
then if test -f "/var/run/xload_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xload_$MYDISPLAY.pid") 2>/dev/null
rm -f "/var/run/xload_$MYDISPLAY.pid"
fi
if test -x /usr/bin/xload
then /usr/bin/xload -fg black -bg white -hl blue -geometry 600x130+0-0 &
echo $! > "/var/run/xload_$MYDISPLAY.pid"
fi
fi

COLOUR="$(grep '^bgcolour-' "$XDM_OPTIONS" | cut -f 2 -d -)"
which xsetroot > /dev/null 2>&1
if test $? -eq 0 -a -n "$COLOUR"
then xsetroot -solid "$COLOUR"
fi

  Lo script non è intelligente e non analizza ogni parola per dedurne il nome del comando da eseguire, ma contiene costrutti fissi per ciascuna voce del file di configurazione che riconosce (questo sarebbe da cambiare e lo script dovrebbe dedurre il nome del comando da eseguire dal nome della voce nel file di configurazione, DA FARE).

  Per ciascuna di tale voce verifica che nel file di configurazione "$XDM_OPTIONS" compaia una riga che inizi con la parola cercata.  Se ne trova una, allora:
  1. verifica che non esista un file .pid nella cartella /var/run che contenga il numero identificativo di un processo uguale a quello che deve lanciare;
  2. se trova un tale file, manda un segnale TERM al processo il cui numero è contenuto in questo file, quindi cancella il file;
  3. verifica l'esistenza del file eseguibile nella cartella /var/run;
  4. manda in esecuzione il programma conservandone il numero identificativo del processo in un file della cartella /var/run.
  In ultimo imposta lo sfondo ad un colore fisso, determinato nel file di configurazione dalla voce bgcolour-colore.

  Vedendo il file di configurazione sopra riportato si vede che per il display 0 sono abilitati la xconsole, l'orologio xclock e la finestra con il carico di lavoro del sistema xload.

  Le caratteristiche della finestra di login quali i caratteri usati, i colori usati, l'immagine bitmap usata come decorazione e il testo di benvenuto, sono determinati dal contenuto del file Xresources_n, dove n è, di nuovo, l'indicatore del display cui si riferisce il file.

  Nel seguito, si riporta un esempio di file usato nel passo (2), il file Xstartup_0:

#!/bin/dash
#
# /etc/X11/xdm/Xstartup_0
#
# This script is run as root after a user starts a session on :0.

set -e
XDM_OPTIONS='/etc/X11/xdm/xdm.options'
MYDISPLAY=$(echo $DISPLAY | tr \: _)

# Assign ownership of the console to the invoking user
# $Xorg: GiveConsole,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
#
# By convention, both xconsole and xterm -C check that the
# console is owned by the invoking user and is readable before attaching
# the console output. This way a random user can invoke xterm -C without
# causing serious grief.
#
chown $USER /dev/console

# Call the global Xstartup script, if it exists
if test -x /etc/X11/xdm/Xstartup
then /etc/X11/xdm/Xstartup || exit $?
fi

# :0 specific startup commands go here

if grep -qs ^run-xclock_0 "$XDM_OPTIONS"
then if test -f "/var/run/xclock_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xclock_$MYDISPLAY.pid") 2>/dev/null
rm -f "/var/run/xclock_$MYDISPLAY.pid"
fi
fi

if grep -qs ^run-xscreensaver_0 "$XDM_OPTIONS"
then if test -f "/var/run/xscreensaver_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xscreensaver_$MYDISPLAY.pid") 2>/dev/null
rm -f /var/run/xscreensaver_$MYDISPLAY.pid
fi
fi

if grep -qs ^run-xconsole_0 "$XDM_OPTIONS"
then if test -f "/var/run/xconsole_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xconsole_$MYDISPLAY.pid") 2>/dev/null
rm -f "/var/run/xconsole_$MYDISPLAY.pid"
fi
fi

if grep -qs ^run-xload_0 "$XDM_OPTIONS"
then if test -f "/var/run/xload_$MYDISPLAY.pid"
then kill -TERM $(cat "/var/run/xload_$MYDISPLAY.pid") 2>/dev/null
rm -f "/var/run/xload_$MYDISPLAY.pid"
fi
fi

  Il file globale /etc/X11/xdm/Xstartup che vi compare contiene le istruzioni seguenti:

#!/bin/dash
#
# /etc/X11/xdm/Xstartup
#
# This script is run as root after the user logs in.
# If this script exits with a return code other than 0, the user's
# session will not be started.

set -e

XDM_OPTIONS='/etc/X11/xdm/xdm.options'

if grep -qs ^ignore-nologin "$XDM_OPTIONS"
then if test -f /etc/nologin
then if command -v xmessage &> /dev/null
then xmessage -file /etc/nologin -geometry 640x480
fi
fi
elif test -f /etc/nologin
then if command -v xmessage &> /dev/null
then xmessage -file /etc/nologin -geometry 640x480
fi
exit 1
fi

if grep -qs ^motd "$XDM_OPTIONS"
then if test -x /usr/bin/xmessage -a -e /etc/motd
then xmessage -nearmouse -file /etc/motd -timeout 60 -default Continua \
-buttons Continua:0,Cancella:2
# Usa una struttura "case" per estendere facilmente il costrutto
# dopo aver aggiunto altri bottoni a xmessage
case "$?" in
1|2) exit 1 ;;
esac
fi
fi

# insert a utmp entry for the session
if grep -qs ^use-sessreg "$XDM_OPTIONS" ; then
exec sessreg -a -l "$DISPLAY" -u /var/run/utmp -x /etc/X11/xdm/Xservers "$USER"
fi

  Questo script quindi mostra con il comando xmessage il contenuto dei file /etc/nologin ed esce con un codice di errore (il che fa fallire la sessione di xdm e quindi impedisce l'avvio del gestore di finestre) se tale file è presente e se questo comportamento non è esplicitamente inibito dall'apposita voce del file di configurazione "ignore-nologin".

  In seguito, se nel file xdm.options compare la voce "motd", controlla l'esistenza del file /etc/motd e, se presente, ne mostra il contenuto con il comando xmessage, dando la scelta all'utente di continuare avviando la sessione del gestore di finestre oppure di abbandonare la sessione per tornare alla finestra di benvenuto di xdm.

  In ultimo, se così istruito a fare dal file di configurazione, aggiorna con il comando sessreg il file registro di sessione /var/run/utmp inserendo la nuova sessione appena inugurata.

  Infine, un file di esempio che attua le operazioni del passo (3) è il seguente, il file /etc/X11/xdm/Xreset_0:

#!/bin/dash
#
# /etc/X11/xdm/Xreset_0
#
# This script is run as root after the session on :0 ends.

XDM_OPTIONS='/etc/X11/xdm/xdm.options'
MYDISPLAY=$(echo $DISPLAY | tr \: _)

# Reassign ownership of the console to root, this should disallow
# assignment of console output to any random users's xterm
# $Xorg: TakeConsole,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
#
chmod 622 /dev/console
chown root /dev/console

# Call the global Xreset script, if it exists
# Questo file si prende cura di sessreg
test -x /etc/X11/xdm/Xreset && /etc/X11/xdm/Xreset

# :0 specific reset commands go here
if grep -qs ^run-xconsole_0 "$XDM_OPTIONS"
then if test -f "/var/run/xconsole_$MYDISPLAY.pid"
then pid=$(cat "/var/run/xconsole_$MYDISPLAY.pid")
if test "$pid"
then kill "$pid" 2> /dev/null
fi
rm -f "/var/run/xconsole_$MYDISPLAY.pid"
fi
fi

  Questo script riassegna la console /dev/console al superutente (root), invertendo l'operazione opposta che aveva effettuato lo script Xstartup_0 del passo (2).

  Il file globale /etc/X11/xdm/Xreset che compare nel file Xreset_0 esegue queste operazioni:

#!/bin/dash
#
# /etc/X11/xdm/Xreset
#
# This script is run as root after any X session ends.

# Remove the utmp entry for the session
if grep -qs ^use-sessreg /etc/X11/xdm/xdm.options
then sessreg -d -l "$DISPLAY" -u /var/run/utmp -x /etc/X11/xdm/Xservers "$USER"
fi

exit 0

  Ossia, aggiorna con il comando sessreg il file registro di sessione /var/run/utmp cancellando la sessione appena chiusa che era stata in precedenza registrata dallo script /etc/X11/xdm/Xstartup del passo (2).  Questo, come sempre, se tali operazioni sono contemplate nel file di configurazione xdm.options.

Il file xdm.options

  Per modificare il comportamento di questo file eseguibile senza doverlo ogni volta modificare, si è creato un file di configurazione che lo script legge ed interpreta durante la sua esecuzione, il file /etc/X11/xdm/xdm.options.

  Questo file contiene righe di una sola parola che determinano l'esecuzione o la mancata esecuzione di determinati comandi da parte dello script Xsetup_n.  Queste parole sono strutturate nel modo seguente:
[no-]run-comando_n
dove l'opzione no- eventualmente prefissa indica che il comando è esplicitamente escluso dall'essere eseguito, la parte comando indica quale comando vada eseguito o non eseguito da parte di Xsetup_n e il postfisso _n indica il display al quale è rivolto la parola di configurazione.

  Ecco un esempio di file xdm.options, che distingue le azioni da intraprendersi per i display 0 e 1 e per tutti gli altri (other, che sono quindi trattati tutti alla stessa maniera):

# $Id$
#
# configuration options for xdm
# See xdm.options(5) for an explanation of the available options.

no-ignore-nologin
no-restart-on-upgrade
no-start-on-install
use-sessreg
no-motd
run-xconsole_0
run-xconsole_1
run-xconsole_other
no-run-xscreensaver_0
no-run-xscreensaver_1
no-run-xscreensaver_other
run-xclock_0
run-xclock_1
run-xclock_other
run-xload_0
run-xload_1
run-xload_other
bgcolour-blue4
#no-beep

  La schermata risultante per il primo display di XDM è quindi la seguente: (cliccare l'immagine per vederla ad una risoluzione maggiore)
Schermo di XDM

Come avviare due sessioni XDM locali su display separati

   Un'opportuna configurazione di XDM permette di avere più sessioni aperte nello stesso sistema locale, ognuna delle quali permette l'autenticazione di un utente separato che gestirebbe così il suo gestore di finestre separato.

  Questo aspetto della funzionalità di XDM è gestito dal file /etc/X11/xdm/Xservers, che per permettere di avere due sessioni XDM locali distinte può essere approntato in questo modo:

# $Xorg: Xserv.ws.cpp,v 1.3 2000/08/17 19:54:17 cpqbld Exp $
#
# Xservers file, workstation prototype
#
# This file should contain an entry to start the server on the
# local display; if you have more than one display (not screen),
# you can add entries to the list (one per line). If you also
# have some X terminals connected which do not support XDMCP,
# you can add them here as well. Each X terminal line should
# look like:
# XTerminalName:0 foreign
#
:0 PCViaK6II-500 local /usr/bin/Xorg :0 vt9
:1 PCViaK6II-500 local /usr/bin/Xorg :1 vt10

  Questo file predispone XDM ad aprire due schermi per il login grafico, usando:
  1. il display :0 per il primo schermo, :1 per il secondo;
  2. la stessa stringa di descrizione, "PCViaK6II-500";
  3. lo stesso server grafico, /usr/bin/Xorg;
  4. il terminale /dev/vt9 per il primo server e il terminale /dev/vt10 per il secondo.
  Così configurato questo file, i server Xorg useranno lo stesso hardware per l'input-output: la stessa tastiera, lo stesso puntatore e la stessa scheda grafica con lo stesso schermo.  Usando gli switch -keyboard, -pointer e -screen, oppure lo switch -layout, si può istruire ciascun server Xorg ad usare una tastiera, un puntatore e uno schermo (e scheda video) separati per ciascun display, che dovranno però essere stati appositamente configurati nel file di configurazione di Xorg /etc/X11/xorg.conf.

Ultima revisione: 28 luglio 2010

< Torna al livello superiore <
<< Torna alla pagina iniziale <<
Licenza Creative CommonsDocumento in libera distribuzione secondo quanto previsto dalla licenza Creative Commons vers. 3.0, Attribuzione - Non commerciale - Condivisibile alle stesse condizioni http://creativecommons.org/licenses/by-nc-sa/3.0/deed.it