"¿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/consoleusa?"
En Linux, /dev/consolese 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/consoleera 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/nson archivos de dispositivos que representan dispositivos en sí mismos (aunque son emulaciones), no en relación con el proceso o el núcleo. /dev/tty0representa el /dev/tty{1..63}que es utilizado actualmente por algo (tal vez kernelo proceso de shell?) /dev/ttyrepresenta el terminal de control utilizado actualmente por una sesión de proceso. /dev/consolerepresenta 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 bindarchivo en cada subdirectorio de /sys/class/vtconsoleparece indicarle qué dispositivo vtconsole está activo. Si escribo 0en el activo, parece cambiar al simulado. (Los VT de GUI parecen no verse afectados, pero los VT de texto dejan de funcionar). Escribir 1para 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 > bindsolo 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/consoleutiliza?"
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 tty0accederá 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 consoleusa en Linux?
Técnicamente, puede leer y escribir desde console/ tty0, por ejemplo, ejecutando a gettypara 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.
systemdbusca sysfsun atributo asociado con el dispositivo / dev / console para detectar el dispositivo TTY subyacente. Esto permite systemdgenerar automáticamente un gettye 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 systemdrealidad no se abre /dev/consolepara 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/consolepuede 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/consolearchivo. systemddentro 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-nspawncomando. (Creo que solo cuando ejecutas systemd-nspawnun TTY, aunque no puedo distinguirlo al buscar en la página de manual).
systemd-nspawncrea el contenedor /dev/consolecomo 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 devptsmontaje 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 devptsmontaje.
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.