¿Para qué se usa `/ dev / console`?

13

De esta respuesta a Linux: Diferencia entre / dev / console, / dev / tty y / dev / tty0

De la documentación :

/dev/tty      Current TTY device
/dev/console  System console
/dev/tty0     Current virtual console

En los viejos tiempos /dev/consoleera la consola del administrador del sistema. Y los TTY eran dispositivos seriales de los usuarios conectados a un servidor. Ahora /dev/consoley /dev/tty0representan la pantalla actual y generalmente son lo mismo. Puede anularlo, por ejemplo, agregando console=ttyS0a grub.conf. Después de eso, tu /dev/tty0es un monitor y lo /dev/consolees /dev/ttyS0.

Por " Consola del sistema ", /dev/consoleparece el archivo del dispositivo de un terminal físico de texto, al igual /dev/tty{1..63}que los archivos del dispositivo para las consolas virtuales.

Por " /dev/consoley /dev/tty0representan la pantalla actual y generalmente son las mismas", /dev/consoleme parece que también puede ser el archivo del dispositivo de una consola virtual. /dev/consoleparece más parecido /dev/tty0que como /dev/tty{1..63}( /dev/tty0es la consola virtual actualmente activa, y puede ser cualquiera de /dev/tty{1..63}).

¿Qué es /dev/console? ¿Para qué se usa esto?

¿ /dev/consoleJuega el mismo papel para el kernel de Linux que /dev/ttypara un proceso? (¿ /dev/ttyEs el terminal de control de la sesión de proceso del proceso, y puede ser un punto, /dev/ttyndonde nes de 1 a 63 o más?)

La otra respuesta menciona:

La documentación del núcleo se especifica /dev/consolecomo un dispositivo de caracteres numerado 5: 1. Al abrir este dispositivo de caracteres se abre la consola "principal", que es el último tty en la lista de consolas.

Significa "la lista de las consolas" significa todos los console='s en la opción de arranque ?

Por " /dev/consolecomo un dispositivo de caracteres numerado 5: 1", ¿significa que /dev/consolees el archivo del dispositivo de un terminal de texto físico, es decir, una consola del sistema? (Pero nuevamente, la primera respuesta que cité anteriormente dice que /dev/consolepuede ser la misma /dev/tty0que no es un terminal de texto físico, sino una consola virtual)

Gracias.

Tim
fuente
Creé
JdeBP

Respuestas:

18

/dev/consoleexiste principalmente para exponer la consola del kernel al espacio de usuario. La documentación del kernel de Linux en dispositivos ahora dice

El dispositivo de consola /dev/console, es el dispositivo al que se deben enviar los mensajes del sistema y en el que se deben permitir los inicios de sesión en modo de usuario único. Comenzando con Linux 2.1.71, /dev/consolees administrado por el núcleo; para versiones anteriores, debería ser un enlace simbólico a /dev/tty0una consola virtual específica como /dev/tty1, o a un dispositivo primario ( tty*no cu*) de puerto serie , dependiendo de la configuración del sistema.

/dev/console, el nodo de dispositivo con mayor 5 y menor 1, proporciona acceso a cualquier cosa que el núcleo considere su principal medio de interacción con el administrador del sistema; Esto puede ser una consola física conectada al sistema (con la abstracción de la consola virtual en la parte superior, por lo que puede usar tty0o en cualquier lugar ttyNdonde N esté entre 1 y 63), o una consola serie, o una consola de hipervisor, o incluso un dispositivo Braille. Tenga en cuenta que el núcleo en sí no usa /dev/console: los nodos de los dispositivos son para el espacio de usuario, no para el núcleo; sin embargo, verifica si /dev/consoleexiste y es utilizable, y se initconfigura con su entrada, salida y error estándar apuntando a /dev/console.

Como se describe aquí, /dev/consolees un dispositivo de caracteres con un mayor y menor fijo porque es un dispositivo separado (como en, un medio de acceso al núcleo; no un dispositivo físico), no equivalente a /dev/tty0ningún otro dispositivo. Esto es algo similar a la situación con la/dev/tty que se encuentra su propio dispositivo (5: 0) porque proporciona características ligeramente diferentes a las de la otra consola virtual o dispositivos terminales.

La "lista de consolas" es, de hecho, la lista de consolas definidas por los console=parámetros de arranque (o la consola predeterminada, si no hay ninguna). Puede ver las consolas definidas de esta manera mirando /proc/consoles. /dev/consolede hecho proporciona acceso al último de estos :

Puede especificar múltiples opciones de consola = en la línea de comando del núcleo. La salida aparecerá en todos ellos. El último dispositivo se usará cuando abras /dev/console.

Stephen Kitt
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
terdon
6

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

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

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

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

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

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

sourcejedi
fuente
Como complemento al punto 2, solía ser común (no solo en Linux) ejecutarse xconsolepara realizar un seguimiento de lo que estaba sucediendo ;-). (Y para evitar que los mensajes se escriban directamente en el framebuffer, por ejemplo , en estaciones SPARC.)
Stephen Kitt
@StephenKitt cuando utilicé SUSE Linux por primera vez, creo que comenzó xconsole, o lo incrementé para poder iniciarlo desde el menú principal del escritorio, o algo así. No recuerdo exactamente pero lo he visto :-).
sourcejedi
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 actualmente usa algo (¿tal vez un proceso de kernel o 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í, no en relación con el núcleo o el proceso?
Tim
@Tim "/ dev / tty0 representa el que está en /dev/tty{1..63} que actualmente está siendo utilizado por algo (¿tal vez un proceso de kernel o shell?)" - kernel.
sourcejedi
¿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?
Tim