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. |
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.
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 |
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 |
È 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 il login. 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 login 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 ad attivare un login su /dev/console
:
deve essere definito in modo esplicito a cosa corrisponda la console attraverso il parametro del kernel console
;
deve essere aggiunta una riga adatta nel file /etc/inittab
per l'avvio di un programma Getty che utilizzi il dispositivo /dev/console
;
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.
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.
Support for console on virtual terminal ( 12.5.14) y/n Questa funzione può essere attivata o meno, a seconda delle preferenze. Se non la si attiva, si evita che i messaggi del kernel finiscano nella console virtuale attiva, cioè il dispositivo | |
Standard/generic (dumb) serial support ( 12.5.14) Y | |
Support for console on serial port ( 12.5.14) Y |
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 il prompt di avvio 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 il prompt 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 |
Nel momento in cui viene scritto questo capitolo, LILO non funziona bene con le porte seriali se la direttiva |
---------------------------
Appunti Linux 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ evo.it
[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]