Cree la definición de servicio.

Cree la definición de servicio.

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, tty6por 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 NAutoVTsen el logind.confarchivo de configuración. Esto es tty1por tty6defecto.
  • Eso deja tty7libre en el mundo Fedora. Pero en el mundo Debian, aunque Debian es ahora un sistema operativo systemd, la interfaz gráfica de usuario utiliza tty7. 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 NAutoVTsconfiguración logind.confde 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.servicey cablear el nombre del dispositivo terminal en la unidad reemplazándolo %Icon (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@ttynorteen 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 NAutoVTshabilitar 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@ttynorte

Las personas están inmersas en las formas de modificar /etc/ttysy /etc/inittabven [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 { ,,} ano mines 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.fgettygetty

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=yesjugar con utmpxun 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 tty8es sencillo con la plantilla anterior. Simplemente cree una instancia en tty8lugar 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@tty5amy-terminal-ui@tty5

Esta es la progresión lógica desde la edición [email protected], ya que obviamente laautovt@ttynorteLos alias son unlo que sea que deba comenzar aquímecanismo que permite sustituir otras cosas porgetty@ttynorte.

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

Respuesta2

Puede hacerlo reemplazando el programa de inicio de sesión utilizado por gettysu propio programa. Por ejemplo, en mi máquina Debian, las gettyllamadas 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-lopció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 gettydefiniciones 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 locatepara 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.targety su destino getty.targetno contienen llamadas a agetty.

CentOS6 está en el medio: mi máquina tiene mingettyy 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 $TTYvariable, por cierto, está configurada en /etc/init/start-ttys.conf(el initscriptspaquete 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.

información relacionada