14.1 Getty (usado en /etc/inittab)
Índice de contenidos
Introducción a Getty
Para que un proceso de login se ejecute en un puerto serie (y la terminal conectada a él) cuando el ordenador se inicia (o cambia los niveles de ejecución) se debe poner un comando getty en el fichero /etc/inittab. Ejecutar getty desde la línea de comandos puede causar problemas (vea Si getty ejecuta desde la línea de comandos: Los programas se detienen para ver por qué). Getty GETS recibe un TTY (un terminal) en marcha. Cada terminal necesita su propio comando getty. También hay al menos un comando getty para la consola en cada fichero /etc/inittab. Encuentra esto y pon los comandos getty para las terminales reales junto a él. Este archivo puede contener líneas getty de ejemplo para terminales de texto que son comentadas, de modo que todo lo que necesita hacer es descomentarlas (eliminar el # principal) y cambiar algunos argumentos.
Los argumentos permitidos dependen del getty que utilices:
Dos gettys mejor para los terminales conectados directamente son:
- agetty (a veces llamado getty): Muy fácil de instalar. No hay archivos de configuración. Ver agetty
- getty (parte de getty_ps)
Dos gettys mejor para los módems de marcación (evitar para los terminales conectados directamente) son:
- mgetty: el mejor para módems; funciona también para terminales pero inferior
- uugetty: sólo para módems; parte del paquete getty_ps
Simple gettys para usar si no usas un terminal de texto real. La mayoría de los usuarios de Linux usan uno de estos en su monitor:
- mingetty
- fbgetty
- fgetty
- rungetty
Su distribución de Linux puede venir con ps_getty o agetty para terminales de texto. Algunas distribuciones no suministran ni una ni otra. Desafortunadamente, a menudo lo llaman «getty», por lo que puede que tenga que determinar cuál tiene, ya que los argumentos que pone después en /etc/inittab difieren. Debian usa agetty (en el paquete util-linux). RedHat y Fedora usaron ps_getty que está en: ps_getty
Como último recurso para intentar determinar qué getty tienes, puedes comprobar su código ejecutable (normalmente en /sbin). ps_getty tiene /etc/gettydefs incrustado en este código. Para buscarlo, vaya a /sbin y escriba:
strings getty | grep getty
Si getty es realmente agetty lo anterior no resultará en nada. Sin embargo, si usted tiene agetty typing:
getty -h
debería mostrar las opciones[-hiLmw].
Si no tiene el getty que desea compruebe otras distribuciones y el programa alien para convertir entre paquetes RPM y Debian. El código fuente puede descargarse de Getty Software.
Si no está utilizando líneas de control de módem (por ejemplo, si sólo utiliza el número mínimo de 3 conductores: transmisión, recepción y tierra de señal común), debe informar de ello mediante una bandera «local». El formato de esto depende del getty que utilices.
Getty sale después de iniciar sesión (y puede volver a generar)
Después de iniciar sesión notará (usando «top», «ps -ax», o «ptree») que el proceso getty ya no se está ejecutando. ¿Qué pasó con él? ¿Por qué Getty se reinicia de nuevo si tu caparazón está muerto? Aquí está el por qué.
Después de escribir su nombre de usuario, getty lo toma y llama al programa de inicio de sesión diciéndole su nombre de usuario. El proceso getty es reemplazado por el proceso de login. El proceso de inicio de sesión solicita su contraseña, la comprueba e inicia el proceso especificado en su archivo de contraseñas. Este proceso es a menudo la cáscara del golpe. Si es así, bash inicia y reemplaza el proceso de inicio de sesión. Note que un proceso reemplaza a otro y que el proceso bash shell comenzó originalmente como el proceso getty. Las implicaciones de esto se explicarán a continuación.
Ahora en el fichero /etc/inittab, getty debe reiniciar (reiniciar) si está desactivado. Lo dice en la línea que llama a Getty. Pero si el shell bash (o el proceso de inicio de sesión) es eliminado, getty reinicia (reinicia). Por qué? Bueno, tanto el proceso de login como bash son reemplazos de getty y inherit
* Índice de instrucciones para terminales de texto
las conexiones de señal establecidas por sus predecesores. De hecho, si observa los detalles, notará que el proceso de reemplazo tendrá el mismo ID de proceso que el proceso original. Por lo tanto, bash es una especie de getty disfrazado con el mismo número de identificación de proceso. Si se mata a bash es como si getty hubiera sido asesinado (aunque getty ya no esté corriendo). Esto resulta en un engorroso respawning.
Cuando uno cierra la sesión, todos los procesos en ese puerto serie son eliminados, incluyendo el shell bash. Esto también puede ocurrir (si está habilitado) si se envía una señal de colapso al puerto serie por una caída de tensión DCD del módem. El cierre de sesión o la caída en DCD resultará en una reaparición de getty. Uno puede forzar a getty a reaparecer matando manualmente bash (o login) ya sea pulsando la tecla k, etc. mientras está en «top» o con el comando «kill». Es probable que tenga que matarlo con la señal 9 (que no puede ser ignorada).
Si getty ejecuta desde la línea de comandos: Los programas se detienen
Normalmente debería ejecutar getty desde dentro /etc/inittab y no desde la línea de comandos o de lo contrario algunos programas que se ejecutan en la terminal podrían ser suspendidos (detenidos) inesperadamente. Aquí está el por qué (pase a la siguiente sección si el por qué no es importante para usted). Si inicia getty para decir ttyS1 desde la línea de comandos de otro terminal, digamos tty1, entonces tendrá tty1 como su «terminal de control» aunque el terminal en el que se ejecuta sea ttyS1. Por lo tanto, tiene el terminal de control equivocado. Pero si se inicia dentro del archivo inittab entonces tendrá ttyS1 como terminal de control (correcto).
Aunque la terminal de control esté equivocada, el inicio de sesión en ttyS1 funciona bien (ya que usted dio ttyS1 como argumento para getty). La entrada y la salida estándar se ajustan a ttyS1 aunque el terminal de control siga siendo tty11. Otros programas que se ejecutan en ttyS1 pueden heredar esta entrada/salida estándar (que está conectada a ttyS1) y todo está bien. Pero algunos programas pueden cometer el error de intentar leer desde su terminal de control (tty1) lo cual es incorrecto. Ahora tty1 puede pensar que estos programas están siendo ejecutados en segundo plano por tty1 por lo que un intento de leer desde tty1 (debería haber sido ttyS1) resulta en detener el proceso que intentó leer. (Un proceso en segundo plano no puede leerse desde su terminal de control). Usted puede ver un mensaje algo como: » [1]+ Parado » en la pantalla. En este punto usted está atascado ya que no puede interactuar con un proceso que está tratando de comunicarse con usted a través de la terminal equivocada. Por supuesto que para escapar de esto puedes ir a otra terminal y matar el proceso, etc.
agetty (puede ser llamado getty)
Una línea de ejemplo en /etc/inittab:
S1:23:respawn:/sbin/getty -L 19200 ttyS1 vt102
S1 es de ttyS1. 23 significa que getty se ejecuta al entrar en los niveles de ejecución 2 ó 3. respawn significa que si getty (o un proceso que lo reemplazó como bash) es asesinado, getty automáticamente se iniciará (respawn) de nuevo. /sbin/getty es el comando getty. La -L significa Local (ignorar las señales de control del módem). -h (no se muestra en el ejemplo) permite el control de flujo de hardware (igual que stty crtscts). 19200 es la velocidad en baudios. ttyS1 significa /dev/ttyS1 (COM2 en MS-DOS). vt102 es el tipo de terminal y este getty establecerá la variable de entorno TERM a este valor. No hay archivos de configuración. Escribe «init q» en la línea de comandos después de editar getty y verás un prompt de inicio de sesión.
Autodetección de problemas de paridad de Agetty
El programa agetty intentará detectar automáticamente la paridad establecida dentro del terminal (incluyendo la no paridad). No admite bytes de datos de 8 bits más paridad de 1 bit. Véase bytes de datos de 8 bits (más paridad). Si utiliza stty para establecer la paridad, agetty la desactivará automáticamente ya que inicialmente quiere que el bit de paridad pase como si fuera un bit de datos. Esto se debe a que necesita obtener el último bit (posiblemente un bit de paridad) a medida que escribe su nombre de usuario para que pueda detectar automáticamente la paridad. Por lo tanto, si utiliza la paridad, habilítela sólo dentro del terminal de texto y deje que agetty la detecte automáticamente y la configure en el ordenador. Si su terminal soporta la paridad recibida, el prompt de inicio de sesión se verá confuso hasta que usted escriba algo para que getty pueda detectar el
paridad. El mensaje distorsionado disuadirá a los visitantes, etc. de intentar iniciar sesión. Eso podría ser justo lo que quieres.
A veces hay un problema con la detección automática de la paridad. Esto sucede porque después de que escriba su nombre de usuario por primera vez, agetty inicia el programa de inicio de sesión para terminar de iniciar sesión. Desafortunadamente, el programa login no puede detectar la paridad, por lo que si el programa getty no puede determinar la paridad, entonces login tampoco podrá determinarla. Si el primer intento de inicio de sesión falla, el inicio de sesión le permitirá volver a intentarlo, etc. (todos con la paridad mal ajustada). Eventualmente, después de un número de intentos fallidos de inicio de sesión (o después de un tiempo de espera) , agetty se iniciará de nuevo e iniciará las secuencias de inicio de sesión de nuevo. Una vez que getty se esté ejecutando de nuevo, puede ser capaz de detectar la paridad en el segundo intento para que todo funcione bien.
Con una paridad incorrecta, el programa de inicio de sesión no puede leer correctamente lo que escribe y no puede iniciar sesión. Si su terminal soporta la paridad recibida, continuará viendo una pantalla ilegible. Si getty no detecta la paridad, un archivo /etc/issue es descargado a la pantalla justo antes del prompt, por lo que pueden aparecer más palabras confusas en la pantalla.
¿Por qué agetty no puede detectar la paridad con la primera letra escrita? Aquí hay un ejemplo: Suponga que detecta un byte de 8 bits con su bit de paridad 0 (bit de alto orden) y con un número impar de 1 bits. ¿Qué paridad es esa? Bueno, el número impar de 1 bits implica que es paridad impar. Pero también podría ser un carácter de 8 bits sin paridad. Hasta ahora no hay forma de determinar cuál. Pero hasta ahora hemos eliminado la posibilidad de una paridad equitativa. La detección de la paridad procede así por un proceso de eliminación.
Si el siguiente byte escrito es similar al primero y sólo elimina la posibilidad de paridad paritaria, sigue siendo imposible determinar la paridad. Esta situación puede continuar indefinidamente y en raras ocasiones el inicio de sesión fallará hasta que cambie su nombre de usuario. Si agetty encuentra un bit de paridad de 1, asumirá que es un bit de paridad y no un bit de alto orden de un carácter de 8 bits. Por lo tanto, asume que no utiliza meta-caracteres (high bit set) en su nombre de usuario (es decir, que su nombre está en ASCII).
Uno puede entrar en un «bucle de inicio de sesión» de varias maneras. Suponga que sólo escribe una o dos letras para su nombre de usuario y luego presiona return. Si estas letras no son suficientes para la detección de paridad, entonces el inicio de sesión se ejecuta antes de que se haya detectado la paridad. A veces este problema ocurre si no tiene el terminal encendido y/o conectado cuando agetty arranca por primera vez.
Si se queda atascado en este «bucle de inicio de sesión», una forma de salir de él es presionar la tecla de retorno varias veces hasta que obtenga el indicador de inicio de sesión de getty. Otra forma es esperar un minuto más o menos por un tiempo muerto. Entonces el programa getty pondrá en la pantalla el prompt de inicio de sesión de getty y usted podrá tratar de ingresar nuevamente.
Bytes de datos de 8 bits (más paridad)
Desafortunadamente, agetty no puede detectar esta paridad. Desde finales de 1999 no tiene ninguna opción para desactivar la detección automática de la paridad y, por lo tanto, detectará una paridad incorrecta. El resultado es que el proceso de inicio de sesión será confuso y la paridad será incorrecta. Por lo tanto, no parece factible intentar utilizar bytes de datos de 8 bits con paridad.
getty (parte de getty_ps)
(La mayor parte de esto es del antiguo Serial-HOWTO de Greg Hankins)
Para este getty es necesario poner entradas en un fichero de configuración y añadir una entrada en /etc/inittab . Algunos ejemplos de entradas a usar para su terminal que usted pone en el archivo de configuración /etc/gettydefs .
Tenga en cuenta que los DT38400, DT19200, etc. son sólo etiquetas y deben ser las mismas que las que utiliza en /etc/inittab .
Si quieres, puedes hacer que getty imprima cosas interesantes en el banner de inicio de sesión. En mis ejemplos, tengo impreso el nombre del sistema y la línea serie. Puedes añadir otras cosas: Entre comillas
shade=sí]
Cuando termine de editar /etc/gettydefs , puede verificar que la sintaxis es correcta:
Asegúrese de que no hay ningún otro archivo de configuración getty o uugetty para el puerto serie al que está conectado su terminal, como ( /etc/default/{uu}getty.ttyS N o /etc/conf.{uu}getty.ttyS N ), ya que esto probablemente interferirá con la ejecución getty en una terminal. Elimine estos archivos conflictivos si salen.
Edite su archivo /etc/inittab para que se ejecute getty en el puerto serie (sustituyendo en la información correcta su entorno – puerto, velocidad y tipo de terminal por defecto):
En este punto, debería ver un indicador de inicio de sesión en su terminal. Puede que tenga que presionar «return» para llamar la atención de la terminal.
mgetty
La «m» significa módem. Este programa es principalmente para módems y a partir de mediados de 2000 será necesario recompilarlo para utilizarlo en terminales de texto (a menos que se utilice el control de flujo por hardware, y eso normalmente requiere un cable hecho a mano). La documentación de los bornes conectados directamente se encuentra en el capítulo «Directo» del manual: mgetty.texi.
Mire las últimas líneas de /etc/mgetty/mgetty/mgetty.config para ver un ejemplo de configuración para un terminal. A menos que diga «toggle-dtr no», pensará que tiene un módem y dejará caer (negar) el pin DTR en el PC en un intento vano de restablecer el módem inexistente. A diferencia de otros gettys, mgetty no se adhiere a una terminal hasta que alguien golpea cualquier llave de esa terminal, así que verás un ? para la terminal en arriba o ps hasta que esto suceda. Los registros en /var/log/mgetty/ pueden mostrar algunos mensajes de advertencia que sólo son aplicables a módems que puede ignorar.
He aquí un ejemplo de la línea simple que pusiste en /etc/inittab: