Systemd
I den här delen kommer vi:
- Gå igenom vad systemd är
- Lära oss att hantera tjänster i Linux
Systemd är en system- och tjänstehanterare för Linux. Det har funnits några sådana genom tiderna, varav SysV init var den allra vanligaste uppstartshanteraren, sedan kom Upstart och nu är det Systemd som gäller för de flesta större linuxdistributioner. Med systemd hanterar vi hur systemet skall starta upp (boota) och vi kan hantera de tjänster som vi har installerade: vi kan starta dem, stänga ner dem, starta om dem och så vidare.
Med systemd kan vi starta tjänster parallelt, vilket innebär att uppstarten av en linuxmaskin blir mycket snabbare. Systemd tar reda på vilka tjänster en specifik tjänst är beroende av och startar dem sedan i turordning. Systemd är också bakåtkompatibel, vilket innebär att vi kan använda skript för SysV init och Upstart tjänsterna.
Systemd använder sig av något som kallas units, en unit är en konfiguration av en specifik tjänst. Tjänste-units i systemd kallas namn.service och kan användas för att till exempel starta, stänga ner, starta om, aktivera och inaktivera tjänsten. Vi använder kommandot systemctl för att hantera tjänsterna:
systemctl start name.service-
Startar tjänsten
name systemctl stop name.service-
Stänger ner (avslutar) tjänsten
name systemctl restart name.service-
Startar om tjänsten
name systemctl try-restart name.service-
Startar bara om tjänsten
nameom den redan körs. systemctl reload name.service-
Läser in konfigurationen för tjänsten
nameigen. Bra när vi konfigurerat om en tjänst och vill läsa in den nya konfigurationen. systemctl status name.service-
Visar status för tjänsten
name systemctl is-active name.service-
Visar om tjänsten
namekörs. Ungefär somstatusmen med enklare utmatning. systemctl list-units --type service --all-
Visar status för alla tjänster i systemet.
Systemd hanterar uppstarten av linuxsystemet och bestämmer vilka tjänster som skall starta upp vid uppstart (boot) och vilka som inte skall starta upp. Vi hanterar detta med enable och disable i systemd.
systemctl enable name.service-
Aktiverar tjänsten
name systemctl disable name.service-
Inaktiverar tjänsten
name systemctl is-enabled name.service-
Visar om tjänsten
nameär aktiverad eller inte.
Om vi inte skriver .service efter en tjänsts namn kommer systemd förutsätta att vi menar just .service. Om vi inte angett något annat så klart. Följande kommandon gör samma sak:
$ systemctl is-enabled httpd.service
$ systemctl is-enabled httpd
Vi visar alla installerade tjänster som körs genom att skriva:
$ systemctl list-units --type service
UNIT LOAD ACTIVE SUB DESCRIPTION
alsa-state.service loaded active running Manage Sound Card State (res
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
...
Listan pausas skärm för skärm och vi använder PAGE-UP och PAGE-DOWN för att förflytta oss. Vi avslutar listningen genom att trycka på tangenten q.
För att visa alla tjänster och deras status (även de som inte körs) skriver vi:
$ systemctl list-units --type service --all
Vi kan också visa status på alla tjänster med list-unit-files:
$ systemctl list-unit-files --type service
UNIT FILE STATE
alsa-restore.service static
alsa-state.service static
alsa-store.service static
auditd.service enabled
autovt@.service disabled
blk-availability.service disabled
...
Om vi vill visa status för en specifik tjänst använder vi status:
$ systemctl status sshd
* sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled;
vendor preset: enabled)
Active: active (running) since Sun 2016-10-02 14:23:25 CEST;
1h 45min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1122 (sshd)
CGroup: /system.slice/sshd.service
|--1122 /usr/sbin/sshd -D
- Loaded
-
informerar om tjänsten är laddad, vilken sökväg den finns på och om den är aktiverad (enabled).
- Active
-
visar om tjänsten körs just nu, och i så fall när den startades.
- Main PID
-
visar vilket process id (PID) som startade tjänsten.
- CGroup
-
visar information om de CGroups (control groups) som är relaterade till tjänsten.
Om vi bara vill se om tjänsten är startad eller inte använder vi is-active:
$ systemctl is-active sshd
active
Vill vi veta om en tjänst aktiveras vid uppstart använder vi enabled:
$ systemctl is-enabled sshd
enabled
För att starta en tjänst använder vi start:
$ systemctl start sshd
För att stänga ner en tjänst använder vi stop:
I exemplet kommer vi stänga ner SSH-tjänsten på vår maskin. Gör inte detta om du använder SSH för att ansluta till din linuxmaskin!
$ systemctl stop sshd
Ibland behöver vi starta om en tjänst, kanske för att vi konfigurerat om den eller att den slutat svara. Då använder vi restart:
$ systemctl restart sshd
Vi kan också använda try-restart som bara startar om tjänsten om den redan körs. Detta gör att vi inte startar upp tjänster som inte redan var igång.
En del tjänster klarar av att läsa om sin konfiguration utan att starta om hela tjänsten med restart. Då använder vi reload istället:
$ systemctl reload sshd
Om vi vill att en tjänst skall starta upp när systemet startar använder vi enable:
$ systemctl enable sshd
Created symlink from /etc/systemd/system/multi-user.target.wants/
sshd.service to /usr/lib/systemd/system/sshd.service.
För att se till att tjänsten inte startar upp med systemet använder vi disable:
$ systemctl disable sshd
Removed symlink /etc/systemd/system/multi-user.target.wants/
sshd.service.
Targets
Om du har använt Linux tidigare kanske du känner till runlevels. I SysV init var de numrerade 0 till 6. Där man valde vilken runlevel man ville att systemet skulle köras i. Vanligtvis var det runlevel 2 eller 3 för en server utan grafisk miljö och 5 för en server med grafisk miljö. I systemd heter de olika runlevels targets och vi har fortfarande sju stycken (0-6):
- runlevel0.target, poweroff.target
-
stänger ner systemet och datorn (stänger av strömmen)
- runlevel1.target, rescue.target
-
startar ett räddningsläge där vi kan laga ett trasigt linuxsystem
- runlevel2.target, multi-user.target
-
startar en fleranvändarmiljö utan grafik
- runlevel3.target, multi-user.target
-
startar en fleranvändarmiljö utan grafik
- runlevel4.target, multi-user.target
-
startar en fleranvändarmiljö utan grafik
- runlevel5.target, graphical.target
-
startar en fleranvändarmiljö med grafik
- runlevel6.target, reboot.target
-
stänger ner systemet och startar om datorn
För att se vilka targets vi har laddade nu skriver vi:
$ systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
bluetooth.target loaded active active Bluetooth
cryptsetup.target loaded active active Encrypted Volumes
...
För att se alla tillgängliga targets lägger vi till --all:
$ systemctl list-units --type target --all
För att se vilken target som är standard använder vi get-default:
$ systemctl get-default
multi-user.target
För att ändra target använder vi isolate, för att starta om datorn skriver vi:
$ systemctl isolate reboot.target
För att ändra vilken target systemet skall starta upp i använder vi set-default:
$ systemctl set-default graphical.target
För att återställa till den target vi använder när vi kör textbaserat läge skriver vi:
$ systemctl set-default multi-user.target
Stänga ner och starta om Linux
systemctl halt-
stänger ner systemet, men behåller strömmen
systemctl poweroff-
stänger ner systemet och stänger av strömmen
systemctl reboot-
startar om systemet