Su un sistema Linux, qual è la differenza tra /dev/console
, /dev/tty
e /dev/tty0
?
Qual è il loro rispettivo uso e come si confrontano?
Su un sistema Linux, qual è la differenza tra /dev/console
, /dev/tty
e /dev/tty0
?
Qual è il loro rispettivo uso e come si confrontano?
Risposte:
Dalla documentazione :
/dev/tty Current TTY device
/dev/console System console
/dev/tty0 Current virtual console
Ai vecchi tempi /dev/console
c'era la console di amministrazione del sistema. E i TTY erano dispositivi seriali degli utenti collegati a un server. Ora /dev/console
e /dev/tty0
rappresentano la visualizzazione corrente e di solito sono gli stessi. È possibile sovrascriverlo ad esempio aggiungendo console=ttyS0
a grub.conf
. Dopo di che il tuo /dev/tty0
è un monitor ed /dev/console
è /dev/ttyS0
.
Un esercizio per mostrare la differenza tra /dev/tty
e /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.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, e voilà - una shell radice.
sudo anycommand
funziona, allora sudo -i
anche il root funziona. Non esiste Linux / BSD / Unix in cui non si possa fare il root. (Quindi non sarebbe più Linux / BSD / Unix.)
/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 cron
processi batch simili non sono utilizzabili /dev/tty
, poiché non sono associati a nessuno. Questi processi hanno un ?
nella TTY
colonna di ps -ef
output.
/dev/tty
può essere un dispositivo diverso, se presente, a seconda del processo che lo apre. Risposta aggiornata
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=ttyS0
e console=ttyS1
.
La documentazione del kernel specifica /dev/console
come 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 init
o "PID 1", viene avviato con /dev/console
l'output standard, l'errore standard e l'input standard collegati.
Se nessuna delle console è una tty, quindi all'apertura viene /dev/console
restituito l'errore ENODEV
("Nessun dispositivo di questo tipo"). Lo farà il kernelStamparegistra un messaggio e inizia a init
prescindere. Per un esempio di console del kernel che non è un dispositivo tty, vedere netconsole
o 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-nspawn
contenitore, il /dev/console
file 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
.
I nodi del dispositivo Linux TTY tty1
tramite tty63
sono 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
è 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.