Co jest potrzebne, aby minimalny rozruch systemowy uruchomił getty na wirtualnej konsoli?

21

Dla SysV init, muszę /etc/inittabrespawning wpisy getty Z /sbin/initbinarnej pliki binarne i biblioteki współdzielone dla powłoki, loginThe getty, PAM / security / cień rzeczy, a kilka plików urządzeń.

Bo upstartpotrzebuję prawie takich samych wymagań, ale zamiast tego /etc/inittabmam kilka *.confplików poniżej /etc/init: jeden * .conf, start on startupktóry ustawia poziom uruchamiania telinit, i jeden * .conf dla każdego tty, który uruchamia się / odradza gettyna tym tty na odpowiednich poziomach pracy .

Jakiej konfiguracji i plików binarnych potrzebuję systemd init?

Wydaje mi się, że dokumentacja skupia się na tym, jak używać już zainstalowanego systemu do uruchamiania i zatrzymywania usług.

Minimalna lista plików do skopiowania (z wyjątkiem jądra / initrd) z działającej instalacji Arch lub Fedory byłaby w porządku, ale nie mogę znaleźć takich informacji na ten temat systemd.


Co chciałbym wiedzieć, na systemdco potrzebne są pliki i jakie muszą one zawierać, aby uruchomić powłokę logowania po initramfs nie jest to switch_rootwezwanie do systemd /sbin/init.


Przykład dla upstartplików binarnych i dwóch *.confplików:

Plik /etc/init/whatever.conf:

zacznij przy starcie
emituje poziom pracy
zadanie
scenariusz
  telinit 2
koniec skryptu

Plik /etc/init/tty1.conf:

uruchom na poziomie pracy [12345]
odrodzenie
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Przykład dla sysvinitplików binarnych i 1 pliku conf o nazwie /etc/inittab:

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

Teraz szukam systemdekwiwalentu.

Zakładam, że *.servicegdzieś potrzebny jest co najmniej 1 plik z [Service]wpisem zawierającym ExecStart=-/sbin/agetty --noclear %I linuxi Restart=always, ale co jeszcze jest potrzebne?

MattBianco
źródło
Teraz jest najnowszy artykuł bazy wiedzy RedHat (754933) opisujący rozruch systemowy pod tym adresem URL: Przegląd systemd dla RHEL 7
MattBianco
To bardzo przygnębiające widzieć, jak ludzie wysadzają jedną linię konfiguracji w wielki bałagan i nazywają to poprawą.
od

Odpowiedzi:

17

Po pierwsze, systemd nie jest to tradycyjny unix init. Systemd to o wiele więcej, więc porównywanie tych dwóch jest trochę niesprawiedliwe.

Aby odpowiedzieć na pytanie, niezbędne wydają się niektóre pliki binarne i następujące pliki konfiguracyjne:

/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

wydanie systemctl enable console-getty.service [email protected]następnie tworzy następujące dowiązania symboliczne:

/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

UWAGA : Aby skorzystać systemdze specjalnych funkcji do agettydynamicznego uruchamiania , na żądanie po naciśnięciu Alt+ F3i tak dalej, wydaje się, że musisz mieć co najmniej te dwa pliki:

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

gdzie [email protected]jest dowiązanie symboliczne do [email protected].

Zawartość plików konfiguracyjnych:

default.target, getty.target, sysinit.targetPliki mogą być pusta z wyjątkiem [Unit]zmiennej i (prawdopodobnie) Description=xxx.

basic.target zawiera również informacje o zależnościach:

[Jednostka]
Opis = system podstawowy
Wymaga = sysinit.target
Wants = sockets.target timers.target paths.target slices.target
After = sysinit.target sockets.target timers.target paths.target slices.target

Nie jestem pewien, czy potrzebne są odniesienia do celów, które nie istnieją jako pliki, czy nie. Są one opisane na stronie systemd.special(7)man.


console-getty.service: (Specjalny przypadek agetty na konsoli)

[Jednostka]
Opis = Konsola Getty
After = systemd-user-session.service plymouth-quit-wait.service
Przed = getty.target

[Usługa]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
Typ = bezczynny
Uruchom ponownie = zawsze
RestartSec = 0
UtmpIdentifier = minus
TTYPath = / dev / console
TTYReset = tak
TTYVHangup = tak
KillMode = proces
IgnoreSIGPIPE = nie
SendSIGHUP = tak

[Zainstalować]
WantedBy = getty.target

[email protected]: (ogólna konfiguracja dla wszystkich usług Getty oprócz konsoli)

[Jednostka]
Opis = Getty na% I
After = systemd-user-session.service plymouth-quit-wait.service
Przed = getty.target
IgnoreOnIsolate = tak
ConditionPathExists = / dev / tty0

[Usługa]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Typ = bezczynny
Uruchom ponownie = zawsze
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = tak
TTYVHangup = tak
TTYVTDisallocate = no
KillMode = proces
IgnoreSIGPIPE = nie
SendSIGHUP = tak

[Zainstalować]
WantedBy = getty.target
DefaultInstance = tty1

Wreszcie prawdopodobnie potrzebujesz kilku z tych specjalnych plików binarnych (nie próbowałem tych, które są kluczowe):

/ lib / systemd / systemd (/ sbin / init zwykle wskazuje na to)
/ lib / systemd / systemd-logind
/ lib / systemd / systemd-cgroups-agent
/ lib / systemd / systemd-user-session
/ 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-odpowiedz-hasło
/ lib / systemd / systemd-ac-power
/ lib / systemd / systemd-Activ
/ 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-resolved
/ lib / systemd / systemd-rfkill
/ lib / systemd / systemd-shutdown
/ lib / systemd / systemd-shutdownd
/ lib / systemd / systemd-socket-proxyyd
/ lib / systemd / systemd-timedated
/ lib / systemd / systemd-timesyncd
/ lib / systemd / systemd-udevd
/ lib / systemd / systemd-update-done

Podsumowując systemowy proces uruchamiania, myślę, że działa on mniej więcej tak:

  1. systemd lokalizuje basic.target(lub wszystkie *.targetpliki?)
  2. Zależności są rozwiązywane na podstawie WantedBy=, Wants=, Before=, After=... dyrektyw w [Install]sekcji *.servicei *.targetkonfiguracji plików.
  3. *.services, które powinny się uruchomić (które nie są „specjalnymi” usługami), mają [Service]sekcję z ExecStart=dyrektywą, która wskazuje plik wykonywalny do uruchomienia.
MattBianco
źródło
1
AFAIK [Install]sekcja nie jest używana przez sekwencję rozruchową, tylko przez systemctl enable. Boot patrzy na dowiązania symboliczne /etc/systemd/system/basic.target.wants/, które są tworzone przez systemctl enable.
Stefan Majewsky
6

systemdautomatycznie tworzy getty po przejściu do terminali, do pewnej maksymalnej liczby. Domyślnie jest to 6 (więc dostajesz automatycznie getty za alt + f1 do alt + f6). Jeśli chcesz zmienić ten parametr, możesz edytować, /etc/systemd/logind.confaby zmienić NAutoVTsparametr na inną liczbę (maks. 12)

Jeśli chcesz getty na tarło nawet jeśli nie ręcznie przełączyć można dodać do dowiązania /usr/lib/systemd/system/[email protected]do /etc/systemd/system/getty.target.wants/katalogu:

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

spowoduje to getty.targetwymaganie jeszcze jednej getty@usługi. Obiekt docelowy to zbiór usług, które muszą zostać odrodzone, zastąpienie poziomów uruchomieniowych, które obsługuje zależności. Domyślny cel zależy odgetty.target

Zobacz na systemd FAQ w ArchWiki

edycja: Trochę więcej zbadałem w dokumentacji .

Podczas uruchamiania systemddemon ładuje wszystkie systemy w defaultcelu i ich zależności. Pliki docelowe określają cel

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

Cel ma listę dołączonych usług określonych przez dowiązania symboliczne w katalogach

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

/etcWersja zastępuje domyślne dystrybucyjne w /usr/lib. .targetWymagany jest tylko jeden plik, a żaden katalog nie jest wymagany

gettyjest tylko jedną z usług, które mogą być uruchamiane przez skrypty init. W dystrybucji, którą sprawdziłem (fedora, arch) gettyjest uruchamiany na dwa różne sposoby:

  1. Rozpoczęte przez określone skrypty dla każdego terminala (linki do /usr/lib/systemd/system/[email protected]pliku, w którym nazwa tty jest podstawiona przez systemdz nazwy pliku linku )
  2. Automatycznie wywoływane w razie potrzeby, logindgdy użytkownik przełącza się na terminal wirtualny (podobnie jak stare inetdprzywołane usługi tylko po otrzymaniu żądania). logindjest innym demonem rozpowszechnianym z systemdi odczytuje jego konfigurację z /etc/systemd/logind.confpliku.

Mam nadzieję, że to jest satysfakcjonujące.

pqnet
źródło
Chcę wiedzieć, które pliki są potrzebne i co powinny zawierać. Czy możesz streścić swoją odpowiedź listą wymaganych plików i co powoduje, że są czytane w jakiej kolejności? Brakuje mi informacji o tym, co należy znaleźć w tym katalogu. Spróbuję trochę rozwinąć moje pytanie. Dzięki!
MattBianco
@MattBianco, do którego niepotrzebnie jesteś wrogi systemd.
Badam
1
Tak, rozpieszczają mnie dokumenty z innych projektów open source. Przepraszam za to, że brzmi nieprzyjaźnie. Frustrujące jest to, że wydaje się, że nie ma prostego dokumentu wyjaśniającego proces uruchamiania. (Rozumiem teraz, że dzieje się tak, ponieważ systemd nie jest proste.) W humorystyczny sposób chciałbym skomentować, że być może systemdjest to wrogie, tak jak w przypadku wrogiego przejęcia sposobu uruchamiania systemu otwartego. Odwraca GNU / Linuksa od Uniksa. Nie mówię, że to zła rzecz, ale bardzo różni się od tego, jak tradycyjnie było. A przeglądanie go trochę wskazuje, że nie jestem sam.
MattBianco,