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 name om den redan körs.
systemctl reload name.service
Läser in konfigurationen för tjänsten name igen. 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 name körs. Ungefär som status men 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