Cosa è necessario per un avvio minimo di systemd per avviare getty su una console virtuale?


21

Per SysV init, ho bisogno di /etc/inittabrespawning voci Getty, il /sbin/initbinario, i binari e le librerie condivise per la shell, loginil getty, il / la sicurezza / roba ombra PAM, e un paio di file di dispositivo.

Perché upstartho bisogno praticamente degli stessi requisiti, ma invece di /etc/inittab, ho alcuni *.conffile sotto /etc/init: uno * .conf con start on startupcui viene impostato un runlevel telinite uno * .conf per ogni tty che inizia / respawn gettysu quel tty sui runlevel appropriati .

Di quale configurazione e binari ho bisogno systemd init?

La documentazione che trovo sembra concentrarsi su come utilizzare un sistema già installato per avviare e arrestare i servizi.

Un elenco minimo di file da copiare (tranne il kernel / initrd) da un'installazione Arch o fedora in esecuzione andrebbe bene, ma non riesco a trovare quel tipo di informazioni systemd.


Quello che vorrei sapere è, perché systemd, quali file sono richiesti e cosa devono contenere, per avviare una shell di login dopo che un initramfs lo switch_rootchiama systemd /sbin/init.


Esempio per upstart, i *.conffile binari e due file:

File /etc/init/whatever.conf:

avviare all'avvio
emette runlevel
compito
copione
  telinit 2
fine script

File /etc/init/tty1.conf:

start on runlevel [12345]
respawn
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Esempio per sysvinit, i file binari e 1 file di configurazione denominato /etc/inittab:

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

Ora sto cercando l' systemdequivalente.

Presumo *.serviceche sia necessario almeno 1 file da qualche parte, con una [Service]voce contenente ExecStart=-/sbin/agetty --noclear %I linuxe Restart=always, ma cos'altro è necessario?


Ora c'è un recente articolo della knowledge base di RedHat (754933) che descrive l'avvio di systemd in questo URL: Panoramica di systemd per RHEL 7
MattBianco,

È così deprimente vedere come le persone fanno saltare in aria una singola linea di configurazione e la chiamano miglioramento.
ceving

Risposte:


17

Prima di tutto, systemdnon è un unix tradizionale init. Systemd è molto di più, quindi è un po 'ingiusto confrontare i due.

Per rispondere alla domanda, ciò che sembra necessario sono alcuni file binari e i seguenti file di configurazione:

/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/getty@.service
/usr/lib/systemd/system/console-getty.service

l'emissione systemctl enable console-getty.service getty@tty2.servicequindi crea questi collegamenti simbolici:

/etc/systemd/system/default.target.wants/getty@tty2.service -> / lib / systemd / system / getty @ service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

NOTA : per utilizzare systemdle funzioni speciali per l'avvio agettydinamico, su richiesta quando si preme Alt+ F3e così via, sembra che sia necessario disporre almeno di questi due file:

/etc/systemd/logind.conf
/lib/systemd/system/autovt@.service

dove autovt@.serviceè un link simbolico a getty@.service.

Contenuto dei file di configurazione:

Il default.target, getty.target, sysinit.targeti file possono essere vuoto tranne che per il [Unit]tag e (probabilmente) Description=xxx.

basic.target contiene anche informazioni sulla dipendenza:

[Unità]
Descrizione = Sistema di base
Richiede = sysinit.target
Wants = sockets.target timers.target paths.target slices.target
After = sysinit.target sockets.target timers.target paths.target slices.target

Non sono sicuro se i riferimenti a target che non esistono come file sono necessari o meno. Sono descritti nella systemd.special(7)pagina man.


console-getty.service: (Caso speciale per agetty sulla console)

[Unità]
Descrizione = Console Getty
After = systemd-user-sessioni.service plymouth-quit-wait.service
Prima = getty.target

[Servizio]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
Tipo = inattiva
Restart = sempre
RestartSec = 0
UtmpIdentifier = cons
TTYPath = / dev / console
TTYReset = yes
TTYVHangup = yes
KillMode = processo
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Installare]
WantedBy = getty.target

getty@.service: (configurazione generica per tutti i servizi getty tranne la console)

[Unità]
Descrizione = Getty su% I
After = systemd-user-sessioni.service plymouth-quit-wait.service
Prima = getty.target
IgnoreOnIsolate = yes
ConditionPathExists = / dev / tty0

[Servizio]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Tipo = inattiva
Restart = sempre
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = yes
TTYVHangup = yes
TTYVTDisallocate = no
KillMode = processo
IgnoreSIGPIPE = no
SendSIGHUP = yes

[Installare]
WantedBy = getty.target
DefaultInstance = tty1

Finalmente probabilmente avrai bisogno di alcuni di questi binari speciali (non ho provato quali sono cruciali):

/ lib / systemd / systemd (/ sbin / init di solito punta a questo)
/ Lib / systemd / systemd-logind
/ Lib / systemd / systemd-cgroups-agent
/ lib / systemd / systemd-user-sessioni
/ Lib / systemd / systemd-vconsole-setup
/ Lib / systemd / systemd-update-utmp
/ Lib / systemd / systemd-sonno
/ 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-retroilluminazione
/ 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-lavorati
/ Lib / systemd / systemd-moduli carico
/ Lib / systemd / systemd-multi-sedile-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-rimontare-FS
/ Lib / systemd / systemd-risolto
/ Lib / systemd / systemd-rfkill
/ Lib / systemd / systemd-spegnimento
/ Lib / systemd / systemd-shutdownd
/ Lib / systemd / systemd-presa-proxyd
/ Lib / systemd / systemd-timedated
/ Lib / systemd / systemd-timesyncd
/ Lib / systemd / systemd-udevd
/ Lib / systemd / systemd-update-fatto

Per riassumere il processo di avvio di systemd, penso che funzioni in questo modo:

  1. systemd individua basic.target(o tutti i *.targetfile?)
  2. le dipendenze sono risolte basano su WantedBy=, Wants=, Before=, After=... direttive nel [Install]settore delle *.servicee *.targetdei file di configurazione.
  3. *.serviceche dovrebbero iniziare (che non sono servizi "speciali"), avere una [Service]sezione con una ExecStart=direttiva, che indica l'avvio dell'eseguibile.

1
AFAIK la [Install]sezione non è utilizzata dalla sequenza di avvio, ma solo da systemctl enable. Ciò che viene avviato è il collegamento simbolico /etc/systemd/system/basic.target.wants/, creato da systemctl enable.
Stefan Majewsky,

6

systemdcrea automaticamente un getty quando passi ai terminali, fino a un certo numero massimo. Il valore predefinito è 6 (quindi ottieni automaticamente un getty per alt + f1 in alt + f6). Se si desidera modificare questo parametro, è possibile modificare /etc/systemd/logind.confper modificare il NAutoVTsparametro in un altro numero (massimo 12)

Se si desidera un getty per deporre le uova, anche se non si cambia manualmente è possibile aggiungere un link simbolico /usr/lib/systemd/system/getty@.servicealla /etc/systemd/system/getty.target.wants/directory:

ln -sf /usr/lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service

questo comporterà la getty.targetnecessità di richiedere un ulteriore getty@servizio. Un obiettivo è una raccolta di servizi che devono essere generati, la sostituzione di runlevel che supporta le dipendenze. Il target predefinito dipende dagetty.target

Vedi le FAQ di systemd in ArchWiki

modifica: ho cercato un po 'di più nella documentazione .

All'avvio il systemddaemon carica tutti i sistemi nella defaultdestinazione e le relative dipendenze. Una destinazione è definita dai file

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

Una destinazione ha un elenco di servizi collegati specificati da collegamenti simbolici nelle directory

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

La /etcversione sovrascrive i valori predefiniti di distribuzione in /usr/lib. È richiesto solo uno dei .targetfile, mentre non è richiesta alcuna directory

gettyè solo uno dei servizi che possono essere eseguiti dagli script init. Nella distribuzione che ho controllato (fedora, arch) gettyviene eseguito in due modi diversi:

  1. Iniziato da script specifici per ciascun terminale (collegamenti al /usr/lib/systemd/system/getty@.servicefile in cui il nome tty è sostituito systemddal nome file del collegamento )
  2. Viene visualizzato automaticamente quando necessario loginddall'utente quando passa a un terminale virtuale (in modo analogo al modo in cui i vecchi inetdservizi vengono visualizzati solo quando arriva una richiesta). logindè un demone diverso distribuito con systemde legge la sua configurazione dal /etc/systemd/logind.conffile.

Spero che questo sia soddisfacente.


Voglio sapere quali file sono necessari e cosa devono contenere. Potresti riassumere la tua risposta con un elenco di file richiesti e che cosa li fa leggere in quale ordine? Mi mancano informazioni su ciò che deve essere trovato in quella directory. Proverò a elaborare un po 'la mia domanda. Grazie!
MattBianco,

@MattBianco sei inutilmente ostile verso systemd. Sto studiando un po 'e sembra abbastanza semplice, una volta capito come funzionano le cose
pqnet

1
Sì, sono viziata dalla documentazione di altri progetti open source. Mi dispiace di sembrare ostile. È frustrante che non sembra esserci un semplice documento che spieghi il processo di avvio. (Capisco ora che è perché systemd non è semplice.) In modo umoristico, vorrei commentare che forse systemdè quello ostile, come nell'eseguire un'acquisizione ostile dell'avvio di un sistema aperto. Allontana GNU / Linux da Unix. Non dire che è una brutta cosa, ma è molto diverso da come sono state le cose tradizionalmente. E cercare un po 'in giro indica che non sono solo.
MattBianco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.