[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]

34. Console

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 verrà 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 determinato momento.

Le indicazioni di questo capitolo fanno riferimento particolarmente alle convenzioni stabilite con i kernel 2.2.*. Anche se si utilizzano questi kernel, qualcosa potrebbe non funzionare come previsto, a causa di altri programmi che potrebbero non essere stati adattati alla nuova situazione.

34.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]

Con i nuovi kernel 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 determinato momento:

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 5 e numero secondario 1, mentre in origine si utilizzavano i numeri 4,0, corrispondenti al dispositivo /dev/tty0. Se dovesse essere necessario, si possono creare questi due dispositivi con i comandi seguenti (si comincia dalla cancellazione di quelli vecchi).

rm /dev/console /dev/tty0

mknod -m 600 /dev/console c 5 1

mknod -m 600 /dev/tty0 c 4 0

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

Con i kernel 2.0.*, /dev/console aveva i numeri 4,0, corrispondenti all'attuale /dev/tty0, ovvero alla console virtuale attiva. 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 dalla scheda video 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.

34.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 alla 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. Allo stato attuale, 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 corrisponda 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 appariranno 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

34.3 Usare o non usare la console

È già stato scritto, ma è bene ribadirlo: la console è sempre ospite di 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 corrisponda 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 la direttiva append di LILO, 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, che su un terminale seriale.

L'unico vantaggio di agire in questo modo, potrebbe essere quello di poter avviare il sistema stabilendo all'avvio quale sia la console: attraverso un parametro del kernel passato materialmente al momento dell'avvio, oppure attraverso diverse scelte proposte da LILO o da un altro sistema di avvio.

34.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.

34.4.1 Kernel

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.

34.4.2 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 9600 bps, 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, è il caso di attivare un programma Getty, e 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, come già era stato accennato in precedenza.

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

Quella che si vede sopra è la riga necessaria ad attivare direttamente il terminale connesso con la 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. Allo stato attuale, solo LILO dovrebbe essere in grado di fare questo, attraverso la direttiva serial.

serial=<n-porta-seriale>,<velocità-bps>{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-2.2.1-1
	label=linux
	root=/dev/hda2
	read-only
image=/boot/vmlinuz-2.2.1-1
	label=seriale
	root=/dev/hda2
	append="console=ttyS1,9600"
	read-only
image=/boot/vmlinuz-2.0.36-1
	label=vecchio
	root=/dev/hda2
	read-only

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

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.

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.

---------------------------

Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]