Jak
pisałem dwa lata temu, systemd pozbywa się pojęcia runleveli
,
dając w zamian cele. Cel jest swego rodzaju punktem
synchronizacji, w którym system zapewnia określoną funkcjonalność. Zależności
między celami, tak jak między innymi jednostkami, nie są liniowe:
Otwórzmy powyższy obrazek i zastanówmy, co ja pacze?
Na początek legenda. Czarna strzałka oznacza, że wskazywany
cel jest wymagany przez wskazujący (Requires=
).
Zielona wskazuje na kolejność, wskazywany musi się aktywować
do końca, zanim systemd przejdzie do wskazywanego (After=
).
Czerwona oznacza konflikt (Conflicts=
). Jak widać
shutdown.target
konfliktuje ze wszystkich, czyli aktywacja
shutdownu powoduje zwinięcie wszystkich innych celi.
Jak widać w górnej-lewej części obrazka: nss-lookup.target
nie
wymaga network.target
. Jeśli jednak z jakiegoś powodu network.target
zostanie aktywowany, to nss-lookup.target
wykona się po
nim — zielona strzałka.
Przy systemd nie można za bardzo powiedzieć o kolejności przy
starcie systemu. Tutaj wybiera się docelowy stan systemu i osiąga
go poprzez przywołanie wszystkich zależności. Analizę co się dzieje
łatwiej jednak prowadzić od końca.
Załóżmy więc, że system ma działać w trybie graficznym. Celem jest więc
graphical.target
, który z grubsza można porównać z runlevelem
2. w debianowatych. 4. w Slackware, 5. w starych redhatowych, SUSE i Archu —
umożliwia logowanie użytkowników w trybie graficznym.
Jako pierwsze aktywowane zostaną wymagania sysinit.target
(A special target unit covering early boot-up scripts). Ten zaciąga
przestrzenie wymiany (swap.target
), lokalne systemy plików
(local-fs.target
), w tym również szyfrowane z pytaniem o hasło,
jeśli potrzeba (cryptsetup.target
). Aktywacje tej trójki odbywają
się równolegle. Kiedy zakończą się aktywacje i wystartowane zostaną
usługi dla tego celu, sysinit.target
zostaje osiągnięty.
Umożliwia to przejście do basic.target
. Zadaniem tego jest
dodatkowo uruchomienie wszystkich gniazd, na których słucha systemd
(sockets.target
). System w tym stanie może przejść do trybu ratunkowego
(rescue.target
) który daje powłokę odzyskiwania systemu. Przypominając:
mamy zamountowane lokalne systemy plików, włączony swap i zainicjowane
podstawowe mechanizmy dystrybucji. Taki runlevel 1.
Tu warto wspomnieć o trybie awaryjnym emergency.target
. Jest to
absolutnie minimalny stan, w którym można próbować naprawić całkowicie zepsuty
system. Odpowiada niemal uruchomieniu jądra z parametrem init=/bin/sh
,
daje jednak możliwość kontynuacji normalnego uruchamiania po naprawie.
Stąd system może przejść również multi-user.target
. Jest to
podstawowy stan linuksa — działają prawie wszystkie demony, użytkownicy
moga logować się na konsolach (dzięki zaciągnięciu getty.target
). Pachnie
jak runlevel 3. multi-user.target
nie wymaga trybu ratunkowego,
ale jeśli takowy był uruchomiony, to musi skończyć się wykonywać przed przejściem
w m-u.target — zielona strzałka.
Z aktywnego multi-user.target
już tylko krok do uruchomienia
graficznego zarządcy logowania i osiągnięcia zadanego graphical.target
.
Większość z tych etapów opisana jest na stronie manuala
systemd.special
.
Skąd brany jest cel przy starcie systemu? Zazwyczaj wskazuje go łącze symboliczne:
/usr/lib/systemd/system/default.target -> graphical.target
. Administrator
może je przesłonić podając w linii poleceń jądra frazę systemd.unit=
.
Cele są punktami, do których przypisujemy usługi do uruchomienia w obecnym
stanie. Weźmy np. wiszące luzem na obrazku cele po prawej stronie. Taki
bluetooth.target
aktywowany jest przez pojawienie się urządzenia
obsługującego BT:
/usr/lib/udev/rules.d/99-systemd.rules:SUBSYSTEM=="bluetooth", TAG+="systemd", ENV{SYSTEMD_WANTS}="bluetooth.target"
i powoduje wystartowanie odpowiedniej usługi:
/etc/systemd/system/bluetooth.target.wants/bluetooth.service
.
Podobnie można np. przywiesić usługi do wystartowanie w związku z kartą dźwiękową
do sound.target
.
Nie należy zapominać, że start to tylko jeden z etapów życia systemu. Wdzięczny
do omówienia, gdyż powoduje kaskadę aktywacji różnych celi. W normalnym użytkowaniu
jest to jednak bardzo specyficzna sytuacja i nie należy się na niej skupiać w
celach innych niż akademickie.
Obrazek wygenerowany grep
em z systemctl dot
.