Linux: diferencia entre / dev / console, / dev / tty y / dev / tty0

133

En un sistema Linux, lo que es la diferencia entre /dev/console, /dev/ttyy /dev/tty0?

¿Cuál es su uso respectivo y cómo se comparan?

Axel Fontaine
fuente
3
También te puede interesar esto
Kevin

Respuestas:

93

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.

Un ejercicio para mostrar la diferencia entre /dev/ttyy /dev/tty0:

Cambie a la segunda consola presionando Ctrl+ Alt+ F2. Inicie sesión como root. Tipo sleep 5; echo tty0 > /dev/tty0. Presione Entery cambie a la tercera consola presionando Alt+ F3. Ahora vuelva a la segunda consola presionando Alt+ F2. Escriba sleep 5; echo tty > /dev/tty, presione Entery cambie a la tercera consola.

Puede ver que ttyes la consola donde comienza el proceso, y tty0es una consola siempre actual.

dchirikov
fuente
66
buen ejercicio! Ubuntu bloquea la raíz, por lo que una forma de reproducir esto en Ubuntu es:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28
10
@ SFun28, siempre usé sudo -i, y listo, un shell de raíz.
André Laszlo
44
un idioma para escribir en archivos que requieren root privs es echo stuff | sudo tee / dev / tty0> / dev / null;
Peter Cordes
Maldición Cuando Ī̲ escribió unix.stackexchange.com/a/229598/80483 , Ī̲ no estaba al tanto de esta respuesta.
Incnis Mrsi
@ SFun28: si sudo anycommandfunciona, entonces sudo -iir a la raíz también funciona. No hay tal cosa como Linux / BSD / Unix donde no puedas ir a la raíz. (Entonces ya no sería Linux / BSD / Unix.)
Evi1M4chine
59
  • /dev/consolees un conjunto virtual de dispositivos que se pueden configurar como parámetro en el momento del arranque. Puede ser redirigido a un dispositivo serie o una consola virtual y, por defecto, apunta a /dev/tty0. Cuando console=se pasan varias opciones al núcleo, la salida de la consola irá a más de un dispositivo.

  • /dev/tty0 es la consola virtual actual

  • /dev/tty[1-x]es una de las consolas virtuales se cambia a con control- alt- F1y así sucesivamente.

  • /dev/ttyes una especie de alias de la consola (física, virtual o pseudo dispositivo, si la hay) asociada al proceso que la abre. A diferencia de los otros dispositivos, no necesita privilegios de root para escribir en él. Tenga en cuenta también que los procesos como los iniciados por cronprocesos por lotes similares no tienen uso /dev/tty, ya que no están asociados con ninguno. Estos procesos tienen un ?en la TTYcolumna de ps -efsalida.

jlliagre
fuente
¿Qué quiere decir al consultarlo desde esta declaración "/ dev / tty es la consola utilizada por el proceso que lo consulta"?
Ron Vince
1
@RonVince quiero decir que /dev/ttypuede ser un dispositivo diferente, si lo hay, dependiendo del proceso que lo abra. Respuesta actualizada
jlliagre
Gracias. ¿Puedo saber si los procesos realmente escriben / leen a / desde / dev / tty en lugar de directamente a / desde el archivo de dispositivo asociado a ellos?
Ron Vince
@RonVince Me temo que no estoy seguro de lo que estás preguntando. ¿Podrías reformularlo?
jlliagre
1
@RonVince Opening / dev / tty (not /dev/tty[1,..,n]) es el estándar de Unix (y Linux) para que un proceso escriba algo en el terminal del usuario. Escribir directamente en cualquier otro dispositivo que no sea portátil, más complejo y menos confiable. Un proceso no necesita saber cuál es el dispositivo real al que está conectado el terminal de proceso, el núcleo ya lo sabe.
jlliagre
20

/ dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

En Linux, la consola del núcleo se puede configurar mediante la console= opción de arranque . Código de kernel que llama printk()puede escribirle mensajes, por ejemplo, cuando se carga un dispositivo o se produce un error. Estos mensajes también son almacenados por el núcleo. (Ver también dmesg) Cuando se encuentra e inicia un dispositivo de consola, recibe todos los mensajes almacenados previamente en el búfer.

Puede pasar console=varias veces para configurar varias consolas, y se escribirán mensajes en todas ellas. Aparentemente, solo puede seleccionar una consola de cada "tipo": no puede usar ambas console=ttyS0y console=ttyS1.

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. El primer proceso que no es del núcleo, denominado init"PID 1", se inicia con /dev/consolela salida estándar, el error estándar y la entrada estándar.

Si ninguna de las consolas es un tty, la apertura /dev/consoledevuelve el error ENODEV("No existe tal dispositivo"). El kernelimpresiónregistrar un mensaje y comenzar de todos initmodos. Para ver un ejemplo de una consola de kernel que no es un dispositivo tty, vea netconsole, o mi consola favorita, la impresora de línea .

También puede ver una lista de consolas tty leyendo /sys/class/tty/console/active. La documentación de systemd señala que el primer dispositivo que se muestra es la consola principal. La lista está en el orden inverso de la línea de comando del núcleo. La documentación actual del núcleo indica incorrectamente que el último dispositivo que se muestra es la consola principal o "activa". Por alguna razón, es posible sondear este archivo en busca de cambios (¿en caso de que se eliminen los dispositivos de la consola?).

Dentro de un systemd-nspawncontenedor, el /dev/consolearchivo estándar se reemplaza con un dispositivo pseudo-terminal (PTY). Estos se describirían mejor como dispositivos de terminal virtual. Se crean dinámicamente y también se usan para implementar emuladores gráficos de terminal como GNOME Terminal y para acceso remoto como ssh.

/ dev / tty0

Los nodos del dispositivo Linux TTY a tty1través de tty63son terminales virtuales. También se les conoce como VT o consolas virtuales. Simulan varias consolas en la parte superior del controlador del dispositivo de la consola física. Solo se muestra y se controla una consola virtual a la vez. El terminal activo puede cambiarse, por ejemplo, usando chvtCtrl + Alt + F1 a través de las teclas de función que tenga.

También puede leer y escribir en el VT actual usando /dev/tty0. tty0es la consola habitual del kernel, por ejemplo, si no seleccionó una explícitamente. "El sistema primero busca una tarjeta VGA [que es en lo que se ejecutan los VT] y luego un puerto serie". También puede configurar la consola para un TV específico, por ejemplo console=tty1.

"Si no tiene una tarjeta VGA en su sistema, el primer puerto serie se convertirá automáticamente en la consola". Una "consola serie" como ttyS0es probablemente la alternativa más común a tty0. No es posible utilizar el sistema VT encima de una consola en serie.

/ dev / tty

/dev/ttyes uno de los tres archivos de dispositivo estándar especificados por POSIX ( /dev/es uno de los tres nombres de directorio especificados por POSIX). Abrirlo es equivalente a abrir el terminal de control del proceso actual. El terminal de control se establece cuando un proceso abre por primera vez un terminal, al menos en Linux . Por ejemplo, en init, se referiría a /dev/console.

Separarse del terminal de control es uno de los pasos tradicionalmente necesarios para iniciar un proceso en segundo plano, por ejemplo, un demonio de registro del sistema . Los pasos para convertirse en un proceso en segundo plano son terriblemente intrincados, pero para ser específicos, el paso que se separa del terminal de control es la llamada al sistema setsid . En sistemas más modernos, el sistema init, por ejemplo systemd, inicia el servicio sin ningún terminal de control en primer lugar.

sourcejedi
fuente