¿Qué se necesita para que un arranque systemd mínimo inicie getty en una consola virtual?

21

Para SysV init, necesito /etc/inittabreaparecer las entradas de getty, el /sbin/initbinario, los binarios y las bibliotecas compartidas para el shell login, el getty, el PAM / seguridad / material oculto y algunos archivos de dispositivo.

Porque upstartnecesito los mismos requisitos, pero en lugar de eso /etc/inittab, tengo algunos *.confarchivos debajo /etc/init: un * .conf con el start on startupque establece un nivel de ejecución telinity un * .conf para cada tty que se inicia / reaparece gettyen ese tty en los niveles de ejecución adecuados .

¿Para qué configuración y binarios necesito systemd init?

La documentación que encuentro parece estar centrada en cómo usar un sistema ya instalado para iniciar y detener servicios.

Una lista mínima de archivos para copiar (excepto el kernel / initrd) de una instalación de Arch o fedora en ejecución estaría bien, pero parece que no puedo encontrar ese tipo de información systemd.


Lo que me gustaría saber es, para systemdqué archivos son necesarios y qué deben contener, para iniciar un shell de inicio de sesión después de que un initramfs hace su switch_rootllamada al systemd /sbin/init.


Ejemplo para upstart, los binarios y dos *.confarchivos:

Archivo /etc/init/whatever.conf:

comenzar en el inicio
emite runlevel
tarea
guión
  telinit 2
fin de guión

Archivo /etc/init/tty1.conf:

comenzar en el nivel de ejecución [12345]
reaparecer
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Ejemplo para sysvinit, los binarios y 1 archivo conf llamado /etc/inittab:

id: 2: initdefault:
c1: 12345: reaparecer: / sbin / agetty 38400 tty1 linux

Ahora estoy tras el systemdequivalente.

Supongo *.serviceque se necesita al menos 1 archivo en alguna parte, con una [Service]entrada que contenga ExecStart=-/sbin/agetty --noclear %I linuxy Restart=always, pero ¿qué más se necesita?

MattBianco
fuente
Ahora hay un artículo reciente de la base de conocimiento de RedHat (754933) que describe el arranque de systemd en esta URL: Descripción general de systemd para RHEL 7
MattBianco
Es tan deprimente ver cómo las personas explotan una sola línea de configuración en un gran desastre y lo llaman mejora.
ceving

Respuestas:

17

En primer lugar, systemdno es un unix tradicional init. Systemd es mucho más, por lo que es un poco injusto comparar los dos.

Para responder la pregunta, lo que parece ser necesario son algunos binarios y los siguientes archivos de configuración:

/usr/lib/systemd/system/default.target
/usr/lib/systemd/system/basic.target
/usr/lib/systemd/system/sysinit.target
/usr/lib/systemd/system/getty.target
/usr/lib/systemd/system/[email protected]
/usr/lib/systemd/system/console-getty.service

la emisión systemctl enable console-getty.service [email protected]crea estos enlaces simbólicos:

/etc/systemd/system/default.target.wants/[email protected] -> / lib / systemd / system / getty @ service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

NOTA : Para utilizar systemdlas funciones especiales de inicio agettydinámico, bajo demanda al presionar Alt+ F3y así sucesivamente, parece que también debe tener al menos estos dos archivos:

/etc/systemd/logind.conf
/lib/systemd/system/[email protected]

donde [email protected]es un enlace simbólico a [email protected].

Contenido de los archivos de configuración:

El default.target, getty.target, sysinit.targetarchivos puede estar vacía a excepción de la [Unit]etiqueta y (probablemente) Description=xxx.

basic.target también contiene información de dependencia:

[Unidad]
Descripción = Sistema básico
Requiere = sysinit.target
Desea = sockets.target timers.target paths.target slices.target
Después = sysinit.target sockets.target timers.target paths.target slices.target

No estoy seguro de si las referencias a destinos que no existen como archivos son necesarias o no. Se describen en la systemd.special(7)página del manual.


console-getty.service: (Caso especial para agetty en la consola)

[Unidad]
Descripción = Consola Getty
Después = systemd-user-sessions.service plymouth-quit-wait.service
Antes = getty.target

[Servicio]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
Tipo = inactivo
Reiniciar = siempre
RestartSec = 0
UtmpIdentifier = cons
TTYPath = / dev / console
TTYReset = yes
TTYVHangup = yes
KillMode = proceso
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Instalar en pc]
WantedBy = getty.target

[email protected]: (configuración genérica para todos los servicios getty excepto la consola)

[Unidad]
Descripción = Getty en% I
Después = systemd-user-sessions.service plymouth-quit-wait.service
Antes = getty.target
IgnoreOnIsolate = yes
ConditionPathExists = / dev / tty0

[Servicio]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Tipo = inactivo
Reiniciar = siempre
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = yes
TTYVHangup = yes
TTYVTDisallocate = no
KillMode = proceso
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Instalar en pc]
WantedBy = getty.target
DefaultInstance = tty1

Finalmente, probablemente necesite algunos de estos binarios especiales (no he probado cuáles son cruciales):

/ lib / systemd / systemd (/ sbin / init generalmente apunta a esto)
/ lib / systemd / systemd-logind
/ lib / systemd / systemd-cgroups-agent
/ lib / systemd / systemd-user-sessions
/ lib / systemd / systemd-vconsole-setup
/ lib / systemd / systemd-update-utmp
/ lib / systemd / systemd-sleep
/ lib / systemd / systemd-sysctl
/ lib / systemd / systemd-initctl
/ lib / systemd / systemd-reply-password
/ lib / systemd / systemd-ac-power
/ lib / systemd / systemd-enable
/ lib / systemd / systemd-backlight
/ lib / systemd / systemd-binfmt
/ lib / systemd / systemd-bootchart
/ lib / systemd / systemd-bus-proxyd
/ lib / systemd / systemd-coredump
/ lib / systemd / systemd-cryptsetup
/ lib / systemd / systemd-fsck
/ lib / systemd / systemd-hostnamed
/ lib / systemd / systemd-journald
/ lib / systemd / systemd-journal-gatewayd
/ lib / systemd / systemd-journal-remote
/ lib / systemd / systemd-localed
/ lib / systemd / systemd-machined
/ lib / systemd / systemd-modules-load
/ lib / systemd / systemd-multi-seat-x
/ lib / systemd / systemd-networkd
/ lib / systemd / systemd-networkd-wait-online
/ lib / systemd / systemd-quotacheck
/ lib / systemd / systemd-random-seed
/ lib / systemd / systemd-readahead
/ lib / systemd / systemd-remount-fs
/ lib / systemd / systemd-resolve
/ lib / systemd / systemd-rfkill
/ lib / systemd / systemd-shutdown
/ lib / systemd / systemd-shutdownd
/ lib / systemd / systemd-socket-proxyd
/ lib / systemd / systemd-timedated
/ lib / systemd / systemd-timesyncd
/ lib / systemd / systemd-udevd
/ lib / systemd / systemd-update-done

Para resumir el proceso de inicio de systemd, creo que funciona más o menos así:

  1. systemd localiza basic.target(¿o todos los *.targetarchivos?)
  2. se resuelvan las dependencias basan en WantedBy=, Wants=, Before=, After=... directivas en el [Install]sector de las *.servicey *.targetlos archivos de configuración.
  3. *.services que deberían comenzar (que no son servicios "especiales"), tienen una [Service]sección con una ExecStart=directiva, que señala el ejecutable para comenzar.
MattBianco
fuente
1
AFAIK la [Install]sección no es utilizada por la secuencia de arranque, solo por systemctl enable. Lo que se ve en el arranque son los enlaces simbólicos /etc/systemd/system/basic.target.wants/, creados por systemctl enable.
Stefan Majewsky
6

systemdcrea automáticamente un getty cuando cambia a las terminales, hasta un cierto número máximo. El valor predeterminado es 6 (por lo que obtiene automáticamente un getty para alt + f1 a alt + f6). Si desea cambiar este parámetro, puede editar /etc/systemd/logind.confpara cambiar el NAutoVTsparámetro a otro número (máximo 12)

Si quieres un getty para desovar, incluso si no cambia de forma manual puede agregar un enlace simbólico a /usr/lib/systemd/system/[email protected]al /etc/systemd/system/getty.target.wants/directorio:

ln -sf /usr/lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

esto resultará en la getty.targetnecesidad de un getty@servicio más . Un objetivo es una colección de servicios que deben generarse, reemplazo de niveles de ejecución que admite dependencias. El objetivo predeterminado depende degetty.target

Consulte las preguntas frecuentes de systemd en ArchWiki

editar: investigué un poco más en la documentación .

Al arrancar, el systemddaemon carga todos los sistemas en el defaultdestino y sus dependencias. Los archivos definen un objetivo

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target

Un objetivo tiene una lista de servicios adjuntos especificados por enlaces simbólicos en los directorios

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants

La /etcversión anula los valores predeterminados de distribución en /usr/lib. Solo .targetse requiere uno de los archivos, mientras que no se requiere ninguno del directorio

gettyes solo uno de los servicios entre otros que pueden ejecutarse mediante scripts de inicio. En la distribución que verifiqué (fedora, arch) gettyse ejecuta de dos maneras diferentes:

  1. Comenzado por scripts específicos para cada terminal (enlaces al /usr/lib/systemd/system/[email protected]archivo en el que se sustituye el nombre tty por systemdel nombre del archivo del enlace )
  2. Se activa automáticamente según sea necesario logindcuando el usuario cambia a un terminal virtual (similar a la forma inetden que los servicios antiguos aparecían solo cuando llega una solicitud). logindes un demonio diferente distribuido con systemd, y lee su configuración del /etc/systemd/logind.confarchivo.

Espero que esto sea satisfactorio.

pqnet
fuente
Quiero saber qué archivos son necesarios y qué contendrán. ¿Podría resumir su respuesta con una lista de archivos necesarios y qué hace que se lean en qué orden? Me falta información sobre lo que hay que encontrar en ese directorio. Trataré de elaborar mi pregunta un poco. ¡Gracias!
MattBianco
@MattBianco eres innecesariamente hostil hacia systemd. Estoy investigando un poco y parece bastante sencillo, una vez que entiendes cómo funcionan las cosas
pqnet
1
Sí, la documentación de otros proyectos de código abierto me daña. Lo siento por sonar hostil. Es frustrante que no haya un documento simple que explique el proceso de arranque. (Ahora entiendo que se debe a que systemd no es simple). De una manera humorística, me gustaría comentar que tal vez systemdsea ​​hostil, como al realizar una adquisición hostil de la forma en que se inicia un sistema abierto. Desactiva GNU / Linux de Unix. No digo que sea algo malo, pero es muy diferente de cómo han sido las cosas tradicionalmente. Buscar en Google un poco indica que no estoy solo.
MattBianco