
Quiero que centos muestre un tui (programa ncurses) después del arranque y sin iniciar sesión. No quiero que se muestre el mensaje de inicio de sesión.
Funciones del programa: configuración de red, reinicio, apagado
¿Hay alguna forma de lograrlo?
Respuesta1
La respuesta systemd de M. Dickey es un poco vaga. Aquí están los detalles de un sistema operativo systemd.
El servicio que presenta el mensaje de inicio de sesión es una instancia de la [email protected]
plantilla, [email protected]
para el servicio de inicio de sesión, tty6
por ejemplo. Para reemplazar esto con su propio servicio en dicho dispositivo terminal, debe hacer dos cosas.
Cree la definición de servicio.
Esto es bastante fácil:
# /etc/systemd/sistema/[correo electrónico protegido] [Unidad] Descripción=Interfaz de usuario personalizada en %I Documentación = https://unix.stackexchange.com/a/318336/5132 Conflictos=getty@%I.service Antes = getty.target [Servicio] ExecStart=/usr/local/sbin/mi-interfaz-de-usuario-personalizada Entrada estándar=tty Salida estándar=tty Reiniciar=siempre ReiniciarSeg=1 IdentificadorUtmp=%I TTYPath=/dev/%I TTYReset=sí TTYVColgar=sí TTYVTDisallocate=sí EnviarSIGHUP=sí [Instalar] WantedBy=multiusuario.objetivo
Esto es unplantillaunidad de servicio, de la que se creará una instancia con el nombre de un dispositivo terminal virtual del kernel como parámetro de plantilla.
Asegúrese de que su servicio se inicie automáticamente en el arranque.
Esta es la parte más compleja.
Para empezar, debes decidircualdispositivo terminal virtual del kernel en el que se ejecutará. Aquí entran en juego varios datos:
- En el mundo Fedora, desde 2008, la interfaz gráfica de usuario utiliza el primer dispositivo terminal virtual del kernel,
tty1
. Debe elegir entre no utilizar ese dispositivo terminal virtual y no utilizar (o ajustar manualmente) la interfaz gráfica de usuario. - El inicio de sesión de systemd intenta solicitar el inicio de servicios de inicio de sesión en terminales virtuales del kernel hasta el máximo establecido
NAutoVTs
en ellogind.conf
archivo de configuración. Esto estty1
portty6
defecto. - Eso deja
tty7
libre en el mundo Fedora. Pero en el mundo Debian, aunque Debian es ahora un sistema operativo systemd, la interfaz gráfica de usuario utilizatty7
. Es posible que desee considerar la posibilidad de realizar la migración a Debian. - El mundo systemd intenta hacer que la terminal virtual del kernel #6 sea el mensaje de inicio de sesión que "siempre está ahí", aquel para el cual la memoria muscular te hace presionar Control+ Alt+ F6.
Digamos que eliges tty5
.
Debe evitar que logind inicie a pedido [email protected]
, que es otro nombre para [email protected]
, cada vez que el usuario cambie al terminal virtual del kernel n.° 5. Puede hacer esto reduciendo la NAutoVTs
configuración logind.conf
de 6 a (digamos) 4.
Debe asegurarse de que su servicio se inicie automáticamente en el arranque del sistema, es decir, que esté "habilitado":
habilitar systemctl[correo electrónico protegido]
Alternativas
Hay otras formas de hacer esto.
un servicio sin plantilla
En lugar de [email protected]
tener my-terminal-ui.service
y cablear el nombre del dispositivo terminal en la unidad reemplazándolo %I
con (digamos) tty5
.
He proporcionado esto como una definición de plantilla porque hace que sea más fácil tomar una decisión diferente a tty5
.
usando uno deautovt@tty
norteen lugar de tu propio nombre
Podría decidir utilizarlo como nombre de la definición de su servicio. Esto anularía la creación de instancias de la plantilla./etc/systemd/system/[email protected]
[email protected]
La ventaja de este enfoque es que no necesita preocuparse por NAutoVTs
habilitar el servicio en absoluto, y puede simplemente dejar logind para iniciar el servicio a pedido cada vez que el usuario cambie al terminal virtual del kernel n.° 5.
La desventaja es que el mecanismo de inicio por demanda fue diseñadono ejecutar procesos de inicio de sesiónen terminales virtuales del kernel no utilizados. Como tal, su servicio no se ejecutará en el arranque del sistema, sino que solo se ejecutará la primera vez que active la terminal virtual n.° 5 del kernel. Es posible que esta puesta en marcha bajo demanda no sea lo que desea. Otras partes de su sistema personalizado pueden esperar que su servicio seaya corriendodesde bootstrap en adelante, por ejemplo.
editando ungetty@tty
norte
Las personas están inmersas en las formas de modificar /etc/ttys
y /etc/inittab
ven [email protected]
la forma de hacer las cosas. Ejecutan comandos como
sistemactl editar[correo electrónico protegido]
y agregue una anulación que indique
[Servicio] # Esta tarea en blanco no es un error de imprenta. InicioEjecutivo= ExecStart=/usr/local/sbin/mi-interfaz-de-usuario-personalizada
Esto tiene varios problemas.
haciendo un servicioque se llama gettyNo ejecutar un programa { ,,} a
no min
es una idea muy fácil de mantener. Dentro de unos años, cuando hayas olvidado lo que has hecho aquí, o cuando alguien más se haga cargo de la administración de dicho sistema, no será obvio que los servicios "getty" no siempre ejecutan una utilidad.f
getty
getty
No lo consideres [email protected]
un espacio paralo que sea que se ejecute en esa terminal, para modificarlo según sea necesario. Esa no es realmente la forma en que systemd piensa sobre esto. [email protected]
ejecuta un programa "getty". Un servicio que ejecuta un programa completamente diferente que no ejecuta nada parecido a un servicio "getty" debería ser una definición de servicio separada por derecho propio.
Además: una definición de servicio separada permite no definir el servicio como algo parecido a un servicio "getty". La definición de servicio anterior copia la mayor parte del comportamiento del servicio "getty", incluidotratando de limpiar tu pantalla(como el mundo quiere que hagas). Pero es posible que no desee, digamos, TTYReset=yes
jugar con utmpx
un servicio como el suyo que realmente no es un servicio de "inicio de sesión" y que tal vez no desee que se borre su pantalla de manera tan agresiva.
Además: una definición de servicio separada es más sencilla de cambiar en el futuro. Cambiar de tty5
(si eso no es satisfactorio) a tty8
es sencillo con la plantilla anterior. Simplemente cree una instancia en tty8
lugar de en tty5
. Es algo más difícil eliminar un conjunto de personalizaciones locales [email protected]
y luego volver a realizarlas [email protected]
.
alias autovt@tty5
amy-terminal-ui@tty5
Esta es la progresión lógica desde la edición [email protected]
, ya que obviamente laautovt@tty
norteLos alias son unlo que sea que deba comenzar aquímecanismo que permite sustituir otras cosas porgetty@tty
norte.
Pero sufre de las mismas desventajas antes mencionadas que usar el [email protected]
nombre directamente, en el sentido de que se ve involucrado con los intentos de logind deno iniciar servicios de inicio de sesiónque puede que no sea lo que quieres. En realidad eslo que sea que esté destinado a serdemanda-comenzó aquípor iniciar sesión.
Otras lecturas
- https://unix.stackexchange.com/a/194218/5132
- https://unix.stackexchange.com/a/233855/5132
- https://unix.stackexchange.com/a/236959/5132
- https://unix.stackexchange.com/a/316279/5132
- Jonathan de Boyne Pollard (2015).
/etc/inittab
es cosa del pasado.. Respuestas dadas con frecuencia.
Respuesta2
Puede hacerlo reemplazando el programa de inicio de sesión utilizado por getty
su propio programa. Por ejemplo, en mi máquina Debian, las getty
llamadas están en /etc/inittab
:
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
# <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100
# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3
mientras que Debian realmente usa agetty
:
NAME
agetty - alternative Linux getty
SYNOPSIS
agetty [-8chiLmnsUw] [-a user] [-f issue_file] [-H login_host] [-I
init] [-l login_program] [-t timeout] port baud_rate,... [term]
y que puede invocar un programa diferente usando el-l
opción:
-l, --login-program login_program
Invoke the specified login_program instead of /bin/login. This
allows the use of a non-standard login program (for example, one
that asks for a dial-up password or that uses a different pass‐
word file).
Su programa de propósito especial podría ejecutarse en cada "tty". Si hace esto, debe prestar atención para asegurarse de poder iniciar sesión directamente en la máquina para realizar el mantenimiento. Esto podría ser en modo de usuario único o mediante ssh. Las getty
definiciones no se aplican a ssh.
Con CentOS7, usando systemd, las cosas se organizan de otra manera, pero el resultado final es el mismo. Usando systemctl list-unit-files
, el servicio relevante es [email protected]
. Como cualquier otro servicio, este se puede personalizar. Usando locate
para obtener pistas:
/etc/selinux/targeted/modules/active/modules/getty.pp
/etc/systemd/system/getty.target.wants
/etc/systemd/system/getty.target.wants/[email protected]
/usr/lib/systemd/system/console-getty.service
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/multi-user.target.wants/getty.target
/usr/lib/systemd/system-generators/systemd-getty-generator
Los archivos /usr/lib/systemd/system/
contienen las solicitudes agetty
(que también tienen una página de manual en CentOS). Podrías modificarlos:
ExecStart=-/sbin/agetty --noclear --keep-baud pts/%I 115200,38400,9600 $TERM
El enlace simbólico /usr/lib/systemd/system/multi-user.target.wants/getty.target
y su destino getty.target
no contienen llamadas a agetty
.
CentOS6 está en el medio: mi máquina tiene mingetty
y no systemd
. Desde la página del manual:
MINGETTY(8) Linux Programmer's Manual MINGETTY(8)
NAME
mingetty - minimal getty for consoles
SYNOPSIS
mingetty [--noclear] [--nonewline] [--noissue] [--nohangup] [--nohost-
name] [--long-hostname] [--loginprog=/bin/login] [--nice=10]
[--delay=5] [--chdir=/home] [--chroot=/chroot] [--autologin username]
[--loginpause] tty
DESCRIPTION
mingetty is a minimal getty for use on virtual consoles. Unlike
agetty(8), mingetty is not suitable for serial lines. I recommend
using mgetty(8) for this purpose.
Me gusta agetty
, se puede personalizar:
--loginprog /bin/login
Change the login app.
Comience con su archivo de configuración:
# tty - getty
#
# This service maintains a getty on the specified device.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file tty.override and put your changes there.
stop on runlevel [S016]
respawn
instance $TTY
exec /sbin/mingetty $TTY
usage 'tty TTY=/dev/ttyX - where X is console id'
Eso nos lleva a buscar información sobre tty.override
, que según este
es un script que usted proporciona /etc/init/tty.override
(muestra un ejemplo de inicio de sesión automático en tty1 del cual puede obtener una idea general de lo que podría hacer el script). La $TTY
variable, por cierto, está configurada en /etc/init/start-ttys.conf
(el initscripts
paquete del que forman parte no tiene documentación detallada).
Respuesta3
Entonces, después de buscar en Google, encontré dos soluciones:
https://serverfault.com/questions/323289/replacing-tty-with-a-script-in-centos-6
y
https://www.centos.org/forums/viewtopic.php?t=2414
Finalmente se me ocurre lo siguiente:
1) Cree '/etc/init/launch.conf' con este contenido:
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [S016]
respawn
console owner
exec /usr/bin/openvt -c 1 -w -f -- /usr/sbin/setup
En este ejemplo, ejecuta la herramienta de configuración en modo texto.
2) Edite '/etc/init/start-ttys.conf' para reemplazar el tty con lanzamiento:
start on stopped rc RUNLEVEL=[2345]
env ACTIVE_CONSOLES=/dev/tty[1-6]
env X_TTY=/dev/tty1
task
script
. /etc/sysconfig/init
for tty in $(echo $ACTIVE_CONSOLES) ; do
[ "$RUNLEVEL" = "5" -a "$tty" = "$X_TTY" ] && continue
#initctl start tty TTY=$tty
initctl start launch TTY=$tty
done
end script
No sé si esta es la mejor solución, pero funciona y el programa de instalación se muestra después del arranque.