Linux: differenza tra / dev / console, / dev / tty e / dev / tty0


133

Su un sistema Linux, qual è la differenza tra /dev/console, /dev/ttye /dev/tty0?

Qual è il loro rispettivo uso e come si confrontano?


3
Potrebbe interessarti anche questo
Kevin

Risposte:


93

Dalla documentazione :

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console

Ai vecchi tempi /dev/consolec'era la console di amministrazione del sistema. E i TTY erano dispositivi seriali degli utenti collegati a un server. Ora /dev/consolee /dev/tty0rappresentano la visualizzazione corrente e di solito sono gli stessi. È possibile sovrascriverlo ad esempio aggiungendo console=ttyS0a grub.conf. Dopo di che il tuo /dev/tty0è un monitor ed /dev/consoleè /dev/ttyS0.

Un esercizio per mostrare la differenza tra /dev/ttye /dev/tty0:

Passare alla seconda console premendo Ctrl+ Alt+ F2. Accedi come root. Tipo sleep 5; echo tty0 > /dev/tty0. Premere Entere passare alla terza console premendo Alt+ F3. Ora torna alla seconda console premendo Alt+ F2. Digitare sleep 5; echo tty > /dev/tty, premere Entere passare alla terza console.

Puoi vedere che ttyè la console in cui inizia il processo, ed tty0è una console sempre attuale.


6
bel esercizio! Ubuntu blocca root, quindi un modo per riprodurlo su Ubuntu è:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28

10
@ SFun28, ho sempre usato sudo -i, e voilà - una shell radice.
André Laszlo,

4
un linguaggio per scrivere su file che richiedono i privilegi di root è roba echo | sudo tee / dev / tty0> / dev / null;
Peter Cordes,

Dannazione. Quando Ī̲ ha scritto unix.stackexchange.com/a/229598/80483 , Ī̲ non era a conoscenza di questa risposta!
Incnis Mrsi,

@ SFun28: se sudo anycommandfunziona, allora sudo -ianche il root funziona. Non esiste Linux / BSD / Unix in cui non si possa fare il root. (Quindi non sarebbe più Linux / BSD / Unix.)
Evi1M4chine

59
  • /dev/consoleè un set virtuale di dispositivi che può essere impostato come parametro all'avvio. Potrebbe essere reindirizzato a un dispositivo seriale o una console virtuale e per impostazione predefinita punta a /dev/tty0. Quando console=vengono passate più opzioni al kernel, l'output della console passerà a più di un dispositivo.

  • /dev/tty0 è la console virtuale corrente

  • /dev/tty[1-x]è una delle console virtuali con cui passi a control- alt- F1e così via.

  • /dev/ttyè una specie di alias per la console (dispositivo fisico, virtuale o pseudo, se presente) associato al processo che lo apre. A differenza degli altri dispositivi, non è necessario disporre dei privilegi di root per scrivere su di esso. Si noti inoltre che processi come quelli avviati da cronprocessi batch simili non sono utilizzabili /dev/tty, poiché non sono associati a nessuno. Questi processi hanno un ?nella TTYcolonna di ps -efoutput.


Cosa intendi interrogandolo da questa affermazione "/ dev / tty è la console utilizzata dal processo che la interroga"?
Ron Vince,

1
@RonVince Voglio dire, /dev/ttypuò essere un dispositivo diverso, se presente, a seconda del processo che lo apre. Risposta aggiornata
jlliagre,

Grazie. Posso sapere se i processi effettivamente scrivono / leggono in / da / dev / tty invece che direttamente nel / dal file del dispositivo ad essi associati?
Ron Vince,

@RonVince Temo di non essere sicuro di quello che stai chiedendo. Potresti riformularlo?
jlliagre,

1
@RonVince Opening / dev / tty (non /dev/tty[1,..,n]) è lo standard Unix (e Linux) per un processo per scrivere qualcosa sul terminale dell'utente. Scrivere direttamente su qualunque altro dispositivo non sia portatile, più complesso e meno affidabile. Un processo non ha bisogno di sapere qual è il dispositivo reale a cui è collegato il terminale di processo, il kernel lo sa già.
jlliagre,

20

/ Dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

Su Linux, la console del kernel può essere configurata usando l' console= opzione di avvio . Il codice del kernel che chiama printk()può scrivere messaggi su di esso, ad esempio quando viene caricato un dispositivo o si verifica un errore. Questi messaggi sono anche bufferizzati dal kernel. (Vedi anche dmesg). Quando viene trovato e avviato un dispositivo console, riceve tutti i messaggi precedentemente bufferizzati.

Puoi passare console=più volte per configurare più console e i messaggi verranno scritti su tutte. Apparentemente puoi selezionare solo una console di ogni "tipo": non puoi usare entrambi console=ttyS0e console=ttyS1.

La documentazione del kernel specifica /dev/consolecome un dispositivo carattere numerato (5,1). Aprendo questo dispositivo personaggio si apre la console "principale", che è l'ultima tty nell'elenco delle console. Il primo processo non kernel, chiamato inito "PID 1", viene avviato con /dev/consolel'output standard, l'errore standard e l'input standard collegati.

Se nessuna delle console è una tty, quindi all'apertura viene /dev/consolerestituito l'errore ENODEV("Nessun dispositivo di questo tipo"). Lo farà il kernelStamparegistra un messaggio e inizia a initprescindere. Per un esempio di console del kernel che non è un dispositivo tty, vedere netconsoleo la mia console preferita la stampante di linea .

Puoi anche vedere un elenco di console tty leggendo /sys/class/tty/console/active. la documentazione di systemd sottolinea che il primo dispositivo mostrato è la console principale. L'elenco è in realtà in ordine inverso rispetto alla riga di comando del kernel. L' attuale documentazione del kernel afferma erroneamente che l'ultimo dispositivo mostrato è la console principale o "attiva". Per qualche motivo è possibile eseguire il polling di questo file per le modifiche (nel caso in cui i dispositivi della console vengano rimossi?).

All'interno di un systemd-nspawncontenitore, il /dev/consolefile standard viene sostituito con un dispositivo pseudo-terminale (PTY). Questi sarebbero meglio descritti come dispositivi terminali virtuali. Sono creati in modo dinamico e vengono anche utilizzati per implementare emulatori di terminali grafici come GNOME Terminal e per l'accesso remoto come ssh.

/ Dev / tty0

I nodi del dispositivo Linux TTY tty1tramite tty63sono terminali virtuali. Sono anche chiamati VT o console virtuali. Simulano più console sopra il driver di dispositivo della console fisica. Viene mostrata e controllata una sola console virtuale alla volta. Il terminale attivo può essere commutato, ad es. Utilizzando chvt, o Ctrl + Alt + F1 tramite tutti i tasti funzione disponibili.

Puoi anche leggere e scrivere sul VT corrente usando /dev/tty0. tty0è la solita console del kernel, ad esempio se non ne hai selezionato esplicitamente uno. "Il sistema cerca prima una scheda VGA [che è quella su cui girano i VT] e poi una porta seriale". È inoltre possibile impostare la console su un VT specifico, ad es console=tty1.

"Se non hai una scheda VGA nel tuo sistema, la prima porta seriale diventerà automaticamente la console." Una "console seriale" come ttyS0è probabilmente l'alternativa più comune a tty0. Non è possibile utilizzare il sistema VT su una console seriale.

/ Dev / tty

/dev/ttyè uno dei tre file standard del dispositivo specificati da POSIX ( /dev/è uno dei tre nomi di directory specificati da POSIX). Aprirlo equivale ad aprire il terminale di controllo del processo corrente. Il terminale di controllo viene impostato quando un processo apre per la prima volta un terminale, almeno su Linux . Ad esempio, in init, farebbe riferimento a /dev/console.

Il distacco dal terminale di controllo è uno dei passaggi tradizionalmente richiesti per avviare un processo in background, ad esempio un demone di registrazione del sistema . I passaggi per diventare un processo in background sono orribilmente intricati, ma per essere precisi, il passaggio che si stacca dal terminale di controllo è la chiamata di sistema setsid . Nei sistemi più moderni, il sistema init, ad esempio systemd, avvia il servizio senza alcun terminale di controllo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.