En un sistema Linux, lo que es la diferencia entre /dev/console
, /dev/tty
y /dev/tty0
?
¿Cuál es su uso respectivo y cómo se comparan?
En un sistema Linux, lo que es la diferencia entre /dev/console
, /dev/tty
y /dev/tty0
?
¿Cuál es su uso respectivo y cómo se comparan?
Respuestas:
De la documentación :
/dev/tty Current TTY device
/dev/console System console
/dev/tty0 Current virtual console
En los viejos tiempos /dev/console
era la consola del administrador del sistema. Y los TTY eran dispositivos seriales de los usuarios conectados a un servidor. Ahora /dev/console
y /dev/tty0
representan la pantalla actual y generalmente son lo mismo. Puede anularlo, por ejemplo, agregando console=ttyS0
a grub.conf
. Después de eso tu /dev/tty0
es un monitor y lo /dev/console
es /dev/ttyS0
.
Un ejercicio para mostrar la diferencia entre /dev/tty
y /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 tty
es la consola donde comienza el proceso, y tty0
es una consola siempre actual.
$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
sudo -i
, y listo, un shell de raíz.
sudo anycommand
funciona, entonces sudo -i
ir 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.)
/dev/console
es 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/tty
es 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 cron
procesos por lotes similares no tienen uso /dev/tty
, ya que no están asociados con ninguno. Estos procesos tienen un ?
en la TTY
columna de ps -ef
salida.
/dev/tty
puede ser un dispositivo diferente, si lo hay, dependiendo del proceso que lo abra. Respuesta actualizada
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=ttyS0
y console=ttyS1
.
La documentación del núcleo se especifica /dev/console
como 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/console
la salida estándar, el error estándar y la entrada estándar.
Si ninguna de las consolas es un tty, la apertura /dev/console
devuelve el error ENODEV
("No existe tal dispositivo"). El kernelimpresiónregistrar un mensaje y comenzar de todos init
modos. 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-nspawn
contenedor, el /dev/console
archivo 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
.
Los nodos del dispositivo Linux TTY a tty1
través de tty63
son 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 chvt
Ctrl + 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
. tty0
es 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 ttyS0
es probablemente la alternativa más común a tty0
. No es posible utilizar el sistema VT encima de una consola en serie.
/dev/tty
es 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.