14.1 Getty (usato in / etc / inittab)
Introduzione a Getty
Per fare in modo che un processo di login venga eseguito su una porta seriale (e il terminale ad esso collegato) all'avvio del computer (o commuti i livelli di esecuzione), un comando getty deve essere inserito nel file / etc / inittab. L'esecuzione di getty dalla riga di comando può causare problemi (vedere Se getty viene eseguito dalla riga di comando: I programmi vengono arrestati per vedere perché). Getty ottiene un TTY (un terminale) attivo. Ogni terminale ha bisogno del proprio comando getty. C'è anche almeno un comando getty per la console in ogni file / etc / inittab. Trovalo e metti i comandi getty per i veri terminali accanto ad esso. Questo file può contenere linee getty di esempio per terminali di testo che sono commentati in modo che tutto ciò che devi fare è decommentarli (rimuovere il numero iniziale) e modificare alcuni argomenti.
Gli argomenti consentiti dipendono da quale getty usi:Due gettys migliori per i terminali collegati direttamente sono: Due gettys migliori per i modem dial-in (evitare per i terminali collegati direttamente) sono: Semplice da utilizzare se non si utilizza un vero terminale di testo. La maggior parte degli utenti Linux usa uno di questi sul proprio monitor: La tua distribuzione Linux può venire con ps_getty o agetty per terminali di testo. Alcune distribuzioni non forniscono né. Sfortunatamente, spesso lo chiamano semplicemente "getty", quindi potrebbe essere necessario determinare quale si ha dal momento che gli argomenti che hai inserito in / etc / inittab differiscono. Debian usa agetty (nel pacchetto util-linux). RedHat e Fedora hanno usato ps_getty che è in: ps_getty Come ultima risorsa per cercare di determinare quale getty hai, puoi controllare il suo codice eseguibile (di solito in / sbin). ps_getty ha / etc / gettydefs incorporato in questo codice. Per cercarlo, vai su / sbin e digita:stringhe getty | grep getty Se getty è effettivamente agetty, quanto sopra non porterà a nulla. Tuttavia se hai una digitazione agetty:getty -hdovrebbe mostrare le opzioni -hiLmw. Se non hai il getty che vuoi controlla altre distribuzioni e il alieno programma per convertire tra pacchetti RPM e Debian. Il codice sorgente può essere scaricato da Getty Software. Se non si utilizzano le linee di controllo del modem (ad esempio se si utilizza solo il numero minimo di 3 conduttori: trasmissione, ricezione e massa del segnale comune) si dovrebbe consentire a getty di conoscerlo utilizzando un flag "locale". Il formato di questo dipende da quale getty si usa. Dopo l'accesso noterai (usando "top", "ps -ax" o "ptree") che il processo getty non è più in esecuzione. Cosa gli è successo? Perché getty si riavvia di nuovo se la shell viene uccisa? Ecco perché. Dopo aver digitato il tuo nome utente, getty lo prende e chiama il programma di accesso indicando il tuo nome utente. Il processo getty viene sostituito dal processo di accesso. La procedura di accesso richiede la password, la controlla e avvia qualsiasi processo specificato nel file di password. Questo processo è spesso la shell bash. In tal caso, bash inizia e sostituisce la procedura di accesso. Si noti che un processo sostituisce un altro e che il processo shell bash originariamente avviato come processo getty. Le implicazioni di ciò saranno spiegate di seguito. Ora nel file / etc / inittab, getty dovrebbe rinascere (restart) se ucciso. Lo dice sulla linea che chiama getty. Ma se la shell bash (o il processo di login) viene uccisa, getty respawns (riavvia). Perché? Bene, sia il processo di login che bash sono rimpiazzi per getty ed ereditari * Indice terminale di testo le connessioni del segnale stabiliscono dai loro predecessori. Infatti, se si osservano i dettagli, si noterà che il processo di sostituzione avrà lo stesso ID processo del processo originale. Quindi bash è una sorta di getty mascherata con lo stesso numero ID di processo. Se bash viene ucciso, è come se getty fosse stato ucciso (anche se getty non è più in esecuzione). Ciò comporta il respawning di getty. Quando si esegue il logout, tutti i processi su quella porta seriale vengono uccisi inclusa la shell bash. Ciò può anche accadere (se abilitato) se un segnale di blocco viene inviato alla porta seriale da una caduta di tensione DCD dal modem. O il logout o il drop in DCD provocheranno il respawning di getty. Si può forzare getty a rinascere uccidendo manualmente bash (o login) premendo il tasto k, ecc. Mentre si è in "top" o con il comando "kill". Probabilmente dovrai ucciderlo con il segnale 9 (che non può essere ignorato). Dovresti normalmente eseguire getty dall'interno / Etc / inittab e non dalla riga di comando, altrimenti alcuni programmi in esecuzione sul terminale potrebbero essere sospesi inaspettatamente (arrestati). Ecco perché (vai alla sezione successiva se il perché non è importante per te). Se si avvia getty per dire ttyS1 dalla riga di comando di un altro terminale, ad esempio tty1, allora avrà tty1 come "terminale di controllo" anche se il terminale effettivo su cui gira è ttyS1. Quindi ha il terminale di controllo sbagliato. Ma se è avviato all'interno del file inittab, avrà ttyS1 come terminale di controllo (corretto). Anche se il terminale di controllo è sbagliato, il login su ttyS1 funziona bene (dato che hai dato ttyS1 come argomento a getty). Lo standard input e output sono impostati su ttyS1 anche se il terminale di controllo rimane tty11. Altri programmi eseguiti su ttyS1 possono ereditare questo input / output standard (che è connesso a ttyS1) e tutto è OK. Ma alcuni programmi possono commettere l'errore di provare a leggere dal loro terminale di controllo (tty1) che è sbagliato. Ora tty1 potrebbe pensare che questi programmi vengano eseguiti in background da tty1, quindi un tentativo di leggere da tty1 (dovrebbe essere ttyS1) provoca l'arresto del processo che ha tentato di leggere. (Un processo in background non è autorizzato a leggere dal suo terminale di controllo.). Potresti vedere un messaggio come: "1 + fermato"sullo schermo, a questo punto sei bloccato perché non puoi interagire con un processo che sta tentando di comunicare con te tramite il terminale sbagliato. Ovviamente per uscire da questo puoi andare su un altro terminale e uccidere il processo, ecc. . Una riga di esempio in / etc / inittab:
S1 è di ttyS1. 23 significa che getty viene eseguito entrando nei livelli di esecuzione 2 o 3. respawn significa che se getty (o un processo che lo ha sostituito come bash) viene ucciso, getty si riavvierà automaticamente (respawn) di nuovo. / sbin / getty è il comando getty. Il -L indica Locale (ignora i segnali di controllo del modem). -h (non mostrato nell'esempio) abilita il controllo del flusso hardware (come per gli stty crtscts). 19200 è il baud rate. ttyS1 significa / dev / ttyS1 (COM2 in MS-DOS). vt102 è il tipo di terminale e questo getty imposterà la variabile d'ambiente TERM a questo valore. Non ci sono file di configurazione. Digitare "init q" sulla riga di comando dopo aver modificato getty e si dovrebbe vedere un prompt di login. Il agetty il programma tenterà di rilevare automaticamente il set di parità all'interno del terminale (inclusa nessuna parità). Non supporta byte di dati a 8 bit più parità a 1 bit. Vedi byte dati a 8 bit (più parità). Se usi stty per impostare la parità, agetty lo disinserirà automaticamente poiché inizialmente vuole che il bit di parità arrivi come se fosse un bit di dati. Questo perché ha bisogno di ottenere l'ultimo bit (possibilmente un bit di parità) mentre si digita il nome di accesso in modo che possa rilevare automaticamente la parità. Quindi se usi la parità, abilitala solo all'interno del terminale di testo e lascia agetty rilevarlo automaticamente e impostarlo sul computer. Se il tuo terminale supporta la parità ricevuta, il prompt di accesso apparirà confuso finché non scrivi qualcosa in modo che getty possa rilevare il parità. Il prompt incomprensato scoraggerà i visitatori, ecc. Dal tentativo di accesso. Potrebbe essere proprio quello che vuoi. A volte c'è un problema con il rilevamento automatico della parità. Questo accade perché dopo aver digitato per primo il nome di accesso, agetty inizia il accesso programma per terminare l'accesso. Sfortunatamente, il accesso il programma non può rilevare la parità, quindi se il getty il programma non è riuscito a determinare la parità allora accesso non sarà in grado di determinarlo neanche. Se il primo tentativo di accesso fallisce, accesso ti consentirà di riprovare, ecc. (tutti con il set di parità errato). Alla fine, dopo un numero di tentativi falliti di accesso (o dopo un timeout) agetty si riavvierà e avvierà di nuovo le sequenze di accesso. Una volta che getty è di nuovo in esecuzione, potrebbe essere in grado di rilevare la parità al secondo tentativo, in modo che tutto funzioni correttamente. Con la parità errata, il accesso il programma non può leggere correttamente quello che scrivi e non puoi accedere. Se il tuo terminale supporta la parità ricevuta, continuerai a vedere uno schermo confuso. Se getty non riesce a rilevare la parità, un file / etc / issue viene di solito scaricato sullo schermo poco prima del prompt, quindi sullo schermo potrebbero apparire parole più confuse. Perché non è possibile rilevare agevolmente la parità con la prima lettera digitata? Ecco un esempio: Supponiamo che rilevi un byte di 8 bit con il suo bit di parità 0 (bit di ordine superiore) e con un numero dispari di 1 bit. Che parità è? Bene, il numero dispari di 1 bit implica che è una parità dispari. Ma potrebbe anche essere solo un personaggio a 8 bit senza parità. Non c'è modo finora di determinare quale. Ma finora abbiamo eliminato la possibilità di parità pari. Il rilevamento della parità procede quindi per un processo di eliminazione. Se il byte successivo digitato è simile al primo ed elimina anche solo la possibilità di parità pari, è ancora impossibile determinare la parità. Questa situazione può continuare indefinitamente e in rari casi l'accesso fallirà fino a quando non cambierai il nome di accesso. Se agetty trova un bit di parità 1, assumerà che questo è un bit di parità e non un bit di ordine elevato di un carattere a 8 bit. Si assume quindi che non si utilizzino i meta-caratteri (set di bit alti) nel proprio nome utente (cioè che il proprio nome sia in ASCII). Uno può entrare in un "loop di login" in vari modi. Supponi di digitare solo una o due lettere per il tuo nome di accesso e poi premi Invio. Se queste lettere non sono sufficienti per il rilevamento di parità, il login viene eseguito prima che sia stata rilevata la parità. A volte questo problema si verifica se non si ha il terminale acceso e / o connesso quando agetty si avvia per la prima volta. Se rimani bloccato in questo "loop di login" un modo per uscirne è premere il tasto Invio più volte fino a quando non ottieni il prompt di login di getty. Un altro modo è solo aspettare un minuto o così per un timeout. Quindi il prompt di login di getty verrà messo sullo schermo dal programma getty e si può provare di nuovo ad accedere. Sfortunatamente, agetty non può rilevare questa parità.A partire dalla fine del 1999 non ha alcuna opzione per disabilitare il rilevamento automatico della parità e quindi rileva la parità errata. Il risultato è che il processo di login sarà confuso e la parità verrà errata. Pertanto non sembra possibile provare a usare byte di dati a 8 bit con parità. (La maggior parte è tratta dal vecchio Serial-HOWTO di Greg Hankins)Per questo getty è necessario sia inserire le voci in un file di configurazione e aggiungere una voce in / Etc / inittab. Ecco alcune voci di esempio da utilizzare per il terminale che inserisci nel file di configurazione / etc / gettydefs.
Si noti che DT38400, DT19200, ecc. Sono solo etichette e devono essere uguali a quelli utilizzati / Etc / inittab. Se vuoi, puoi farlo getty stampare cose interessanti nel banner di accesso. Nei miei esempi, ho stampato il nome del sistema e la linea seriale. Puoi aggiungere altre cose: blockquote ombra = yes
Quando hai finito di modificare / etc / gettydefs, puoi verificare che la sintassi sia corretta eseguendo:
Assicurati che non ci siano altri getty o uugetty file di configurazione per la porta seriale a cui è collegato il terminale come (/etc/default/{uu}getty.ttySN o /etc/conf.{uu}getty.ttySN), poiché questo probabilmente interferirà con la corsa getty su un terminale. Rimuovi tali file in conflitto se escono. Modifica il tuo / Etc / inittab file da eseguire getty sulla porta seriale (sostituendo le informazioni corrette per il proprio ambiente: porta, velocità e tipo di terminale predefinito):
A questo punto, dovresti vedere un prompt di login sul tuo terminale. Potrebbe essere necessario premere Invio per ottenere l'attenzione del terminale. La "m" sta per modem. Questo programma è principalmente per i modem e a partire dalla metà del 2000 richiederà la ricompilazione per usarlo per i terminali di testo (a meno che non si usi il controllo del flusso hardware - e che di solito richieda un cavo fatto a mano). Per la documentazione dei terminali collegati direttamente consultare la sezione "Diretta" del manuale: mgetty.texi. Guarda le ultime righe di /etc/mgetty/mgetty.config per un esempio di configurazione per un terminale. A meno che tu non dica "toggle-dtr no", penserà di avere un modem e di eliminare (negare) il pin DTR sul PC nel vano tentativo di ripristinare il modem inesistente. A differenza di altri gettys, mgetty non si collegherà a un terminale finché qualcuno non preme alcuna chiave di quel terminale, quindi vedrai un? per il terminale in superiore o ps finché ciò non accadrà. Il login / Var / log / mgetty / potrebbe mostrare alcuni messaggi di avviso che sono applicabili solo ai modem che potresti ignorare. Ecco un esempio della linea semplice che hai inserito / Etc / inittab:
Getty esce dopo il login (e può rigenerare)
Se getty viene eseguito dalla riga di comando: i programmi vengono arrestati
agetty (può essere chiamato getty)
S1: 23: respawn: / sbin / getty -L 19200 ttyS1 vt102
Auto-individuazione dei problemi di parità di Agetty
Byte di dati a 8 bit (più parità)
getty (parte di getty_ps)
mgetty