MegaLab.it
Stampa Articolo
Aperiodico gratuito di informatica
 
20080829205743

Come aggiungere console virtuali ad un sistema GNU/Linux

a cura di masterz3d
08/01/2010 - articolo
Linux & Open Source - I terminali virtuali, raggiungibili tramite la pressione combinata di Ctrl+Alt e un tasto funzione, nelle distribuzioni standard arrivano in media fino a sei. Con questo semplice metodo è possibile averne fino a 63.

Se non vi siete mai chiesti che cosa fossero quei file chiamati "ttyN" (con N che va da 0 a 63) nella directory /dev, ora potete imparare come usarli.

Nell'articolo dove ho spiegato come dedicare un terminale ai messaggi del kernel, avete visto come muovervi tra i terminali virtuali di Linux. E vi sarete accorti che, se avete viaggiato fino in fondo, avete sei terminali testuali ed un terminale grafico, che ospita X.

Ma quello che io chiamo "terminale grafico" è un terminale esattamente come tutti gli altri, solo usato in modo un po' diverso, pertanto è un terminale virtuale a tutti gli effetti.

Qualche parola sui terminali virtuali

Le teletypewriter (o teletype) erano terminali "concreti", come delle grosse macchine da scrivere, che erano molto usate fin dall'inizio del ventesimo secolo per spedire e ricevere segnali e notizie. Tra le più conosciute c'erano le Flexowriter, costruite fin dagli anni 20, poi acquistate dalla IBM (International Business Machines Corporation) negli anni 30. Queste macchine, per la loro capacità di trasmettere informazioni tra nodi (peer), tra le loro molte eredità lasciarono il nome, poi contratto in tty, che ora viene usato per identificare un "terminale virtuale".

Per la verità il concetto di "terminale virtuale" (o console virtuale) ha bisogno di una suddivisione. Un "terminale virtuale" è un terminale generico, e può essere sia un terminale locale che un terminale remoto. I terminali locali sono dei terminali che consentono di interagire direttamente con la macchina su cui si sta materialmente lavorando. I terminali remoti, invece, sono terminali (intesi anche come computer veri e propri) separati dalla macchina a cui si è connessi, i cui segnali viaggiano attraverso protocolli di rete (TCP/IP, nel caso di ssh o telnet) o seriali (tramite interfacce seriali come minicom o ckermit).

Linux gestisce i terminali locali grazie a dei nodi chiamati ttyN nella cartella /dev, dove risiedono tutti i file di periferica generati dal gestore predefinito (udev per tutte le distribuzioni moderne). N è un numero intero che generalmente va da 0 a 63. Per rendervi conto dell'importanza di questi piccoli file, vi basti sapere che senza i tty avreste solo delle belle schermate nere con un cursore lampeggiante, senza che voi possiate fare nulla per interagire con il kernel.

Come funziona un terminale virtuale con Linux?

È abbastanza semplice. Nelle distribuzioni più diffuse, il kernel Linux, all'avvio del sistema, passa il controllo ad un programma chiamato init che, tra le altre cose, legge un file chiamato /etc/inittab per vedere che cosa fare e quali terminali rendere disponibili, come e a quale processo. Se aprite /etc/inittab potrete trovare delle righe come questa:

c1:12345:respawn:/sbin/agetty 38400 tty1 linux

La riga contiene più termini, divisi da due punti. Nell'ordine:

Se le credenziali sono verificate viene invocata la shell di default relativa all'utente che ha effettuato il login (molto spesso è /bin/bash), che consente il dialogo dell'utente con il sistema. Seguendo lo stesso principio si può sostituire ad agetty un programma qualsiasi, come un demone o direttamente X Window System.

Però noi siamo qui per aumentare il numero di terminali disponibili. E non preoccupatevi per i tasti funzione, esistono più modi per balzare da una console all'altra, qualsiasi numero abbia.

A proposito di tty0

I più attenti avranno notato che, nonostante esistano tty che partano da 0, in inittab vengono utilizzati terminali che partono da 1. La spiegazione è molto semplice: /dev/tty0 è la console corrente, ovvero quella dove state scrivendo. Se vi state chiedendo che differenza abbia tty0 rispetto a qualsiasi altra console, raggiungete un terminale testuale (che NON sia in X) e provate a lanciare il seguente comando:

echo hello > /dev/tty0

In QUALSIASI terminale voi siate, vedrete la scritta hello sullo schermo. tty0 è come una specie di "jolly" tra i terminali, e qualsiasi cosa ci mettiate, ovunque siate, verrà mostrata nel terminale in cui la scrivete.

Quali sono i file da modificare?

Se si tratta solo di aumentare le console virtuali basta modificarne uno, /etc/inittab. Facciamo prima un backup del file in oggetto lanciando il seguente comando:

sudo cp -v /etc/inittab{,.old}

Creerà nella directory /etc un file inittab.old, copia esatta di quello che andremo a modificare. Apriamo poi l'originale con un editor ASCII come gedit, kate, kedit se volete farlo tramite GUI o nano, vi, jed o emacs se lavorate in terminale, ma ricordate sempre di aprirlo con privilegi di root:

sudo gedit /etc/inittab

sudo kedit /etc/inittab

sudo nano /etc/inittab

sudo vi /etc/inittab

... eccetera.

Prima avevo già messo un esempio delle righe che dovremo aggiungere. È possibile che nella vostra distribuzione il file inittab sia pressappoco così:

Inittab.png

Lo scorcio di file evidenzia la sezione dei terminali (qui contrassegnata dal commento TERMINALS). Per aggiungere terminali dovremo andare a modificare questa lista. Basta aggiungere subito sotto una serie di linee come questa:

cX:2345:respawn:/sbin/agetty 38400 ttyN linux

Dove la X indica l'identificatore del terminale (in cX, dove "c" sta per "console"), e N è il numero del terminale tty preso in considerazione. È buona abitudine, ma non obbligatorio, far corrispondere il numero X con il numero N (X=N), più che altro per non causare confusione.

NON mettete tty0 come terminale! Se metterete tty0 come terminale, in una riga qualsiasi, quando riavvierete init potreste ottenere degli effetti spiacevoli, dovuti al fatto che agetty tenta continuamente di prendere possesso, con una richiesta di credenziali, la console dalla quale avete riavviato init.

Ad ogni modo: seguendo le istruzioni precedentemente riportate, è possibile avere fino a 62 terminali, Xorg escluso. Se vogliamo l'interfaccia grafica dobbiamo, per forza di cose, lasciare un posticino per X; basta aggiungere terminali fino ad un numero N minore o uguale a 62, ed il numero N+1 verrà occupato automaticamente da Xorg. Fate però attenzione, perché se riservate tutti e 63 i terminali in inittab X potrà non avviarsi, o comportarsi in modo molto strano (come, ad esempio, "rubare" la tastiera rendendola inutilizzabile). Più avanti nell'articolo spiegherò come configurare i Desktop Manager in modo da permettere loro di ritagliare un terminale per X Window System.

Nella figura mostrata possiamo vedere i numeri delle console andare da 1 a 10: ci sono quindi dieci terminali virtuali disponibili per il login testuale. Ipotizziamo adesso di voler aggiungere altri cinque terminali: il risultato finale sarà il seguente.

Inittab_2.png

Come vedete, è molto semplice, basta ricopiare una riga e incollarla sotto l'ultima, aumentando il numero cX e ttyN di uno ogni volta. Salvate il file ed uscite dall'editor.

In seguito a questa modifica dovremo far rileggere inittab a init con uno dei due seguenti comandi:

telinit q

Oppure

kill -HUP 1

Come balzare da una console all'altra

Un modo per saltare da un terminale all'altro è la solita combinazione di tasti Ctrl+Alt+Fn, con n che va da 1 a 12. Per raggiungere i terminali da 13 a 24, invece, la combinazione cambia, e dovete premere ALTGr+Fn (ALTGr è Alt Grafico, ovvero l'Alt di destra sulla vostra tastiera), dove n è compreso tra 1 e 12. Pensate al fatto che premendo ALTGr è come se partiste dal numero 12 e aggiungeste il numero che specificate con il tasto funzione che scegliete. Quest'ultima combinazione non funziona in X.

Esiste poi il metodo definitivo, che consiste nell'usare Alt+Freccia destra per navigare nei terminali in ordine crescente di identificatore di console (1->2->3->4->...) e Alt+Freccia sinistra per navigare tra essi in ordine decrescente (1<-2<-3<-4<-...). Neanche questa combinazione funziona in X.

E per ultimo, esiste un programmino, chiamato chvt (change virtual terminal), molto semplice da usare, che permette di saltare dal primo all'ultimo terminale in un attimo. Ad esempio, se siete in un terminale qualsiasi e volete andare all'istante in tty63 lanciate il seguente comando:

chvt 63

Chvt può essere usato da qualsiasi terminale, anche all'interno di X. Tuttavia all'interno di X funziona solo da root, quindi nel caso lo vogliate usare in X e siate utenti normali dovete anteporre sudo alla chiamata di chvt. Inoltre, se tentate di attivare terminali inesistenti (per esempio, un tty127), darà errore di attivazione di terminale (VT_ACTIVATE).

Andiamo avanti!

Ora passiamo a modificare un file opzionale, che però può essere molto utile se volete migliorare, almeno di un po', la sicurezza del vostro sistema.

Un po' di sicurezza: /etc/securetty

Esiste un file di configurazione un po' speciale. Si chiama securetty e risiede in /etc, come il suo parente inittab.

Nota: /etc/securetty potrebbe non esistere. In questo caso, se non volete modificare null'altro, potete passare direttamente alla prossima pagina dell'articolo. Altrimenti potete creare il file e impostarlo come in figura, per poi modificarne i permessi in questo modo:

sudo chown 0:0 /etc/securetty

sudo chmod 0600 /etc/securetty

Esso contiene tutti i terminali in cui l'utente root può accedere. I più attenti si saranno già accorti che le differenze nelle liste di terminali in inittab e securetty possono negare l'accesso a root in determinate console virtuali. securetty serve proprio a questo: di tutti i terminali disponibili elencati in inittab, l'utente root può effettuare il login solo da quelli presenti in securetty. Sapendo questo potete facilmente rimuovere terminali da securetty e lasciarne uno solo, ad esempio, per aumentare la sicurezza del vostro sistema. securetty può essere letto e modificato solo da root.

Se volete modificarlo e non intendere correre rischi, fate la solita copia di backup con

sudo cp -v /etc/securetty{,.old}

Questo è uno scorcio di securetty.

Securetty_2.png

È esattamente quello che sembra: una semplice lista di terminali. L'utente root potrà accedere da tutti e soli i terminali elencati qui, che siano terminali locali o seriali. I terminali remoti via TCP/IP sono gestiti in un altro modo, che dipende dal programma usato per la connessione all'host. securetty non vale per il terminale in cui viene caricato X.

Ricordate però che i terminali seriali vanno impostati in securetty nella macchina in cui avviene l'accesso, non nella macchina da cui avviene l'accesso. Semplificando, dovete abilitare/disabilitare il terminale nella macchina di destinazione.

Per chiudere questa breve parentesi, ricordate che l'aggiunta di terminali in securetty è assolutamente opzionale. Potrei comunque consigliare di mettere qui dentro meno terminali possibile per evitare accessi indesiderati.

A differenza di inittab, questo file non richiede il riavvio di init per essere riletto: le modifiche entrano in azione al prossimo login effettuato sui terminali non inclusi nella lista. Volendo potete modificare soltanto questo per un piccolo "boost" di sicurezza.

Nota: il comando sudo continuerà a funzionare nei terminali esclusi. securetty non impedisce l'elevazione di privilegi. Sotto un certo punto di vista questo può essere visto come un "buco" nella sicurezza, ma non lo è se il file /etc/sudoers viene configurato nel modo giusto. Ma questa è un'altra storia.

Configurare il server X

Adesso dobbiamo configurare il server X, altrimenti potrebbe fare le bizze, come rendere la tastiera inutilizzabile. E senza tastiera è un po' come essere senza terminali, e l'unica cosa che si può fare è riavviare il sistema usando il tasto di reset, o quello dell'accensione... non è una bella prospettiva. Se una distribuzione è costruita bene, all'aumentare dei terminali il server X si sistemerà da solo nel primo terminale libero, ma se in fase di evocazione di X viene forzato un terminale potrebbero succedere proprio cose come questa.

Però la colpa di tutto è solo del Desktop Manager, che evoca X e gli dice dove andare e cosa fare. Quindi dobbiamo controllare i file di configurazione dei desktop manager. Tratterò i desktop manager più diffusi: kdm, gdm e xdm.

Configurare i Desktop Manager

Alla luce di quello che abbiamo fatto finora stiamo cambiando l'ordine dei terminali... e se anche X utilizza un terminale, sebbene libero, va da sé che tutti i Desktop Manager debbano essere modificati per non mettere i bastoni fra le ruote alle console testuali elencate in inittab.

gdm

Il file di configurazione di gdm che ci interessa sta in /usr/share/gdm e si chiama defaults.conf.

Defaults_conf.png

Fate il solito backup:

sudo cp -v /usr/share/gdm/defaults.conf{,.old}

La parte utile consta di due sole opzioni:

FirstVT=<numero>

VTAllocation=<true|false>

Modificate queste due righe possiamo tornare sui nostri passi.

kdm

L'unico file da modificare si chiama kdmrc e di solito si trova nella directory /etc/kde/kdm, o /etc/kde3/kdm, o /etc/kde4/kdm. Se non è in /etc può essere trovato in /usr/share/config/kdm.

Kdmrc.png

Ne facciamo una copia di sicurezza prima di procedere:

sudo cp -v /usr/share/config/kdm/kdmrc{,.old}

E la righe da prendere in considerazione è una sola: ServerVTs, nella sezione General. I terminali in lista vengono aperti da kdm; se sono preceduti da un segno negativo (-7, per esempio) vengono utilizzati solo se sono liberi. Di conseguenza mettere il numero di un terminale senza segno negativo (7) significa forzare quel terminale ad ospitare X. Questo può portare a problemi di interazione con X stesso.

ServerVTs è una lista di ID di terminali utilizzati da X. È opportuno fissare il numero giusto in cui kdm va a posizionare X, che non vada a coincidere con nessun ID di console fissato in inittab. I numeri possono essere anche negativi, nel qual caso xdm ne prenderà il valore assoluto.

Se ServerVTs è omessa xdm tenterà di fissare X nel primo terminale disponibile; se vengono specificati terminali già usati kdm non allocherà il terminale per X e ritornerà al terminale chiamante.

xdm

La configurazione di xdm è la più semplice: dovete solo andare a cercare il file /etc/X11/xdm/Xservers.

Xservers.png

Fate il solito backup:

sudo cp -v /etc/X11/xdm/Xservers{,.old}

Apritelo in scrittura come utente root e controllate la seguente riga:

:0 local /usr/bin/X :0 vtXX

Dovete rimuovere, se esiste, l'opzione vtXX (dove XX è un numero intero), lasciando che xdm allochi il primo terminale disponibile, oppure fissare un terminale in cui xdm carichi X. Per esempio, volendo allocare il terminale numero 20 per X basta modificare la riga nel modo seguente:

:0 local /usr/bin/X :0 vt20

Se sceglierete quest'ultima opzione dovrete aver cura di tralasciare in /etc/inittab il terminale 20, oppure controllare in inittab i terminali in lista e mettere in Xservers una console non ancora utilizzata.

Troubleshooting: cosa fare se X vi "ruba" la tastiera

Accorgersene è semplice: avete la schermata di login di X davanti a voi e non riuscite ad interagire tramite tastiera, ma solo con il mouse. Questo è un bel problema: senza tastiera non potete neppure dire al sistema di riavviarsi...

... e purtroppo l'unica cosa che si può fare è premere una volta sul tasto di spegnimento sperando che Linux sia compilato con il supporto APM di spegnimento pulito, evitando così di fare un check dei filesystem al prossimo riavvio. Il caso peggiore è dover fare un reset "a freddo", con possibile rischio di perdita di dati nei filesystem.

Però c'è una piccola soluzione che si può provare per evitare inconvenienti come questo: se non siete sicuri al 100% delle modifiche che avete appena fatto potete tentare di avviare il Desktop Manager con il seguente comando:

xdm; sleep 10; killall xdm

Sostituite a xdm il vostro desktop manager, che può essere gdm o kdm. Subito dopo l'avvio ci sarà un periodo di 10 secondi durante il quale potrete provare a vedere se la tastiera è funzionante nella schermata di login di X.

Scaduto il tempo, qualunque sia l'esito del test, il desktop manager verrà terminato e verrete riportati nel terminale di evocazione, dove potrete avviare definitivamente il DM se il test sarà andato a buon fine, o tornare a controllare i file di configurazione altrimenti.

Consultare il log dei Desktop Manager

Come ultima spiaggia potete sempre consultare i messaggi dei Desktop Manager, conservati nella directory /var/log.

In questi file potete trovare tutto ciò che è stato fatto, o anche solo tentato, dal DE che avete chiamato. Generalmente, se è successo qualcosa di poco chiaro, potete filtrare delle determinate righe con uno dei seguenti comandi:

Sostituite a <logfile> il file di log del vostro Desktop Manager.

L'unico log cui dovete prestare attenzione è il log di gdm: il primo carattere è un due punti, e il due punti è un carattere di servizio in bash. Dovete quindi dire a bash che i due punti fanno parte del nome del file, facendoli precedere da un backslash:

grep "WW" /var/log/\:0.log

... così per qualsiasi cosa decidiate di fare con nomi di file che contengono caratteri speciali (come virgole, apostrofi, due punti, trattini, tilde, punti e virgola)...

Considerazioni finali

Lavorando con i terminali potreste comprendere che le potenzialità di GNU/Linux sono molto più elevate di quanto possiate credere soltanto utilizzando la GUI. Un vero sistema multitasking e multiutente come Linux permette molto di più: immaginate quello che potete fare con un solo terminale, e moltiplicatelo per tutti i terminali che avete abilitato, magari con più utenti.

In una console fate una compilazione, in un altro codificate un video, in un altro ascoltate musica, in un altro ancora modificate un file di testo... da un certo punto di vista possono essere visti come le finestre di Windows, e vi potreste chiedere come mai digitare comandi complicati da tastiera quando c'è un comodo mouse a portata di clic.

Però sappiate sempre che ci sono persone come me, che con il mouse tendono a fare poco e nulla e che non si trovano bene a navigare nel filesystem attraverso una finestra. Potrà sembrarvi complicato, difficile o immotivato, ma in fin dei conti sono solo due modi di pensare differenti, ed ecco che chi pensa "attraverso la tastiera" potrebbe trovare molto più comodo avere un terminale in più... piuttosto che una finestra in più.

Cosa fare se avete Upstart

Upstart sta gradualmente sostituendo sysvinit nella gestione delle applicazioni in distribuzioni Ubuntu. Il problema è che tutto quello che avete letto fino adesso sull'implementazione di terminali supplementari non vale con Upstart, soprattutto per il fatto che upstart non usa inittab. Ma esiste comunque un modo per aggiungere terminali, e forse è anche più semplice.

/etc/event.d

Upstart utilizza la directory /etc/event.d per gestire eventi ed applicazioni. Entrateci con

cd /etc/event.d

E con un ls vedrete una lista di file, tra cui una serie di tty. Per abilitare ulteriori terminali basta copiare uno dei tty qualsiasi (tranne tty1, usato dal superuser per manutenzioni straordinarie) e modificarne poche cose.

Ad esempio, se volete aggiungere tre terminali (tty7, tty8, tty9) a quelli già esistenti basta che ricopiate tty6 tre volte modificandone il nome, e ne cambiate i terminali che aprono:

for num in 7 8 9; do cp tty6 tty${num}; sed -i "s@tty6@tty${num}@g" tty${num}; done

Quindi verificate i contenuti dei file facendo un semplice cat per uno di essi, per esempio:

cat tty8

Dovreste vedere delle righe come le seguenti:

Upstart_tty8.pngAssicuratevi semplicemente che i nomi dei terminali nei file corrispondano al nome del file stesso.

Al termine delle modifiche avete due scelte: riavviate il computer oppure ricaricate lo stesso runlevel che stavate utilizzando fino a quel momento con questo comando:

sudo telinit $(runlevel | cut -d' ' -f2)

e renderete effettivi i terminali che avete aggiunto. Subito dopo è opportuno uscire in un terminale Testuale (Ctrl+Alt+F1) e arrestare il desktop manager che state usando (molto probabilmente gdm):

sudo killall gdm; sleep 3; gdm

per permettergli di prendere possesso del terminale successivo all'ultimo implementato. Nel caso doveste avere problemi con Gdm, xdm o kdm potete tornare ad una delle pagine precedenti e apportare le rispettive modifiche ai loro file di configurazione.

Modificare console-setup

Alcuni utenti in Internet suggeriscono di modificare un piccolo file di configurazione residente in /etc/defaults, che si chiama console-setup e contiene la riga ACTIVE_CONSOLES. Potete leggerla con questo comando:

grep -i active_consoles /etc/defaults/console-setup

Il suo valore di default dovrebbe essere ACTIVE_CONSOLES="/dev/tty[1-6]". Potete aprire un editor grafico come gedit e modificarlo direttamente in GNOME:

sudo gedit /etc/defaults/console_setup

E modificate la variabile ACTIVE_CONSOLES in "/dev/tty[1-X]", dove X è il valore massimo dei terminali abilitati, sempre ricordando che non possono essercene più di 63. Se ne avete creati tre nuovi, tty7, tty8 e tty9 il valore di X sarà 9.

Personalmente, nelle prove che ho fatto avevo abilitato nuovi terminali in /etc/event.d e, sebbene non avessi "dichiarato" i nuovi terminali in ACTIVE_CONSOLES non ho sperimentato alcun problema. Semmai voi doveste averne, basta che ricordiate che questa variabile esiste, dove trovarla e come modificarla.

MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .

Copyright 2008 MegaLab.it - Tutti i diritti sono riservati