"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/consoleserve?"
Su Linux, /dev/consoleviene 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/consoleera 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/nsono file di dispositivi che rappresentano i dispositivi stessi (sebbene siano emulazioni), non in relazione al processo o al kernel. /dev/tty0rappresenta quello in /dev/tty{1..63}cui è attualmente utilizzato da qualcosa (forse kernelo processo di shell?). /dev/ttyrappresenta il terminale di controllo attualmente utilizzato da una sessione di processo. /dev/consolerappresenta 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 bindfile in ciascuna sottodirectory di /sys/class/vtconsolesembra indicare quale dispositivo vtconsole è attivo. Se scrivo 0a quello attivo, sembra passare a quello fittizio. (I VT della GUI sembrano inalterati, ma i VT di testo smettono di funzionare). Scrivere 1per il manichino non lo attiva. Entrambi i metodi funzionano per tornare a quello reale. Se leggo correttamente il codice, il trucco è che echo 1 > binddovrebbe 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/consoleserve?"
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' tty0accesso accederà a diverse console virtuali, a seconda di quale è attualmente attivo. A cosa servono effettivamente le persone tty0e allo stesso modo a cosa consoleserve Linux?
Tecnicamente, puoi leggere e scrivere da console/ tty0, ad esempio eseguendo a gettyper consentire l'accesso tty0. Ma questo è utile solo come hack rapido. Perché significa che non puoi sfruttare le molteplici console virtuali di Linux.
systemdcerca sysfsun attributo associato al dispositivo / dev / console per rilevare il dispositivo TTY sottostante. Ciò consente systemddi generare automaticamente a gettye 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 systemdrealtà non si apre /dev/consoleper 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/consolepuò 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/consolefile. systemdall'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-nspawncomando. (Penso solo quando corri systemd-nspawnsu un TTY, anche se non posso dirlo dalla ricerca nella pagina man).
systemd-nspawncrea il contenitore /dev/consolecome 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 devptsmount 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 devptsmontatura.
È 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/kmsginvece. 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.