A cosa serve `/ dev / console`?


13

Da questa risposta a Linux: differenza tra / dev / console, / dev / tty e / dev / tty0

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.

Con " Console di sistema ", /dev/consolesembra il file del dispositivo di un terminale fisico testuale, proprio come /dev/tty{1..63}i file del dispositivo per le console virtuali.

Con " /dev/consolee /dev/tty0rappresentano la visualizzazione corrente e di solito sono gli stessi", /dev/consolemi sembra che possa anche essere il file del dispositivo di una console virtuale. /dev/consolesembra più simile /dev/tty0che simile /dev/tty{1..63}( /dev/tty0è la console virtuale attualmente attiva e può essere qualsiasi /dev/tty{1..63}).

Che cosa è /dev/console? A cosa serve?

Ha /dev/consolelo stesso ruolo per il kernel Linux come /dev/ttyper un processo? ( /dev/ttyÈ il terminale di controllo della sessione processo del processo, e può essere un punt, /dev/ttyndove nè da 1 a 63, o più?)

L'altra risposta menziona:

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.

Significa "la lista delle console" significa che tutte le console='s in opzione di avvio ?

Per " /dev/consolecome dispositivo a caratteri numerato 5: 1", significa che /dev/consoleè il file del dispositivo di un terminale di testo fisico, ovvero una console di sistema? (Ma ancora una volta, la prima risposta che ho citato sopra dice che /dev/consolepuò essere la stessa /dev/tty0che non è un terminale di testo fisico, ma una console virtuale)

Grazie.


Ho creato alcuni sostituti per quelle pagine di manuale che sono scomparse anni fa: jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP

Risposte:


18

/dev/consoleesiste principalmente per esporre la console del kernel nello spazio utenti. La documentazione del kernel Linux sui dispositivi ora dice

Il dispositivo console /dev/console, è il dispositivo a cui inviare i messaggi di sistema e su quali accessi devono essere consentiti in modalità utente singolo. A partire da Linux 2.1.71, /dev/consoleè gestito dal kernel; per le versioni precedenti dovrebbe essere un collegamento simbolico a /dev/tty0una console virtuale specifica come /dev/tty1, o a un dispositivo primario ( tty*, non cu*) della porta seriale , a seconda della configurazione del sistema.

/dev/console, il nodo del dispositivo con maggiore 5 e minore 1, fornisce l'accesso a qualunque cosa il kernel consideri il suo mezzo principale per interagire con l'amministratore di sistema; può trattarsi di una console fisica connessa al sistema (con l'astrazione della console virtuale in alto, in modo che possa usare tty0o ttyNdove N è compreso tra 1 e 63), oppure una console seriale, una console hypervisor o persino un dispositivo Braille. Si noti che il kernel stesso non usa /dev/console: i nodi dei dispositivi sono per userspace, non per il kernel; verifica, tuttavia, che /dev/consoleesiste ed è utilizzabile e si initconfigura con i suoi input, output ed errori standard che puntano a /dev/console.

Come descritto qui, /dev/consoleè un dispositivo a caratteri con un maggiore e un minore fissi perché è un dispositivo separato (come in, un mezzo per accedere al kernel; non un dispositivo fisico), non equivalente /dev/tty0o qualsiasi altro dispositivo. Questo è in qualche modo simile alla situazione in/dev/tty cui si trova il proprio dispositivo (5: 0) perché offre funzionalità leggermente diverse rispetto alle altre console virtuali o dispositivi terminali.

L '"elenco di console" è in effetti l'elenco di console definito dai console=parametri di avvio (o dalla console predefinita, se non ce ne sono). Puoi vedere le console definite in questo modo guardando /proc/consoles. /dev/consolefornisce effettivamente l'accesso all'ultimo di questi :

È possibile specificare più console = opzioni nella riga di comando del kernel. L'output apparirà su tutti loro. L'ultimo dispositivo verrà utilizzato all'apertura /dev/console.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
terdon

6

"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?

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. È 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.


Come complemento del punto 2, era comune (non solo su Linux) correre xconsoleper tenere traccia di ciò che stava succedendo ;-). (E per evitare di avere messaggi scritti direttamente sul framebuffer, ad esempio su SPARCstations.)
Stephen Kitt,

@StephenKitt quando ho usato SUSE Linux per la prima volta, penso che abbia avviato xconsole, o lo abbia potenziato in modo da poterlo avviare dal menu principale del desktop, o qualcosa del genere - Non ricordo esattamente ma l'ho visto :-).
FonteJedi

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 il processo kernel o 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?
Tim

@Tim "/ dev / tty0 rappresenta quello in /dev/tty{1..63} che è attualmente usato da qualcosa (forse kernel o processo shell?)" - kernel.
sourcejedi

Qual è il file del dispositivo che rappresenta il terminale fisico stesso, non in relazione al kernel o al processo?
Tim
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.