Systemd od podstaw do zaawansowanych zastosowań – jak działa współczesny system inicjalizacji Linux
systemd od podstaw do zaawansowanych zastosowań – jak działa współczesny system inicjalizacji Linux
Przez wiele lat świat Linuksa korzystał z klasycznego systemu startowego SysVinit. Był prosty, przewidywalny i dobrze znany administratorom, ale wraz ze wzrostem złożoności systemów zaczęły pojawiać się problemy.
Nowoczesne serwery Linux uruchamiają dzisiaj:
- dziesiątki usług sieciowych,
- kontenery,
- bazy danych,
- systemy monitoringu,
- środowiska wirtualizacji,
- aplikacje działające jako mikroserwisy.
W takim środowisku klasyczny model:
Start usługi A
↓
Start usługi B
↓
Start usługi C
przestał być wystarczająco elastyczny.
Odpowiedzią stał się:
systemd.
Dzisiaj systemd jest standardowym systemem inicjalizacji w większości popularnych dystrybucji Linux, między innymi:
- Debian,
- Ubuntu,
- Fedora,
- RHEL,
- Arch Linux,
- openSUSE.
Nie jest już tylko „programem startującym system”.
To cały ekosystem odpowiedzialny za:
- uruchamianie usług,
- zarządzanie procesami,
- logowanie zdarzeń,
- obsługę urządzeń,
- harmonogramowanie zadań,
- zarządzanie sesjami użytkowników,
- izolację usług.
Czym jest systemd?
systemd to pierwszy proces uruchamiany przez jądro Linux podczas startu systemu.
Jego identyfikator procesu zawsze wynosi:
PID 1
Sprawdzenie:
ps -p 1
Przykładowy wynik:
PID COMMAND
1 /lib/systemd/systemd
Od tego momentu systemd przejmuje kontrolę nad uruchamianiem kolejnych elementów systemu.
Schemat startu:
BIOS/UEFI
↓
Bootloader (GRUB)
↓
Kernel Linux
↓
systemd (PID 1)
↓
Usługi systemowe
↓
Login użytkownika
Dlaczego systemd zastąpił SysVinit?
SysVinit działał według prostego modelu skryptów:
/etc/init.d/
start
stop
restart
Każda usługa posiadała skrypt startowy.
Problem:
Jeżeli mamy:
- Apache,
- MySQL,
- SSH,
- Docker,
- Kubernetes,
system musiał uruchamiać je według ustalonej kolejności.
Nie zawsze było to optymalne.
systemd wprowadził:
Równoległe uruchamianie usług
Przykład:
Apache
↘
systemd
↗
SSH
Jeżeli usługi nie zależą od siebie, mogą startować jednocześnie.
Efekt:
- szybszy start,
- lepsza kontrola zależności.
Architektura systemd
systemd składa się z wielu komponentów.
Najważniejsze:
systemd PID 1
Główny proces zarządzający systemem.
Odpowiada za:
- start systemu,
- zatrzymywanie systemu,
- zarządzanie usługami.
systemd-journald
System logowania.
Zastępuje klasyczne:
/var/log/messages
/var/log/syslog
Zbiera:
- komunikaty kernela,
- logi usług,
- błędy systemowe.
systemd-logind
Zarządza:
- logowaniem użytkowników,
- sesjami,
- blokadą ekranu,
- urządzeniami wejścia.
systemd-networkd
Obsługuje konfigurację sieci.
Alternatywa dla:
- NetworkManager,
- klasycznych skryptów sieciowych.
systemd-resolved
Obsługuje:
- DNS,
- cache zapytań,
- lokalne rozwiązywanie nazw.
Jednostki systemd (Units)
Podstawowym elementem systemd są:
units (jednostki).
Każdy element zarządzany przez systemd jest jednostką.
Typy:
Service units (.service)
Najczęściej używane.
Przykład:
ssh.service
Opisują usługi.
Przykłady:
nginx.service
mysql.service
docker.service
Target units (.target)
Zastępują klasyczne poziomy uruchamiania:
SysV:
runlevel 3
runlevel 5
systemd:
multi-user.target
graphical.target
Timer units (.timer)
Zastępują cron.
Przykład:
backup.timer
Mount units (.mount)
Obsługują montowanie systemów plików.
Przykład:
data.mount
Socket units (.socket)
Obsługują aktywację usług przez gniazda.
Przykład:
docker.socket
Podstawowe zarządzanie usługami
Najważniejsze narzędzie:
systemctl
Sprawdzenie statusu usługi
Przykład:
systemctl status nginx
Wynik pokazuje:
- czy działa,
- PID procesu,
- ostatnie logi,
- błędy.
Uruchomienie usługi
systemctl start nginx
Zatrzymanie
systemctl stop nginx
Restart
systemctl restart nginx
Automatyczny start po uruchomieniu systemu
systemctl enable nginx
Wyłączenie autostartu
systemctl disable nginx
Tworzenie własnej usługi systemd
Załóżmy, że mamy aplikację:
/usr/local/bin/server.sh
Tworzymy plik:
/etc/systemd/system/server.service
Przykład:
[Unit]
Description=My Custom Server
After=network.target
[Service]
ExecStart=/usr/local/bin/server.sh
Restart=always
User=appuser
[Install]
WantedBy=multi-user.target
Następnie:
systemctl daemon-reload
Uruchomienie:
systemctl start server
Autostart:
systemctl enable server
Restartowanie usług po awarii
Jedna z największych zalet systemd.
Przykład:
[Service]
Restart=always
RestartSec=5
Oznacza:
jeżeli aplikacja zakończy działanie:
- systemd uruchomi ją ponownie,
- odczeka 5 sekund.
systemd jako alternatywa dla cron
Tradycyjny cron:
0 2 * * * backup.sh
systemd timer:
backup.timer
Przykład:
[Timer]
OnCalendar=daily
Persistent=true
Zaleta:
Jeżeli komputer był wyłączony:
systemd może wykonać zadanie po ponownym uruchomieniu.

Analiza startu systemu
systemd posiada narzędzia diagnostyczne.
Czas startu
systemd-analyze
Przykład:
Startup finished in 8.5s
Najwolniejsze usługi
systemd-analyze blame
Przykład:
8s mysql.service
5s docker.service
Graf zależności
systemd-analyze dot
Pozwala zobaczyć kolejność startu.
Zarządzanie logami przez journalctl
systemd używa:
journalctl
Wszystkie logi
journalctl
Logi konkretnej usługi
journalctl -u nginx
Logi od ostatniego uruchomienia
journalctl -b
Śledzenie logów na żywo
journalctl -f
systemd i bezpieczeństwo usług
Jedną z największych zalet systemd jest możliwość ograniczania usług.
Przykład:
[Service]
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
Możemy ograniczyć:
- dostęp do systemu plików,
- możliwość eskalacji uprawnień,
- dostęp do katalogów.
Izolacja usług przez systemd
Przykład:
Serwer WWW nie musi mieć dostępu do całego systemu.
Możemy zastosować:
ProtectHome=yes
Efekt:
Apache nie zobaczy katalogów użytkowników.
systemd w środowisku serwerowym
Na serwerach systemd zarządza między innymi:
- nginx,
- Apache,
- PostgreSQL,
- MySQL,
- Redis,
- Docker,
- SSH,
- VPN,
- monitoring.
Przykład:
systemd
|
+-- nginx.service
+-- mysql.service
+-- ssh.service
+-- docker.service
systemd i kontenery
Docker wykorzystuje systemd między innymi do:
- startu demona Docker,
- zarządzania usługami,
- integracji z Linux.
Kubernetes również często działa na systemach wykorzystujących systemd.
Przydatne polecenia administratora
Lista działających usług:
systemctl list-units --type=service
Wszystkie jednostki:
systemctl list-units
Błędy:
systemctl --failed
Zależności:
systemctl list-dependencies
Informacje o usłudze:
systemctl cat nginx
Najczęstsze problemy z systemd
Usługa nie startuje
Sprawdzenie:
systemctl status nazwa.service
oraz:
journalctl -xe
Zmiana pliku usługi nie działa
Po edycji:
systemctl daemon-reload
Usługa uruchamia się i natychmiast kończy
Najczęściej:
- błędny parametr,
- brak uprawnień,
- aplikacja kończy pracę.
Sprawdzamy:
journalctl -u usluga
Zaawansowane zastosowania systemd
systemd może działać jako:
- menedżer usług,
- system watchdog,
- narzędzie izolacji,
- harmonogram,
- kontroler zasobów.
Przykład ograniczenia CPU:
[Service]
CPUQuota=50%
Ograniczenie pamięci:
MemoryLimit=1G
systemd a administracja produkcyjnym serwerem
W środowiskach produkcyjnych systemd daje administratorowi:
- przewidywalny start usług,
- automatyczne odtwarzanie po awarii,
- centralne logowanie,
- kontrolę zasobów,
- możliwość hardeningu.
Dlatego znajomość systemd jest obecnie jedną z podstaw pracy administratora Linux.
Podsumowanie
systemd nie jest już tylko zamiennikiem starego init.
To kompletny framework zarządzania systemem Linux.
Od podstawowych operacji:
systemctl start nginx
aż po zaawansowane mechanizmy:
- izolację usług,
- kontrolę zasobów,
- watchdog,
- własne jednostki,
- analizę wydajności,
systemd stał się jednym z najważniejszych elementów współczesnych dystrybucji Linux.
Administrator, który dobrze rozumie systemd, potrafi nie tylko uruchomić usługę, ale również zaprojektować stabilne, bezpieczne i łatwe w utrzymaniu środowisko serwerowe.






