"Che cos'è /dev/console
?" viene risposto nella risposta precedente . Forse quella risposta è più chiara quando conosci le risposte alle altre due domande.
Q1. "Qual è il file del dispositivo che rappresenta il terminale fisico stesso?"
Non esiste un file di questo tipo.
Q2. "A cosa /dev/console
serve?"
Su Linux, /dev/console
viene utilizzato per mostrare i messaggi durante l'avvio (e l'arresto). Viene anche utilizzato per la "modalità utente singolo", come sottolineato nella risposta di Stephen Kitt. Non c'è molto altro per cui ha senso usarlo.
"Ai bei vecchi tempi" di Unix, /dev/console
era un dispositivo fisico dedicato. Ma questo non è il caso di Linux.
Prove correlate
1. "Qual è il file del dispositivo che rappresenta il terminale fisico stesso?"
Vorrei provare a capire in questo modo. /dev/tty{1..63}
e /dev/pts/n
sono file di dispositivi che rappresentano i dispositivi stessi (sebbene siano emulazioni), non in relazione al processo o al kernel. /dev/tty0
rappresenta quello in /dev/tty{1..63}
cui è attualmente utilizzato da qualcosa (forse kernelo processo di shell?). /dev/tty
rappresenta il terminale di controllo attualmente utilizzato da una sessione di processo. /dev/console
rappresenta il terminale attualmente utilizzato dal kernel?
Qual è il file del dispositivo che rappresenta il terminale fisico stesso, non in relazione al kernel o al processo?
I dispositivi sottostanti per /dev/tty{1..63}
sono struct con_driver
. Per vedere tutti i possibili driver, controlla https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
Non esiste un file dispositivo per questi dispositivi sottostanti!
Esiste solo un'interfaccia minima per lo spazio utente per gestirli.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Se davvero si vuole sapere di più, l' (M)
acronimo di modulo . Cioè il dispositivo console fittizio non è fornito da un modulo kernel caricabile; fa parte dell'immagine iniziale del kernel (alias "builtin").
In secondo luogo, il bind
file in ciascuna sottodirectory di /sys/class/vtconsole
sembra indicare quale dispositivo vtconsole è attivo. Se scrivo 0
a quello attivo, sembra passare a quello fittizio. (I VT della GUI sembrano inalterati, ma i VT di testo smettono di funzionare). Scrivere 1
per il manichino non lo attiva. Entrambi i metodi funzionano per tornare a quello reale. Se leggo correttamente il codice, il trucco è che echo 1 > bind
dovrebbe funzionare solo per i driver della console che sono costruiti come modulo (?!).
Per le console framebuffer in particolare, sono disponibili ulteriori informazioni sull'associazione di diversi dispositivi framebuffer ( /dev/fb0
...) a console virtuali specifiche in https://kernel.org/doc/Documentation/fb/fbcon.txt . Ciò comporta un'opzione del kernel fbcon:map=
o un comando chiamato con2fbmap
.
Naturalmente i dettagli possono variare in base alle diverse versioni del kernel, architetture, firmware, dispositivi, driver, ecc. Non ho mai dovuto usare nessuna delle interfacce sopra. Il kernel lascia semplicemente i915
/ inteldrmfb
/ come vuoi chiamarlo quando prende il carico, sostituendo ad es vgacon
.
Sembra che la mia macchina EFI non lo abbia mai fatto vgacon
. Quindi in primo luogo utilizza una console fittizia, e in seguito, dopo 1,2 secondi, passa a fbcon
, eseguendo in cima efifb
. Ma finora non ho dovuto preoccuparmi di quali siano i dettagli; funziona e basta.
$ dmesg | grep -C2 [Cc]onsole
[ 0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[ 0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[ 0.233346] Console: colour dummy device 80x25
[ 0.233571] console [tty0] enabled
[ 0.233585] ACPI: Core revision 20180810
[ 0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[ 1.228393] efifb: scrolling: redraw
[ 1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[ 1.230393] Console: switching to colour frame buffer device 170x48
[ 1.232090] fb0: EFI VGA frame buffer device
[ 1.232110] intel_idle: MWAIT substates: 0x11142120
--
[ 3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[ 3.595839] fb: switching to inteldrmfb from EFI VGA
[ 3.596577] Console: switching to colour dummy device 80x25
[ 3.596681] [drm] Replacing VGA console driver
[ 3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[ 3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[ 3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[ 3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[ 4.711453] Console: switching to colour frame buffer device 170x48
[ 4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[ 4.778813] Loading iSCSI transport class v2.0-870.
2. "A cosa /dev/console
serve?"
Puoi usare / dev / console come dispositivo TTY. Scrivere su di esso, ad esempio, scriverà su un dispositivo sottostante specifico, che avrà anche un numero di dispositivo carattere proprio.
Spesso / dev / console è legato a / dev / tty0, ma a volte può essere collegato a un dispositivo diverso.
Quindi in questo caso scrivere su / dev / console scriverà su / dev / tty0. E a sua volta, scrivere su / dev / tty0 equivale a scrivere su qualsiasi dispositivo / dev / ttyN sia attualmente attivo.
Ma questo solleva una domanda interessante. L' tty0
accesso accederà a diverse console virtuali, a seconda di quale è attualmente attivo. A cosa servono effettivamente le persone tty0
e allo stesso modo a cosa console
serve Linux?
Tecnicamente, puoi leggere e scrivere da console
/ tty0
, ad esempio eseguendo a getty
per consentire l'accesso tty0
. Ma questo è utile solo come hack rapido. Perché significa che non puoi sfruttare le molteplici console virtuali di Linux.
systemd
cerca sysfs
un attributo associato al dispositivo / dev / console per rilevare il dispositivo TTY sottostante. Ciò consente systemd
di generare automaticamente a getty
e consentire l'accesso ad esempio su una console seriale, quando l'utente imposta una console del kernel avviando con console=ttyS0
. Questo è conveniente; evita la necessità di configurare questa console in due luoghi diversi. Ancora una volta, vedi man systemd-getty-generator
. Tuttavia, in systemd
realtà non si apre /dev/console
per questo.
Durante il bootstrap di sistema, potresti non avere ancora installato sysfs. Ma vuoi essere in grado di mostrare messaggi di errore e di avanzamento il prima possibile! Quindi giriamo intorno al punto 1). Il kernel avvia PID 1 con stdin / stdout / stderr connessi /dev/console
. È molto bello avere questo semplice meccanismo impostato fin dall'inizio.
All'interno di un contenitore Linux, il file in /dev/console
può essere creato come qualcosa di diverso, non il numero di dispositivo del personaggio 5:1
. Invece, può essere creato come file di dispositivo PTS. Quindi sarebbe logico accedere tramite questo /dev/console
file. systemd
all'interno di un contenitore consentirà l'accesso su tale dispositivo; vedi man systemd-getty-generator
.
Questo meccanismo viene utilizzato quando si esegue un contenitore con il systemd-nspawn
comando. (Penso solo quando corri systemd-nspawn
su un TTY, anche se non posso dirlo dalla ricerca nella pagina man).
systemd-nspawn
crea il contenitore /dev/console
come mount di un dispositivo PTS dall'host. Ciò significa che questo dispositivo PTS non è visibile /dev/pts/
all'interno del contenitore.
I dispositivi PTS sono locali per un devpts
mount specifico . I dispositivi PTS fanno un'eccezione alla regola normale, che i dispositivi sono identificati dal loro numero di dispositivo. I dispositivi PTS sono identificati dalla combinazione del loro numero di dispositivo e della loro devpts
montatura.
È possibile scrivere messaggi urgenti su console
/ tty0
, per scrivere sulla console virtuale corrente dell'utente. Ciò potrebbe essere utile per i messaggi di errore urgenti dello spazio utente, simile ai messaggi urgenti del kernel stampati sulla console (vedere man dmesg
). Tuttavia, non è comune farlo, almeno una volta che il sistema ha terminato l'avvio.
rsyslog ha un esempio in questa pagina , in cui stampa i messaggi del kernel /dev/console
; questo è inutile su Linux perché il kernel lo farà già di default. Un esempio che non riesco a trovare di nuovo afferma che non è una buona idea usarlo per i messaggi non kernel perché ci sono troppi messaggi syslog, si inonda la console e si mette troppo in mezzo.
systemd-journald ha allo stesso modo opzioni per inoltrare tutti i log alla console. In linea di principio, questo potrebbe essere utile per il debug in un ambiente virtuale. Tuttavia, per il debug di solito inoltriamo /dev/kmsg
invece. Questo li salva nel buffer del log del kernel in modo da poterli leggere con dmesg
. Come i messaggi generati dal kernel stesso, questi messaggi possono essere ripetuti nella console in base alla configurazione corrente del kernel.