Comprender el / etc / inittab
On febrero 12, 2021 by admin Estoy usando el siguiente archivo /etc/inittab
(systemv):
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
Para entender cómo funcionan realmente las cosas, agradeceré que sus respuestas a las preguntas 1 y 3 puedan distinguir entre dos situaciones:
- Estoy conectado a mi sistema mediante un puerto serie.
- Tengo una PC de escritorio «normal».
Preguntas:
-
Si agrego otra línea getty, una vez que linux se inicie, veré dos terminales separadas.
-
Si abro varias líneas getty, ¿cómo asigné cuál getty ejecutará mi comando
si::sysinit:/etc/init.d/rcS
y ¿qué getty ejecutará los comandos de otros scripts? (los que ejecutan scripts de acuerdo con el nivel de ejecución del sistema)en otras palabras: en el archivo
/etc/inittab
, ¿puedo asignar diferentes comandos a diferentes gettys? (me refiero a los terminales que se abrirán con estos gettys) -
se ejecuta el último script en la carpeta /etc/init.d/rc5 el siguiente comando:
su nobody -c /bin/sh
y el resultado es:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
Así que verifiqué que no soy nadie pero ¿por qué escribe las dos primeras líneas? también por qué el indicador es sh-4.3 $ y no nadie @ …
-
Estoy usando una conexión en serie. ¿Puedo cambiar el archivo / etc / inittab y el último script que se ejecutará por init para:
- ejecutar un programa antes de iniciar sesión como usuario con pocos privilegios (el proceso de inicio esperará la terminación)
- una vez que el programa salga, obtenga el mensaje de inicio de sesión en mi sistema
- cuál es la mejor manera de crear un usuario con pocos privilegios y permitirle ejecutar este programa durante el proceso de inicio (si no quiero usar el usuario nadie)
Responder
Pregunta 1:
Sí, agregando más getty
líneas puede obtener más terminales en paralelo. Solo se puede asociar un getty
con un dispositivo terminal a la vez, por lo que solo es posible un getty
por puerto serie. En una PC de escritorio normal, el kernel de Linux define una serie de consolas virtuales, accesibles mediante las combinaciones de teclas Control + Alt + FX y correspondientes a /dev/ttyX
dispositivos (X = un número). La configuración exacta puede variar entre las distribuciones, pero generalmente en las distribuciones principales, los primeros 6 dispositivos /dev/ttyX
tienen getty
configurados para ellos cuando el sistema está funcionando normalmente. Puede usar los comandos openvt
y deallocvt
para agregar o quitar consolas virtuales e iniciar procesos (que pueden ser cualquier proceso, no necesariamente getty
s) en ellos.
/dev/tty0
es especial: se refiere a cualquier consola virtual que sea la seleccionada actualmente. /dev/console
es un dispositivo especial similar, que apunta a cualquier dispositivo TTY definido como la consola principal del sistema a nivel del kernel. En los sistemas de escritorio, es efectivamente un alias para /dev/tty0
de forma predeterminada, pero si usa la opción de arranque console=
puede cambiarlo a una Puerto. En p. Ej. algunas arquitecturas integradas puede ser un puerto serie por defecto. Las utilidades como xconsole
también pueden actuar como una salida adicional para /dev/console
.
Cuando las computadoras eran grandes cosas de gabinetes múltiples en salas de computadoras dedicadas, enviar un mensaje a /dev/console
habría sido una forma de comunicarse con el operador del sistema en servicio físicamente cerca de la computadora, lo que podría haber sido útil para solicitudes de, por ejemplo, cambiar cintas o paquetes de discos. En los sistemas modernos, los mensajes enviados específicamente a /dev/console
suelen ser mensajes de inicio / apagado, o posiblemente un canal de último recurso para alarmas urgentes sobre condiciones de falla que podrían afectar el acceso a la red o al almacenamiento, o incluso involucran una falla del kernel: «una persona a cargo del hardware físico necesita ver esto y los archivos de registro habituales no se pueden usar por alguna razón».
Pregunta 2:
Me temo que tienes un error. La línea sysinit
y otras /etc/inittab
no están asociadas con getty
procesos en absoluto. Cada comando ejecutado desde inittab
, a menos que se especifique lo contrario, tiene sus flujos de entrada, salida y error estándar asociados con /dev/console
.
Las líneas getty
realmente especifican el dispositivo TTY que usarán y el proceso getty
tiene un código incorporado que asignará ese dispositivo TTY por sí mismos y todos sus procesos secundarios a menos que / hasta que el usuario ejecute un shell y elija redirigir esos flujos de alguna otra manera.Eso y la inicialización de la configuración del dispositivo TTY son la mayor parte del propósito de getty
«: mostrar /etc/issue
y el mensaje de inicio de sesión, aceptando el nombre de usuario, configurar la variable de entorno TERM y comenzar el siguiente paso del proceso de inicio de sesión de TTY (generalmente /bin/login
pero personalizable) son, en realidad, partes menores.
Tenga en cuenta que hay es una convención que para los dispositivos TTY, el campo de identificación de dos caracteres en la primera columna de la línea inittab
debe coincidir con el nombre del dispositivo TTY en cuestión después de /dev/tty
prefijo, por lo que /dev/ttyS0
obtendrá un ID de línea inittab de S0
, y así sucesivamente. Para cosas que no está necesariamente asociado con ningún TTY (o simplemente envía material de emergencia a / dev / console si es necesario), la ID puede ser cualquier cosa que no entre en conflicto con las ID de línea del dispositivo TTY.
(Volver en el día en que los terminales conectados en serie eran los rm, obtener la configuración del dispositivo TTY correcta para el terminal en el otro extremo de la línea y restablecer ese terminal a un estado conocido para iniciar sesión no eran tareas triviales, ya que había muchos estándares de tipo de terminal en competencia).
Si configura una inittab
línea para ejecutar un script, podría, por ejemplo, ver si una /dev/ttyX
consola virtual en particular el dispositivo existe. Si no es así, puede usar openvt -c X <command>
para crear la consola virtual e iniciar un comando en ella; si el dispositivo de consola virtual ya existe, puede simplemente iniciar cualquier comando que desee con entrada, salida y error estándar redirigidos a él. Por ejemplo, podría especificar una línea inittab como esta:
6:345:respawn:/usr/local/sbin/myscript
y luego /usr/local/sbin/myscript
con algo como esto ( descargo de responsabilidad: no probado, no tengo un sistema con SysVinit a mano en este momento, siéntase libre de editar si puede mejorar esto):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
respawn
en la línea inittab
garantiza que el proceso se reinicie automáticamente si muere por cualquier motivo. 345
es la lista de niveles de ejecución de SysVinit en los que debe ejecutarse este proceso. Si necesita que se ejecute en todos los niveles de ejecución normales, ingrese 12345
.
Tenga en cuenta que esto funciona según lo previsto solo si la línea inittab se coloca después de la línea sysinit
, por lo que se puede suponer que la inicialización de udev
está completa. Si Si desea hacer esto al principio del proceso de inicio, es posible que primero deba encargarse de crear los nodos de dispositivo reales para los dispositivos que ya tienen controladores cargados; una vez que udev
se esté ejecutando, debería crear nodos de dispositivo automáticamente a medida que se inicializan los controladores de dispositivo.
Si usa un puerto serie, el openvt
no se aplicará.
Así que sí, definitivamente puede adjuntar diferentes comandos a diferentes dispositivos TTY. Ayuda si los comandos tienen funciones integradas para eso, como las de getty
, pero también puede hacerlo con secuencias de comandos.
(Si configura algo más complicado que un simple tail -f
para ver permanentemente algún registro en una consola virtual que de otro modo no se usaría, debe leer man setsid
y vea si es aplicable a lo que está planeando.)
Pregunta 3:
Hay más acerca de la inicialización de una sesión TTY para un usuario no root en particular que simplemente iniciar un shell con su
.
Los mensajes de error
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
probablemente se deben a que el shell está asociado con el dispositivo /dev/console
en lugar de un dispositivo TTY específico. Dado que /dev/console
es solo un alias para cualquiera que sea la consola del sistema actual, no tendrá disponible el conjunto completo de funciones ioctl de control de TTY.
Si no hay un script de inicio de sesión para asignar un valor más útil a la variable de entorno PS1
, el mensaje predeterminado para /bin/sh
puede ser simplemente sh-<version>$
.
Pregunta 4:
Sí, puede. Debe especificar el «último script» como una línea de tipo wait
en inittab
y colocarlo antes la línea getty
correspondiente a su línea serial.
Sin conocer muchos más detalles sobre su entorno, será muy difícil decir cuál sería el la mejor manera de crear un usuario con pocos privilegios para tales propósitos.
Comentarios
Responder
-
Sí, asumiendo la línea recibe un identificador único y la línea de terminal configurada está disponible:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
abrirá un terminal en el puerto serie conectado a
ttyS1
. -
Las líneas en
inittab
no son secuenciales ni están relacionadas con un inicio de sesión. Cada línea describe una acción a realizar en un conjunto determinado de niveles de ejecución. Por lo tanto,si::sysinit:/etc/init.d/rcS
especifica queinit
debe ejecutar/etc/init.d/rcS
cuando maneja la inicialización del sistema; esto sucede antes de que sea posible iniciar sesión. (Consulte lainittab(5)
página de manual para obtener más detalles).Para asignar diferentes comandos a diferentes
getty
s en terminales específicos, configuraría lagetty
invocación en sí, por ejemplo, cambiando lalogin
programa que inicia (la-l
opción en la mayoría degetty
implementaciones):S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
-
/etc/init.d/rc 5
se ejecuta antes de que sea posible iniciar sesión, y los programas que ejecuta no están conectados a una terminal («correctamente», que es lo que hacegetty
: abre el terminal y conecta los programas que inicia), por lo que cuando se invocasu nobody -c /bin/sh
, shell no encuentra la configuración de terminal que espera y, como resultado, desactiva el control de trabajos. El indicadorsh-4.3$
es el indicador predeterminado de Bash 4.3 cuando se ejecuta como/bin/sh
. -
Si se supone que su programa solo debe ejecutarse una vez que un usuario comienza a iniciar sesión, entonces puede conectarlo a la secuencia de inicio de sesión utilizada por
getty
; pero dicho programa se ejecutaría como root. Dependiendo de lo que esté buscando exactamente, probablemente sea mejor usar un script de inicio en lugar de la personalización de/etc/inittab
osudo
y el scripts de inicio de shell.
Comentarios
- gracias por su repetición. ¿Puedo pedir una pequeña aclaración sobre la sección 2? ¿Cómo puedo editar el comando de inicio de sesión para cada getty diferente?
- Listo, vea la actualización.
- ¡Gracias! solo para verificar si entendí correctamente: de manera predeterminada, el proceso getty ejecutará el comando / bin / login que ejecuta el proceso responsable del inicio de sesión del sistema. Ahora, getty ejecutará un comando diferente, cada comando que ‘ elegiré, y no llamará al proceso de inicio de sesión del sistema como antes … ¿verdad?
- Sí, eso es correcto. La clave es hacer que
getty
abra el TTY por usted; su comportamiento normal es esperar un nombre de inicio de sesión, luego ejecutarlogin
, conectado al TTY;login
espera la contraseña, la verifica e inicia el shell, también conectado al TTY. Si reemplaza la partelogin
, deberá asegurarse de que su programa de reemplazo se comporte comologin
. - Por ejemplo, si quiero omitir la fase de inicio de sesión, para poder abrir mi sistema con el usuario root sin ingresar ningún nombre de usuario o contraseña. Puedo usar: S0: 12345: respawn: / sbin / getty -L 115200 -l – / bin / sh ttyS0 o usar: S0: 12345: respawn: / sbin / getty -L 115200 -l [my_script_path] ttyS0 y dentro el script i ‘ ejecutaré el comando – / bin / sh y otros?
Respuesta
Ahora un segundo (¡largo!) se ha publicado la respuesta. Debo decir que el primero explica bastante bien. De momento quiero comentar el punto tres: es menos una cuestión de tiempo, sino de procesos que controlan un tty «virtual real», y no solo un «dummy de consola».
Antes de que pueda iniciar un shell «con control de trabajo», debe configurar, es decir, abrir un ttyN. El comando «genérico» es getty
. A partir de ese tty-algo que obtienes, puedes iniciar un shell, no solo después de eso.
Es como intentar iniciar primero un administrador de ventanas y luego xorg, en lugar de «arrancarlo» junto con xinit. Creo. «líder de sesión».
Debido a
xx:12:...:program
y, por el contrario:
aa:1:...:pr_1 bb:1:...:pr_2
… obtienes una relación N: M (también obtienes un lío si abusas – muchos RLs cada uno con muchos programas diferentes). Se puede llegar muy lejos con eso, pero desde que se han impuesto diferentes tipos de «estándares» de RC. «Runcoms». Con ellos, inittab parece simple, pero toda la complejidad está en estos scripts.
Pero su inittab parece simple y correcto: solo el último comentario y la entrada «z6» …
Tal vez su «su nadie» solo necesite un «getty … ttyN» antes / alrededor. su
en lugar de login
, y sin reaparición. Debería al menos dar otro mensaje de error que no sea «inapropiado».
Conclusión (después de leer la segunda respuesta): No necesita un sistema init.d
complicado, el inittab en bruto es lo suficientemente flexible. Solo tiene que obtener el concepto y los detalles correctos.
Puede configurar tres niveles de ejecución: uno con ttyN, uno con ttySN y un RL que inicie ambos. Es un parámetro de arranque que puede agregar con el cargador de arranque. Nivel de ejecución «5» en su caso es solo predeterminado. Usted elige un kernel, un root =, y un nivel de ejecución para iniciar.
La acción «respawn» es para lo que sysvinit era / es realmente necesario . Mucho más no hace, y menos habría sido posible implementar en un script. Pero si sale (o falla) del «último» nivel de shell, necesita una red de seguridad.
sysvinit puede incluso detectar una configuración incorrecta al error «generar demasiado rápido – ignorar durante 5 minutos …».
getty
es un proceso; de lo que estás hablando es de un dispositivo TTY . El núcleo abrió el primero para usted y para los scripts de inicio;/dev/console
es un alias para » el primer dispositivo TTY que abrió y usó el kernel «. Si su cuenta de usuario tiene los permisos para acceso de lectura + escritura a un dispositivo TTY, puede comenzar a usarlo (no se necesitagetty
), pero puede ser una buena idea configurar el TERM variable correctamente:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
oTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
iniciará el comandotop
en la octava consola virtual o el segundo puerto serie.getty
, hará un lío la entrada & salida, ya que los dos procesos lucharán por la entrada y sus salidas se mezclarán. Los procesosgetty
se inician solo después de/etc/init.d/rc 5
y todos los scripts iniciados por él han finalizado .