[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 307.   Gestione e personalizzazione dei terminali LTSP

Esistono diversi modi per avviare un terminale LTSP; principalmente si possono considerare Etherboot e PXE.

Una volta compreso il meccanismo dell'avvio del terminale, può essere utile considerare la possibilità di adattare in qualche modo il sistema LTSP, per i propri scopi particolari.

307.1   Avvio con PXE

Il nome PXE è acronimo di Pre-boot execution environment, che identifica un procedimento per il caricamento di un piccolo file eseguibile attraverso l'interfaccia di rete, per avviare il sistema operativo.

Quando l'interfaccia di rete è predisposta per questo tipo di procedimento, il caricamento del sistema attraverso PXE diventa il metodo più semplice, perché è sufficiente configurare il firmware dell'elaboratore (il BIOS) e non servono altri dispositivi a disco, nemmeno l'unità a dischetti.

Utilizzando questo metodo, il servente DHCP deve pubblicizzare il file /lts/.../pxelinux.0. Per esempio, trattandosi del servente DHCP di ISC, il file /etc/dhcp3/dhcpd.conf dovrebbe contenere una direttiva simile a quella seguente:

  filename "/lts/2.6.9-ltsp-3/pxelinux.0";

Considerato che il servente TFTP funzioni con l'opzione -s, si sta facendo riferimento al file /tftpboot/lts/2.6.9-ltsp-3/pxelinux.0. Nella directory che contiene il file pxelinux.0, devono essere presenti altri file, con i nomi previsti; in questo caso si tratta di:

File o directory Descrizione
pxelinux.0 eseguibile caricato attraverso il metodo PXE;
pxelinux.cfg/default file di configurazione che individua gli altri file da caricare;
bzImage-2.6.9-ltsp-3 kernel, come indicato nel file pxelinux.cfg/default;
initrd-2.6.9-ltsp-3.gz disco RAM iniziale, come indicato nel file pxelinux.cfg/default.

In base a questo esempio, il file pxelinux.cfg/default ha il contenuto seguente:

prompt 0
label linux
  kernel bzImage-2.6.9-ltsp-3
  append init=/linuxrc rw root=/dev/ram0 initrd=initrd-2.6.9-ltsp-3.gz

Perché il terminale possa caricare il sistema attraverso il metodo PXE, è necessario che il servente TFTP sia in grado di accettare l'opzione tsize, altrimenti, il caricamento dei file successivi a pxelinux.0 fallisce.

307.2   Avvio con Etherboot

Etherboot è un programma da compilare specificatamente per il tipo di interfaccia di rete di cui si dispone, fatto per essere inserito in una memoria ROM da montare nell'interfaccia stessa. Questo programma è in grado di utilizzare il protocollo DHCP e TFTP per caricare un file contenente il kernel, modificato in modo da avere alla fine anche il disco RAM iniziale. Etherboot può essere usato anche attraverso un dischetto, senza la necessità di predisporre una memoria ROM ed è questo il metodo che viene descritto qui.

Per l'avvio con Etherboot, il servizio DHCP può pubblicare il kernel modificato che si trova nella directory /tftpboot/lts/vmlinux-n.n.n-ltsp-3. Nel caso del servente DHCP di ISC, il file /etc/dhcp3/dhcpd.conf dovrebbe contenere una direttiva simile a quella seguente, dove n.n.n rappresenta la versione del kernel:

  filename "/lts/vmlinux-n.n.n-ltsp-3";

Tuttavia, il codice contenuto in Etherboot è in grado di avviare il sistema anche a partire da un file adatto per il metodo di avvio PXE; pertanto, questo secondo modo diventa quello preferibile in generale. L'esempio di configurazione del file /etc/dhcp3/dhcpd.conf va modificato nel modo seguente:

  filename "/lts/n.n.n-ltsp-3/pxelinux.0";

Qualunque sia la scelta nel modo di raggiungere il kernel, occorre produrre o procurarsi il file necessario ad avviare il terminale con Etherboot. Per le interfacce di rete da inserire in un bus ISA, occorre conoscere il modello; per quelle fatte per bus PCI (anche se integrate nella scheda madre), occorre risalire al numero identificativo del produttore e del dispositivo.

Disponendo di un sistema GNU/Linux, anche se avviato provvisoriamente, è possibile leggere le informazioni sul bus PCI con il programma lspci; inizialmente bisogna individuare l'interfaccia:

lspci[Invio]

0000:00:00.0 Host bridge: ATI Technologies Inc: Unknown device 5833 (rev 02)
0000:00:01.0 PCI bridge: ATI Technologies Inc: Unknown device 5838
0000:00:13.0 USB Controller: ATI Technologies Inc: Unknown device 4347 (rev 01)
0000:00:13.1 USB Controller: ATI Technologies Inc: Unknown device 4348 (rev 01)
0000:00:13.2 USB Controller: ATI Technologies Inc: Unknown device 4345 (rev 01)
0000:00:14.0 SMBus: ATI Technologies Inc ATI SMBus (rev 17)
0000:00:14.1 IDE interface: ATI Technologies Inc: Unknown device 4349
0000:00:14.3 ISA bridge: ATI Technologies Inc: Unknown device 434c
0000:00:14.4 PCI bridge: ATI Technologies Inc: Unknown device 4342
0000:00:14.5 Multimedia audio controller: ATI Technologies Inc \
  \IXP150 AC'97 Audio Controller 0000:01:05.0 VGA compatible controller: ATI Technologies Inc: \
  \Unknown device 5834 0000:02:07.0 Ethernet controller: D-Link System Inc RTL8139 Ethernet (rev 10)

La riga che appare evidenziata corrisponde all'interfaccia di rete di cui occorre trovare il numero di identificazione:

lspci -n[Invio]

0000:00:00.0 0600: 1002:5833 (rev 02)
0000:00:01.0 0604: 1002:5838
0000:00:13.0 0c03: 1002:4347 (rev 01)
0000:00:13.1 0c03: 1002:4348 (rev 01)
0000:00:13.2 0c03: 1002:4345 (rev 01)
0000:00:14.0 0c05: 1002:4353 (rev 17)
0000:00:14.1 0101: 1002:4349
0000:00:14.3 0601: 1002:434c
0000:00:14.4 0604: 1002:4342
0000:00:14.5 0401: 1002:4341
0000:01:05.0 0300: 1002:5834
0000:02:07.0 0200: 1186:1300 (rev 10)

Si individua così che si tratta del numero 1186:1300, oltre al fatto che si tratta di un'interfaccia RTL8139.

A questo punto occorrerebbe disporre del pacchetto Etherboot per produrre il file necessario; tuttavia la descrizione di questo procedimento viene omessa, perché è possibile ottenere facilmente il file adatto alla propria interfaccia di rete attraverso <http://www.rom-o-matic.net>.

Se si utilizza <http://www.rom-o-matic.net>, occorre selezionare la versione di Etherboot, quindi si passa a una pagina interattiva dove si deve selezionare il modello dell'interfaccia di rete. Alla voce Choose ROM output format occorre scegliere: Floppy bootable ROM image (.zdsk).

Figura 307.8. Selezione dell'interfaccia RTL8139 118616:130016 da <http://www.rom-o-matic.net>.

rom o matic

In questo caso si ottiene il file eb-5.4.0-rtl8139.zdsk, che va copiato nel dischetto senza alcun file system:

cat eb-5.4.0-rtl8139.zdsk > /dev/fd0[Invio]

A questo punto, il dischetto è pronto per essere usato per avviare il terminale che dispone di quella scheda.

307.3   Avvio del terminale

Il terminale avviato con un dischetto contenente il codice Etherboot o attraverso PXE, dopo il caricamento del kernel, dopo l'esecuzione di /linuxrc nel disco RAM iniziale, innesta il file system principale con il protocollo NFS e avvia il sistema LTSP.

Ciò che si ottiene dipende in modo particolare dal file /etc/lts.conf (presso il servente NFS si tratta di /opt/ltsp/i386/etc/lts.conf), dove le direttive SCREEN_0n descrivono cosa avviare presso ogni console virtuale del terminale. Si può supporre che questo file contenga le righe seguenti:

[Default]
        ...
        SCREEN_01          = startx
        SCREEN_02          = telnet
        SCREEN_03          = shell
        ...

In questo caso, nella prima console virtuale viene avviata una sessione grafica; nella seconda viene avviato un collegamento con il protocollo TELNET; nella terza viene avviata una shell locale (con i privilegi dell'utente root).

L'avvio della sessione grafica implica la disponibilità del servente XDMCP di accettare un accesso:

login

Naturalmente, tutto ciò che si fa utilizzando la sessione grafica o il collegamento con TELNET, si attua presso l'elaboratore remoto.

307.4   Utenze presso il terminale

In condizioni normali, presso il terminale è disponibile soltanto l'utente root, dato che il lavoro viene svolto presso un elaboratore remoto che richiede una forma di autenticazione (attraverso XDMCP o TELNET).

Il fatto di disporre localmente dell'utenza root, a cui si accede senza fornire alcuna parola d'ordine, non porta ad alcun inconveniente, considerato che il file system di rete viene ottenuto in sola lettura.

Esiste comunque la possibilità di inserire nel file /opt/ltsp/i386/etc/lts.conf (presso il servente) delle direttive per fare in modo che il terminale utilizzi il protocollo NIS, allo scopo di riconoscere gli utenti. Tuttavia, non è prevista la possibilità di accedere al sistema localmente utilizzando le utenze remote. L'esempio seguente mostra le direttive in questione, ipotizzando il servizio NIS presso 172.17.1.254, con il nome del dominio NIS mio.nis:

[Default]
        ...
        LOCAL_APPS         = Y
        NIS_SERVER         = 172.17.1.254
        NIS_DOMAIN         = mio.nis
        ...

La direttiva LOCAL_APPS = Y fa sì che presso il terminale, in corrispondenza della directory /home/, venga innestata la directory /home/ presso il servente NFS, già usato per il file system principale (naturalmente, è necessario che il servente NFS offra in condivisione tale directory). Le direttive NIS_* fanno sì che venga utilizzato il NIS per individuare le utenze (l'associazione tra numeri UID e nomi, così come l'individuazione delle directory personali).

307.5   Adattamento delle funzioni associate alle console virtuali

Nel file /etc/lts.conf (ovvero il file /opt/ltsp/i386/etc/lts.conf presso il servente NFS), le direttive SCREEN_0n consentono di attribuire alla console virtuale 0n l'esecuzione di un certo script contenuto nella directory /etc/screen.d/.

[Default]
        ...
        SCREEN_01          = startx
        SCREEN_02          = telnet
        SCREEN_03          = shell
        ...

A titolo di esempio, ci si può porre come obiettivo di modificare l'aspetto dell'invito (prompt) quando si avvia una shell locale. Per fare questo occorre intervenire nel file /etc/screen.d/shell (/opt/ltsp/i386/etc/screen.d/shell presso il servente NFS), che inizialmente potrebbe risultare essere quello seguente:

#!/bin/bash
#
# Fire up a shell on this tty
#
echo "tty=" `tty`
exec /bin/bash --login

Si intende realizzare un invito contenente l'indirizzo IPv4 locale del terminale. Ecco come si potrebbe modificare lo script:

#!/bin/bash
#
# Fire up a shell on this tty
#
echo "tty=" `tty`
#
IPV4=`/sbin/ifconfig eth0 2> /dev/null | grep "inet addr:" | sed "s/^.*inet addr:\([0-9.]*\).*$/\1/"`
if [ "$IPV4" = "" ]
then
    IPV4=`/sbin/ifconfig eth1 2> /dev/null | grep "inet addr:" | sed "s/^.*inet addr:\([0-9.]*\).*$/\1/"`
fi
if [ "$IPV4" = "" ]
then
    PS1="\w\\$ "
else
    PS1="\u@$IPV4:\w\\$ "
fi
export PS1
#
exec /bin/bash --login

307.6   Aggiunta di altri programmi

Il sistema LTSP è fatto principalmente per consentire l'accesso ad altri elaboratori, sia attraverso il protocollo XDMCP (per la grafica), sia attraverso TELNET o SSH (il secondo avviando il programma ssh da una shell locale). Eventualmente, si potrebbe considerare la possibilità di aggiungere altri programmi al sistema LTSP, in modo da consentirne l'uso locale presso i terminali.

Per aggiungere un programma, dovrebbe essere possibile prelevare il file eseguibile di un sistema GNU/Linux, fatto per lo stesso tipo di architettura, raccogliendo anche i file delle librerie che possono mancare nel sistema LTSP esistente. Per scoprire quali sono i file delle librerie da cui dipende un programma già compilato, si usa normalmente ldd:

ldd kbd_mode[Invio]

        libctutils.so.0 => /lib/libctutils.so.0 (0xb7fd5000)
        libconsole.so.0 => /lib/libconsole.so.0 (0xb7fc2000)
        libc.so.6 => /lib/tls/libc.so.6 (0xb7e8e000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fea000)

Eventualmente, per installare un programma del genere, senza mescolarlo con il resto del sistema LTSP, si può usare una directory che discende da /opt/ (/opt/ltsp/i386/opt/ presso il servente NFS), utilizzando poi uno script che imposta la variabile di ambiente LD_LIBRARY_PATH per consentire al programma di trovare le sue librerie.

307.7   Configurazione del terminale per la codifica UTF-8

La gestione del terminale a caratteri di LTSP è essenziale; questo significa che la mappa della tastiera è quella statunitense e che la codifica prevista è a soli 8 bit.

Quando si utilizza LTSP come terminale TELNET o SSH, se ci si deve collegare a un elaboratore presso il quale si prevede l'utilizzo della codifica UTF-8, il lavoro diventa complicato; pertanto è bene cercare di rimediare a questa mancanza di LTSP.

In questa sezione viene proposto un lavoro realizzato per nanoLinux IV, che include LTSP. In pratica sono stati copiati alcuni programmi, già compilati, da una distribuzione GNU/Linux Debian, individuando i file delle librerie mancanti, mettendo tutto nella directory /opt/nanoLinux/ (/opt/ltsp/i386/opt/nanoLinux/ presso il servente NFS):

tree opt/nanoLinux[Invio]

opt/nanoLinux/
|-- bin
|   |-- console-setup
|   |-- consolechars
|   |-- kbd_mode
|   `-- loadkeys
|-- etc
|   `-- console
|       `-- boottime.kmap.gz
|-- lib
|   |-- libcfont.so.0 -> libcfont.so.0.0.0
|   |-- libcfont.so.0.0.0
|   |-- libconsole.so.0 -> libconsole.so.0.0.0
|   |-- libconsole.so.0.0.0
|   |-- libctutils.so.0 -> libctutils.so.0.0.0
|   `-- libctutils.so.0.0.0
`-- share
    |-- consolefonts
    |   |-- LatArCyrHeb-16+.psf.gz
    |   |-- lat1-16.psf.gz
    |   `-- lat1u-16.psf.gz
    `-- keymaps
        `-- i386
            |-- azerty
            |   |-- be-latin1.kmap.gz
            |   `-- fr-latin1.kmap.gz
            |-- include
            |   |-- azerty-layout.inc.gz
            |   |-- backspace.inc.gz
            |   |-- ctrl.inc.gz
            |   |-- euro.inc.gz
            |   |-- keypad.inc.gz
            |   |-- linux-keys-bare.inc.gz
            |   |-- linux-keys-extd.inc.gz
            |   |-- linux-with-alt-and-altgr.inc.gz
            |   |-- linux-with-modeshift-altgr.inc.gz
            |   |-- linux-with-two-alt-keys.inc.gz
            |   |-- mac-linux-keys-bare.inc.gz
            |   |-- qwerty-layout.inc.gz
            |   |-- qwertz-layout.inc.gz
            |   `-- windowkeys.inc.gz
            `-- qwerty
                |-- br-latin1.kmap.gz
                |-- cf.kmap.gz
                |-- de-latin1.kmap.gz
                |-- dk-latin1.kmap.gz
                |-- es.kmap.gz
                |-- fi-latin1.kmap.gz
                |-- gr-utf8.kmap.gz
                |-- hebrew.kmap.gz
                |-- hu101.kmap.gz
                |-- it-xfree.kmap.gz
                |-- jp106.kmap.gz
                |-- no-latin1.kmap.gz
                |-- pl.kmap.gz
                |-- pt-latin1.kmap.gz
                |-- ru.kmap.gz
                |-- se-latin1.kmap.gz
                |-- uk.kmap.gz
                `-- us-latin1.kmap.gz

Si può osservare che: nella directory /opt/nanoLinux/bin/ sono stati copiati i programmi consolechars, kbd_mode e loadkeys; nella directory /opt/nanoLinux/lib/ sono stati collocati i file delle librerie che mancano nel sistema LTSP standard; nella directory /opt/nanoLinux/share/ sono stati messi dei file che generalmente si trovano all'interno di /usr/share/ di un sistema normale.

Tutta questa struttura serve per consentire allo script /opt/nanoLinux/bin/console-setup di configurare la tastiera e lo schermo in modo da gestire la codifica UTF-8:

#!/bin/sh
#
LD_LIBRARY_PATH=/opt/nanoLinux/lib
export LD_LIBRARY_PATH
#
TEMPORARY=/tmp/nanoLinux.tmp
rm -f $TEMPORARY 2> /dev/null
#
/opt/nanoLinux/bin/kbd_mode -u
#
while :
do
echo "
Please select a keyboard map:
 1 Belgium          11 Italian
 2 Brazilian        12 Japanese
 3 Danish           13 Norwegian
 4 Finnish          14 Polish
 5 French           15 Portuguese
 6 French Canadian  16 Russian
 7 German           17 Spanish
 8 Greek            18 Swedish
 9 Hebrew           19 United Kingdom
10 Hungarian        20 USA (default)
"
  echo -n "Enter a number: " 
  read keymap

  if [ ! "$keymap" = "" ]
  then
    case $keymap
    in
    1) /opt/nanoLinux/bin/loadkeys -c -u /opt/nanoLinux/share/keymaps/i386/azerty/be-latin1.kmap.gz
    ;;
    2) /opt/nanoLinux/bin/loadkeys -c -u /opt/nanoLinux/share/keymaps/i386/qwerty/br-latin1.kmap.gz
    ;;
    ...
    ...
    20) /opt/nanoLinux/bin/loadkeys -c -u /opt/nanoLinux/share/keymaps/i386/qwerty/us-latin1.kmap.gz
    ;;
    *)  continue
    ;;
    esac
  else
    exit
  fi
  break
done
#
echo -n -e '\033%G' > `tty`
#
# Font video; default is something that can work with UTF-8, for
# the first code-points, like Latin-1 has.
# Might be: lat1u-16.psf.gz
#           LatArCyrHeb-16.psf.gz
#
# Anyway, before must set up with "lat1u-16.psf.gz", otherwise
# some console might show strange character when coloured.
#
/opt/nanoLinux/bin/consolechars -f /opt/nanoLinux/share/consolefonts/lat1u-16.psf.gz
#
# Now go to the true setting.
#
/opt/nanoLinux/bin/consolechars -f /opt/nanoLinux/share/consolefonts/LatArCyrHeb-16+.psf.gz
#

Questo script deve essere incorporato da /etc/screen.d/telnet e da /etc/screen.d/shell. Ecco l'esempio più semplice di /etc/screen.d/shell:

#!/bin/bash
#
# Fire up a shell on this tty
#
echo "tty=" `tty`
. /opt/nanoLinux/bin/console-setup
exec /bin/bash --login

Ciò che si ottiene è di configurare ogni volta la tastiera in modo molto semplice, attribuendo allo schermo un insieme di caratteri abbastanza generalizzato.

307.8   Riferimenti

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome gestione_e_personalizzazione_dei_terminali_ltsp.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!