De quoi a-t-on besoin pour un démarrage minimal de systemd pour lancer getty sur une console virtuelle?

21

Pour SysV init, j'ai besoin de /etc/inittabréapparaître les entrées de getty, le /sbin/initbinaire, les binaires et les bibliothèques partagées pour le shell login, le getty, le PAM / security / shadow et quelques fichiers de périphérique.

Car upstartj'ai besoin à peu près des mêmes exigences, mais au lieu de /etc/inittab, j'ai quelques *.conffichiers sous /etc/init: un * .conf start on startupqui définit un niveau d'exécution avec telinit, et un * .conf pour chaque tty qui démarre / respawn gettysur ce tty sur les niveaux d'exécution appropriés .

De quelle configuration et de quels fichiers binaires ai-je besoin systemd init?

La documentation que je trouve semble être axée sur la façon d'utiliser un système déjà installé pour démarrer et arrêter des services.

Une liste minimale de fichiers à copier (à l'exception du noyau / initrd) à partir d'une installation Arch ou fedora en cours d'exécution ferait l'affaire, mais je n'arrive pas à trouver ce genre d'informations systemd.


Ce que je voudrais savoir, c'est, pour systemdquels fichiers sont requis, et ce qu'ils doivent contenir, pour démarrer un shell de connexion après qu'un initramfs ait switch_rootappelé le systemd /sbin/init.


Exemple pour upstart, les binaires et deux *.conffichiers:

Fichier /etc/init/whatever.conf:

démarrer au démarrage
émet le niveau d'exécution
tâche
scénario
  telinit 2
script de fin

Fichier /etc/init/tty1.conf:

démarrer au niveau d'exécution [12345]
respawn
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Exemple pour sysvinit, les fichiers binaires et 1 fichier conf nommé /etc/inittab:

id: 2: initdefault:
c1: 12345: réapparition: / sbin / agetty 38400 tty1 linux

Maintenant, je cherche l' systemdéquivalent.

Je suppose qu'au moins 1 *.servicefichier est nécessaire quelque part, avec une [Service]entrée contenant ExecStart=-/sbin/agetty --noclear %I linuxet Restart=always, mais quoi d'autre est nécessaire?

MattBianco
la source
Il existe maintenant un article récent de la base de connaissances RedHat (754933) décrivant le démarrage de systemd à cette URL: Vue d'ensemble de systemd pour RHEL 7
MattBianco
C'est tellement déprimant de voir comment les gens font exploser une seule ligne de configuration dans un gros gâchis et l'appellent amélioration.
ceving

Réponses:

17

Tout d'abord, ce systemdn'est pas un Unix traditionnel init. Systemd est tellement plus, il est donc un peu injuste de comparer les deux.

Pour répondre à la question, ce qui semble nécessaire, ce sont quelques binaires et les fichiers de configuration suivants:

/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

l'émission systemctl enable console-getty.service [email protected]crée ensuite ces liens symboliques:

/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

REMARQUE : Pour utiliser systemdles fonctionnalités spéciales de pour démarrer agettydynamiquement, à la demande en appuyant sur Alt+ F3et ainsi de suite, il semble que vous devez également avoir au moins ces deux fichiers:

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

[email protected]est un lien symbolique vers [email protected].

Contenu des fichiers de configuration:

Le default.target, getty.target, les sysinit.targetfichiers peuvent être vides , sauf pour l' [Unit]étiquette et (probablement) Description=xxx.

basic.target contient également des informations de dépendance:

[Unité]
Description = Système de base
Requiert = sysinit.target
Veut = sockets.target timers.target paths.target slices.target
After = sysinit.target sockets.target timers.target paths.target slices.target

Je ne sais pas si les références à des cibles qui n'existent pas en tant que fichiers sont nécessaires ou non. Ils sont décrits sur la systemd.special(7)page de manuel.


console-getty.service: (Cas particulier pour agetty sur la console)

[Unité]
Description = Console Getty
Après = systemd-user-sessions.service plymouth-quit-wait.service
Avant = getty.target

[Un service]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
Type = inactif
Redémarrer = toujours
RestartSec = 0
UtmpIdentifier = contre
TTYPath = / dev / console
TTYReset = oui
TTYVHangup = oui
KillMode = processus
IgnoreSIGPIPE = non
SendSIGHUP = oui

[Installer]
WantedBy = getty.target

[email protected]: (configuration générique pour tous les services de Getty sauf la console)

[Unité]
Description = Getty sur% I
Après = systemd-user-sessions.service plymouth-quit-wait.service
Avant = getty.target
IgnoreOnIsolate = oui
ConditionPathExists = / dev / tty0

[Un service]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Type = inactif
Redémarrer = toujours
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = oui
TTYVHangup = oui
TTYVTDisallocate = non
KillMode = processus
IgnoreSIGPIPE = non
SendSIGHUP = oui

[Installer]
WantedBy = getty.target
DefaultInstance = tty1

Enfin, vous avez probablement besoin de quelques-uns de ces binaires spéciaux (je n'ai pas essayé ceux qui sont essentiels):

/ lib / systemd / systemd (/ sbin / init pointe généralement vers cela)
/ 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-activate
/ 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-resolu
/ 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

Pour résumer le processus de démarrage de systemd, je pense que cela fonctionne comme ceci:

  1. systemd localise basic.target(ou tous les *.targetfichiers?)
  2. dépendances sont résolues basées sur WantedBy=, Wants=, Before=, After=... directives dans la [Install]section des *.serviceet *.targetfichiers de configuration.
  3. *.services qui doivent démarrer (qui ne sont pas des services "spéciaux"), ont une [Service]section avec une ExecStart=directive, qui indique l'exécutable à démarrer.
MattBianco
la source
1
AFAIK la [Install]section n'est pas utilisée par la séquence de démarrage, seulement par systemctl enable. Ce que le démarrage regarde /etc/systemd/system/basic.target.wants/, ce sont les liens symboliques dans , qui sont créés par systemctl enable.
Stefan Majewsky
6

systemdcrée automatiquement un getty lorsque vous passez aux terminaux, jusqu'à un certain nombre maximum. La valeur par défaut est 6 (vous obtenez donc automatiquement un getty pour alt + f1 à alt + f6). Si vous voulez changer ce paramètre, vous pouvez le modifier /etc/systemd/logind.confpour changer le NAutoVTsparamètre en un autre nombre (max 12)

Si vous voulez qu'un getty apparaisse même si vous ne changez pas manuellement, vous pouvez ajouter un lien symbolique /usr/lib/systemd/system/[email protected]vers le /etc/systemd/system/getty.target.wants/répertoire:

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

cela entraînera la getty.targetnécessité d'un getty@service de plus . Une cible est une collection de services qui doivent être générés, le remplacement des niveaux d'exécution qui prend en charge les dépendances. La cible par défaut dépend degetty.target

Voir la FAQ systemd dans ArchWiki

edit: j'ai fait des recherches un peu plus dans la documentation .

Au démarrage, le systemddémon charge tous les systèmes de la defaultcible et leurs dépendances. Une cible est définie par les fichiers

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

Une cible a une liste de services attachés spécifiés par des liens symboliques dans les répertoires

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

La /etcversion remplace les valeurs par défaut de la distribution dans /usr/lib. Un seul des .targetfichiers est requis, alors qu'aucun répertoire n'est requis

gettyn'est qu'un des services parmi d'autres qui peuvent être exécutés par des scripts d'initialisation. Dans la distribution que j'ai vérifiée (fedora, arch) gettyest exécutée de deux manières différentes:

  1. Démarré par des scripts spécifiques pour chaque terminal (liens vers le /usr/lib/systemd/system/[email protected]fichier dans lequel le nom tty est remplacé par systemdpar le lien nom de fichier )
  2. Apporté automatiquement selon les besoins par logindlorsque l'utilisateur bascule vers un terminal virtuel (similaire à la manière dont les anciens inetdservices n'apparaissent que lorsqu'une demande arrive). logindest un démon différent distribué avec systemd, et lit sa configuration dans le /etc/systemd/logind.conffichier.

J'espère que c'est satisfaisant.

pqnet
la source
Je veux savoir quels fichiers sont nécessaires et ce qu'ils doivent contenir. Pourriez-vous résumer votre réponse avec une liste des fichiers requis et ce qui les fait lire dans quel ordre? Je manque des informations sur ce qui doit être trouvé dans ce répertoire. Je vais essayer de développer un peu ma question. Merci!
MattBianco
@MattBianco, vous êtes inutilement hostile envers systemd. J'en recherche un peu et cela semble assez simple, une fois que vous comprenez comment les choses fonctionnent
pqnet
1
Oui, je suis gâté par la documentation d'autres projets open source. Je suis désolé d'avoir l'air hostile. C'est juste frustrant qu'il ne semble pas y avoir de document simple expliquant le processus de démarrage. (Je comprends maintenant que c'est parce que systemd n'est pas simple.) De manière humoristique, je voudrais dire que c'est peut systemd- être hostile, comme lors d'une prise de contrôle hostile de la façon dont un système ouvert démarre. Il détourne GNU / Linux d'Unix. Je ne dis pas que c'est une mauvaise chose, mais c'est très différent de la façon dont les choses ont été traditionnellement. Et googler un peu indique que je ne suis pas seul.
MattBianco