"¿Qué es /dev/console
?" se responde en la respuesta anterior . Quizás esa respuesta sea más clara cuando conozca las respuestas a las otras dos preguntas.
Q1. "¿Cuál es el archivo del dispositivo que representa el terminal físico en sí?"
No existe tal archivo de dispositivo.
Q2 "¿Para qué se /dev/console
usa?"
En Linux, /dev/console
se usa para mostrar mensajes durante el inicio (y apagado). También se usa para el "modo de usuario único", como se señala en la respuesta de Stephen Kitt. No hay mucho más para lo que tenga sentido usarlo.
"En los viejos tiempos" de Unix, /dev/console
era un dispositivo físico dedicado. Pero este no es el caso en Linux.
Evidencia relacionada
1. "¿Cuál es el archivo del dispositivo que representa el propio terminal físico?"
Déjame intentar entender de esta manera. /dev/tty{1..63}
y /dev/pts/n
son archivos de dispositivos que representan dispositivos en sí mismos (aunque son emulaciones), no en relación con el proceso o el núcleo. /dev/tty0
representa el /dev/tty{1..63}
que es utilizado actualmente por algo (tal vez kernelo proceso de shell?) /dev/tty
representa el terminal de control utilizado actualmente por una sesión de proceso. /dev/console
representa el terminal utilizado actualmente por el kernel?
¿Cuál es el archivo del dispositivo que representa el terminal físico en sí mismo, no en relación con el núcleo o el proceso?
Los dispositivos subyacentes para /dev/tty{1..63}
son struct con_driver
. Para ver todos los controladores posibles, consulte https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console
¡No hay ningún archivo de dispositivo para estos dispositivos subyacentes!
Solo hay una interfaz mínima de espacio de usuario para administrarlos.
$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device
==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device
Si realmente quiere saber más, el (M)
sinónimo de módulo . Es decir, el dispositivo de consola ficticio no es proporcionado por un módulo de núcleo cargable; es parte de la imagen inicial del núcleo (también conocida como "incorporada").
En segundo lugar, el bind
archivo en cada subdirectorio de /sys/class/vtconsole
parece indicarle qué dispositivo vtconsole está activo. Si escribo 0
en el activo, parece cambiar al simulado. (Los VT de GUI parecen no verse afectados, pero los VT de texto dejan de funcionar). Escribir 1
para el muerto no lo activa. Cualquiera de los métodos funciona para volver al real. Si leo el código correctamente, el truco es que echo 1 > bind
solo se supone que funciona para los controladores de consola que se construyen como un módulo (?!).
Para las consolas framebuffer específicamente, hay más información sobre cómo vincular diferentes dispositivos framebuffer ( /dev/fb0
...) a consolas virtuales específicas en https://kernel.org/doc/Documentation/fb/fbcon.txt . Esto implica una opción de kernel fbcon:map=
o un comando llamado con2fbmap
.
Por supuesto, los detalles pueden variar con diferentes versiones del núcleo, arquitecturas, firmwares, dispositivos, controladores, etc. Nunca he tenido que usar ninguna de las interfaces anteriores. El kernel simplemente deja que i915
/ inteldrmfb
/ como quieras llamarlo se haga cargo cuando se carga, reemplazando, por ejemplo vgacon
.
Parece que mi máquina EFI nunca lo ha hecho vgacon
. Por lo tanto, en primer lugar, utiliza una consola ficticia y, en segundo lugar, después de 1,2 segundos cambia a fbcon
, ejecutándose encima efifb
. Pero hasta ahora no he tenido que preocuparme por los detalles; Simplemente funciona.
$ 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. "¿Para qué se /dev/console
utiliza?"
Puede usar / dev / console como dispositivo TTY. Escribir en él, por ejemplo, escribirá en un dispositivo subyacente específico, que también tendrá un número de dispositivo de caracteres propio.
A menudo, / dev / console está vinculado a / dev / tty0, pero a veces puede estar vinculado a un dispositivo diferente.
Entonces, en este caso, escribir en / dev / console escribirá en / dev / tty0. Y a su vez, escribir en / dev / tty0 es equivalente a escribir en cualquier dispositivo / dev / ttyN que esté actualmente activo.
Pero esto plantea una pregunta interesante. Accediendo tty0
accederá a diferentes consolas virtuales, dependiendo de cuál esté actualmente activo. ¿Para qué usan realmente las personas tty0
, y de manera similar para qué se console
usa en Linux?
Técnicamente, puede leer y escribir desde console
/ tty0
, por ejemplo, ejecutando a getty
para permitir iniciar sesión tty0
. Pero esto solo es útil como un truco rápido. Porque significa que no puede aprovechar las múltiples consolas virtuales de Linux.
systemd
busca sysfs
un atributo asociado con el dispositivo / dev / console para detectar el dispositivo TTY subyacente. Esto permite systemd
generar automáticamente un getty
e iniciar sesión, por ejemplo, en una consola en serie, cuando el usuario configura una consola del núcleo iniciando con console=ttyS0
. Esto es conveniente; evita la necesidad de configurar esta consola en dos lugares diferentes. De nuevo, mira man systemd-getty-generator
. Sin embargo, en systemd
realidad no se abre /dev/console
para esto.
Durante el arranque del sistema, es posible que ni siquiera tenga sysfs montados todavía. ¡Pero desea poder mostrar mensajes de error y progreso tan pronto como sea posible! Entonces damos la vuelta al punto 1). El núcleo inicia el PID 1 con stdin / stdout / stderr conectado /dev/console
. Es muy bueno tener este mecanismo simple configurado desde el principio.
Dentro de un contenedor de Linux, el archivo en /dev/console
puede crearse como algo diferente, no como el número de dispositivo de caracteres 5:1
. En cambio, se puede crear como un archivo de dispositivo PTS. Entonces tendría sentido iniciar sesión a través de este /dev/console
archivo. systemd
dentro de un contenedor permitirá iniciar sesión en dicho dispositivo; ver man systemd-getty-generator
.
Este mecanismo se usa cuando ejecuta un contenedor con el systemd-nspawn
comando. (Creo que solo cuando ejecutas systemd-nspawn
un TTY, aunque no puedo distinguirlo al buscar en la página de manual).
systemd-nspawn
crea el contenedor /dev/console
como un montaje de enlace de un dispositivo PTS desde el host. Esto significa que este dispositivo PTS no es visible /dev/pts/
dentro del contenedor.
Los dispositivos PTS son locales para un devpts
montaje específico . Los dispositivos PTS son una excepción a la regla normal, que los dispositivos se identifican por su número de dispositivo. Los dispositivos PTS se identifican por la combinación de su número de dispositivo y su devpts
montaje.
Puede escribir mensajes urgentes en console
/ tty0
, para escribir en la consola virtual actual del usuario. Esto podría ser útil para los mensajes de error urgentes del espacio de usuario, similares a los mensajes urgentes del núcleo que se imprimen en la consola (ver man dmesg
). Sin embargo, no es común hacer esto, al menos una vez que el sistema ha finalizado el arranque.
rsyslog tiene un ejemplo en esta página , que imprime mensajes del kernel /dev/console
; Esto no tiene sentido en Linux porque el núcleo ya lo hará de forma predeterminada. Un ejemplo que no puedo encontrar nuevamente dice que no es una buena idea usar esto para mensajes que no son del núcleo porque hay demasiados mensajes de syslog, inunda su consola y se interpone demasiado.
systemd-journald también tiene opciones para reenviar todos los registros a la consola. En principio, esto podría ser útil para la depuración en un entorno virtual. Aunque, para la depuración, generalmente lo reenviamos /dev/kmsg
. Esto los guarda en el búfer de registro del núcleo para que pueda leerlos dmesg
. Al igual que los mensajes generados por el núcleo en sí, estos mensajes pueden repetirse en la consola dependiendo de la configuración actual del núcleo.