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


Capitolo 118.   Console nei sistemi GNU/Linux

In questo capitolo si fa ampiamente riferimento a concetti legati ai file di dispositivo e alle loro caratteristiche definite in base al numero primario e secondario. Questo argomento viene trattato in un altro capitolo; per il momento, il lettore in difficoltà dovrebbe cercare soltanto di intuire il senso della cosa.

Nei sistemi Unix, la console è il terminale principale e come tale ha un ruolo fondamentale. Generalmente, con GNU/Linux non si avverte questo particolare perché la gestione normale delle console virtuali fa sì che la «console» sia semplicemente quella console virtuale che si adopera in un momento determinato.

118.1   Console vera e propria e console virtuali

Per fare un po' di chiarezza tra console e console virtuali, è bene dare un'occhiata ai file di dispositivo.

ls -l /dev/console /dev/tty /dev/tty[0-9][Invio]

Con i kernel Linux 2.2.*, sono stati modificati i numeri primario e secondario di alcuni dispositivi. Attualmente, il risultato dovrebbe essere quello che segue, tenendo conto che la proprietà e i permessi cambiano in funzione dell'uso che si sta facendo in un momento determinato:

crw-------   1 root     root       5,   1 mag  5  1998 /dev/console
crw-rw-rw-   1 root     root       5,   0 mag  5  1998 /dev/tty
crw-------   1 root     root       4,   0 mag  5  1998 /dev/tty0
crw-------   1 root     root       4,   1 mag  5  1998 /dev/tty1
crw-------   1 root     root       4,   2 mag  5  1998 /dev/tty2
crw-------   1 root     root       4,   3 mag  5  1998 /dev/tty3
crw-------   1 root     root       4,   4 mag  5  1998 /dev/tty4
crw-------   1 root     root       4,   5 mag  5  1998 /dev/tty5
crw-------   1 root     root       4,   6 mag  5  1998 /dev/tty6
crw-------   1 root     root       4,   7 mag  5  1998 /dev/tty7
crw-------   1 root     root       4,   8 mag  5  1998 /dev/tty8
crw-------   1 root     root       4,   9 mag  5  1998 /dev/tty9

Si osservi prima di tutto che il dispositivo /dev/console ha numero primario cinque e numero secondario uno, mentre in origine si utilizzavano i numeri 4,0, corrispondenti al dispositivo /dev/tty0. Se dovesse essere necessario, si possono creare questi due file di dispositivo con i comandi seguenti (si comincia dalla cancellazione di quelli vecchi).

rm /dev/console /dev/tty0[Invio]

mknod -m 600 /dev/console c 5 1[Invio]

mknod -m 600 /dev/tty0 c 4 0[Invio]

Osservando i numeri primario e secondario dell'elenco mostrato, si comprende meglio lo scopo di questi file di dispositivo. I file di dispositivo /dev/tty1, /dev/tty2,... rappresentano ognuno una console virtuale; il file di dispositivo /dev/tty0 rappresenta quella attiva, mentre /dev/tty rappresenta il terminale attivo, in senso più ampio.

Con i kernel 2.0.*, /dev/console ha i numeri 4,0, corrispondenti a /dev/tty0 (ovvero alla console virtuale attiva) nei kernel successivi. La console è il terminale principale di un sistema, quello su cui devono apparire i messaggi di sistema più importanti e quello che viene usato dai programmi in mancanza d'altro. Quando GNU/Linux poteva gestire esclusivamente console rappresentate dalla tastiera dell'elaboratore e dall'adattatore grafico tradizionale, era corretto considerare /dev/console un modo alternativo di identificare la console virtuale attiva; ma all'estendersi delle possibilità di GNU/Linux, diventa importante poter definire espressamente a cosa corrisponda tale dispositivo.

118.2   Definizione esplicita della console

Se non viene specificato diversamente, la console, cioè il dispositivo /dev/console, corrisponde semplicemente alla prima unità in grado di assolvere allo scopo; nella maggior parte dei casi si tratta della console virtuale attiva in un certo momento.

Non esistendo un'unità fisica corrispondente univocamente alla console, questa può essere soltanto associata a un altro dispositivo esistente, come una console virtuale o un altro tipo di terminale. Con i kernel ≥ 2.2.* è possibile abbinare la console alla console virtuale attiva, a una console virtuale specifica o a una linea seriale. Per questo si interviene con un parametro del kernel.

console=dispositivo[,opzioni]

Al parametro console può essere abbinato il dispositivo a cui si vuole fare riferimento, senza aggiungere il percorso (/dev/) e, se necessario, possono essere aggiunte altre opzioni che riguardano la velocità, la parità e il numero di bit. Per esempio, il parametro console=tty10, fa in modo che la decima console virtuale sia anche la console vera e propria.

Utilizzando il parametro console, si stabilisce a cosa corrisponde il dispositivo /dev/console. Dipende dai programmi il fatto che tale dispositivo venga utilizzato o meno. In generale, questo significa che i messaggi più importanti appaiono lì; niente di più.

Se si avvia il kernel attraverso LILO, il parametro può essere fornito attraverso la direttiva append, come si vede nell'esempio seguente:

image=/boot/vmlinuz-2.1.131-1
        label=linux
        root=/dev/hda4
        append="console=tty10"
        read-only

Con GRUB si può inserire il parametro in coda all'istruzione kernel:

kernel (hd0,5)/boot/vmlinuz-2.4.2 root=/dev/hda6 console=tty12 ro

118.3   Usare o non usare la console

È già stato scritto, ma è bene ribadirlo: la console è sempre ospitata da un altro terminale identificato in modo più preciso. Generalmente, /dev/console serve solo per avere un riferimento: il dispositivo a cui mandare i messaggi più importanti, contando che questi siano letti dall'interessato. In pratica, stando così le cose, il dispositivo /dev/console viene aperto sempre solo in scrittura per visualizzare qualcosa e mai, o quasi, per ricevere un inserimento dati da tastiera. Se poi la console corrisponde a un terminale su cui si sta lavorando normalmente, i messaggi diretti a questa servono per disturbare l'utente confondendogli il contenuto dello schermo.

Per poter interagire con un terminale qualunque, di solito si interviene nel file /etc/inittab, specificando l'avvio di un programma Getty abbinato a un dispositivo di terminale determinato. Si osservi l'esempio:

...
1:12345:respawn:/sbin/getty tty1
2:2345:respawn:/sbin/getty tty2
3:2345:respawn:/sbin/getty tty3
4:2345:respawn:/sbin/getty tty4
5:2345:respawn:/sbin/getty tty5
6:2345:respawn:/sbin/getty tty6
...

Questo è già stato descritto nel capitolo precedente: si tratta dell'attivazione delle prime sei console virtuali, in modo che da quelle possa essere eseguito l'accesso. Tutte le altre console virtuali esistono ugualmente, solo che da quelle non si può fare nulla, a meno di «scriverci» inviando dei messaggi, oppure di utilizzare un programma che ci faccia qualcosa d'altro.

Se la console vera e propria viene abbinata a una console virtuale «libera», quello che si ottiene è di mandare lì i messaggi diretti alla console, così da non disturbare l'utente che sta usando una console virtuale; ma per il momento, questo non significa che la console venga utilizzata anche per accedere. Ma allora, si può accedere attraverso /dev/console? Sì, solo che non conviene, perché la console è sempre ospite di un altro tipo di terminale, per cui è meglio attivare un accesso su quel terminale, piuttosto che sulla console generica.

A titolo di esempio, ribadendo che non si tratta di una buona idea, si elencano i passi necessari per poter attivare un accesso su /dev/console:

  1. deve essere definito in modo esplicito a cosa corrisponde la console attraverso il parametro del kernel console;

  2. deve essere aggiunta una riga adatta nel file /etc/inittab per l'avvio di un programma Getty che utilizzi il dispositivo /dev/console;

  3. deve essere rimosso il file /etc/ioctl.save generato da Init, in quanto contiene l'impostazione iniziale di stty che la prima volta potrebbe essere incompatibile con le caratteristiche della connessione seriale.

Per definire che la console è abbinata a un dispositivo di terminale determinato, si può utilizzare il parametro del kernel console, come è già stato mostrato; per l'attivazione del programma Getty si può aggiungere la riga seguente al file /etc/inittab.

7:12345:respawn:/sbin/getty console DT19200 vt100

Viene utilizzato proprio il programma getty, con delle opzioni di compromesso, in modo da poter funzionare sia su una console virtuale di GNU/Linux, sia su un terminale seriale.

L'unico vantaggio di agire in questo modo, potrebbe essere quello di consentire l'avvio del sistema stabilendo di volta in volta quale sia la console attraverso un parametro del kernel.

118.4   Console su un terminale seriale

Prima di poter attivare una console su un terminale seriale occorre essere in grado di attivare un terminale seriale normale. Per questo è indispensabile leggere il capitolo precedente e probabilmente occorre anche attendere la lettura di altri capitoli dedicati alle connessioni seriali. L'argomento è quindi prematuro, ma serve per completare la discussione sulle problematiche riferite all'uso della console.

Per la gestione di una console su un terminale seriale occorre che il kernel sia stato predisposto per questo: sia per la gestione delle porte seriali, sia la gestione della console su terminale seriale (sezione 72.2.16).

118.4.1   Configurazione

L'abbinamento della console a un terminale seriale non ha nulla di complicato: basta utilizzare il parametro console, indicare il dispositivo seriale opportuno e la velocità di trasmissione. Gli esempi seguenti sono equivalenti.

console=ttyS1,9600

console=ttyS1,9600n8

L'opzione 9600n8 rappresenta la velocità a 9 600 bit/s, l'assenza di parità (n) e la dimensione a 8 bit. In particolare, la parità potrebbe essere espressa attraverso altre lettere:

Questo basta a fare in modo che il terminale (configurato opportunamente secondo le stesse caratteristiche) connesso alla porta seriale specificata (nell'esempio è /dev/ttyS1, cioè la seconda porta seriale) sia in grado di funzionare in qualità di /dev/console.

Le caratteristiche della connessione seriale che possono essere configurate sono molto poche. In particolare, è importante osservare che si sottintende un controllo di flusso hardware (RTS/CTS), per cui il cavo seriale utilizzato deve essere completo.

Se si vuole fare qualcosa di più della semplice visualizzazione dei messaggi emessi e destinati alla console, è necessario attivare un programma Getty, ma in tal caso bisogna stabilire se si vuole fare riferimento al terminale seriale effettivo, o alla console generica. Qualunque sia la scelta, si deve intervenire nel file /etc/inittab.

7:12345:respawn:/sbin/getty ttyS1 DT9600 vt100

Quella che si vede sopra è la riga necessaria ad attivare direttamente il terminale connesso alla seconda porta seriale; l'esempio successivo riguarda invece la console generica.

7:12345:respawn:/sbin/getty console DT9600 vt100

Se la console seriale deve poter sostituire completamente il video e la tastiera dell'elaboratore, è necessario rendere consapevole di questo anche il sistema di avvio di GNU/Linux, in modo che l'invito di avvio (il bootprompt) appaia sul terminale giusto. LILO è in grado di farlo attraverso la direttiva serial:

serial=n_porta_seriale,velocità{n|o|e}dimensione

Questa direttiva va collocata nella sezione globale, come si vede dall'esempio.

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
serial=1,9600n8
image=/boot/vmlinuz
        label=linux
        root=/dev/hda2
        read-only
image=/boot/vmlinuz
        label=seriale
        root=/dev/hda2
        append="console=ttyS1,9600"
        read-only

La direttiva serial=1,9600n8 stabilisce che LILO deve presentare l'invito sul terminale connesso alla seconda porta seriale (/dev/ttyS1), utilizzando una velocità di 9 600 bit/s, senza parità e con una dimensione di 8 bit, esattamente come specificato nella direttiva append nel caso dell'etichetta seriale.(1)

GRUB ha una direttiva simile:

serial --unit=n_porta_seriale --speed=velocità [--dumb]

In questo modo si può definire la porta seriale e la velocità, dove rimane implicito il fatto che si usino byte interi senza parità. In particolare, GRUB prevede che si tratti di un terminale compatibile con lo standard VT100; se le cose non fossero così, si può inserire l'opzione --dumb, come si vede nel modello sintattico.

Tuttavia, la direttiva indicata serve solo a definire l'esistenza di un terminale aggiuntivo, attraverso la porta seriale. Per attivare effettivamente il suo utilizzo, è necessaria la direttiva terminal:

terminal serial [console]

Con terminal serial si stabilisce l'uso del terminale seriale come console per l'avvio; se si aggiunge anche la parola chiave console, si fa in modo di consentire la scelta: è sufficiente premere un tasto sul terminale scelto per selezionare implicitamente la console ai fini dell'uso di GRUB. Segue un esempio completo del file di configurazione di GRUB:

default 0
timeout 5

title Console su terminale seriale
kernel (hd0,5)/boot/vmlinuz root=/dev/hda6 console=ttyS1,9600 ro
serial --unit=1 --speed=9600
terminal serial

title Console normale
kernel (hd0,5)/boot/vmlinuz root=/dev/hda6 ro

Prima di provare l'uso di una console seriale, occorre essere certi che il terminale seriale funzioni, attraverso programmi come Minicom, anche attivando semplicemente il terminale senza attribuirgli il livello di console. Infine, è importante cancellare il file /etc/ioctl.save prima di provare.

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


1) Nel momento in cui viene scritto questo capitolo, LILO non funziona bene con le porte seriali se la direttiva append è troppo lunga. Per questo, negli esempi si è evitato di specificare la parità e la lunghezza, lasciando che vengano presi in considerazione i valori predefiniti.


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

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

Valid ISO-HTML!

CSS validator!