Systemd

Allikas: Kuutõrvaja
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Sissejuhatus

systemd on süsteemi ja selle teenuste haldur Linuxile. Systemd autoriteks on Lennart Poettering ja Kay Sievers. Systemd on kirjutatud C keeles, et vähendada aeglust mis tekib traditsioonilistes init süsteemides shelli skriptide käivitamisest.

Simple-linux-utility-for-resource-management 401916 full.png.jpg

Systemd pakub:

  • agresiivset teenuste paralleel käivitamist
  • ühildub SysV ja LSB init skriptidega
  • socket ja D-Bus põhist vastavalt vajadusele teenuste käivitust
  • protsesside jälgimist Linuxi cgroups abil
  • hoolitseb mount süsteemi eest
  • võimaldab süsteemi oleku salvestust ja taastamist
  • sisaldab sõltuvuste põhist teenuste juhtimist mis võimaldab väga kiiret süsteemi käivitumist (alla 1s osadel süsteemidel)
  • ja palju muud huvitavat mida mujalt eriti ei leia

Distrote tugi

Osad suurematest Linuxi distrotest juba kasutavad või plaanivad kasutusele võtta systemd oma peamiseks init süsteemiks.

systemd on kasutusel nendes distrotes:

  • Arch Linux
  • Fedora
  • Mageia
  • Mandriva Linux
  • openSUSE
  • Red Hat Enterprise Linux 7

systemd ei ole veel kasutusel ja võibolla ei tule ka kasutusele nendes distrotes:

  • Ubuntu, nemad kirjutasid Upstarti, wikis on olemas eksperimenteerimiseks juhised kuidas systemd installida
  • Debian, systemd toetab ainult Linuxi kernelit, debian aga toetab peale linuxi ka veel teisi kerneleid, wikis olemas juhised kuidas installida. Debiani systemd küsitlus
  • Slackware, neile ei meeldi systemd[1]

Systemd ülessehitus ja toimimine

Systemd asendab suhteliselt palju klassikalist linuxi init süsteemi tarkvara, nt: ConsoleKit, sysvinit, initscripts, pm-utils, inetd, acpid, syslog, watchdog, cgrulesd, cron, atd.

Systemd ja paljud selle alam teenused kasutavad suhteliselt palju D-Bus süsteemi kõige juhtimiseks mis võimaldab teenuseid käivitada vastavalt vajadusele, teenuseid on võimalik käivitada ka paljude erinevate signaalide peale. Näiteks on võimalik luua väheke muudetud ssh unit fail mis käivitab ssh serveri ainult siis kui keegi üritab pordi 22 külge ühenduda (põhimõte sarane inetd'le). Sedasi on võimalik käivitada igasuguseid asju. systemd teenuseid saab juhtida systemctl käsuga

syslog on asendatud systemd-journald teenusega mis kasutab teksti asemel binary faile ning hoolitseb selle eest et kõik mis sinna sisse läheb tuleb ka samamoodi välja, syslog seda ei tee. syslog'i kasutamine systemd süsteemis on toetatud kuid keegi seda väga ei soovita teha. Journali juhtimiseks on käsk journalctl

Systemd'l on sisseehitatud watchdog tugi ja oskab kasutada riistvaralist watchdogi kui see on olemas, sammuti võib iga süsteemi teenus kasutada systemd tarkvaralist watchdogi mis automaatselt taaskäivitab teenuse kui see peaks mingil põhjusel kokku jooksma. watchdog näidis

corn on asendatud systemd.timers süsteemiga mis on palju paindlikum kuid keegi ei keela corni edasi jooksutamast

logind hoolitseb kasutajate sisselogimise eest

Unit fail

Systemd on modulaarne lahendus. Informatsioon teenustest, socketitest, kettaseadmetest ja muudest objektidest jaotatakse unititeks.

unititite liigid

  • Service unit - süsteemi teenus
  • Device unit - seadmefail
  • Mount unit - failisüsteemi ühenduspunkt
  • Target unit - unitite grupp

Service unit on põhimõtteliselt vaste init skriptile. Teenus tuleb luua kausta /etc/systemd/system. Näiteks

touch /etc/systemd/system/name.service
chmod 664 /etc/systemd/system/name.service

Näide postfixi teenuse unitist

[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop 

[Install]
WantedBy=multi-user.target

  • ExecStartPre Käsud mis käivitatakse enne kui ExecStart.
  • ExecStart Peakäsk mida unit peab käivitama.
  • ExecStartPost Käsud mis käivitatakse pärast ExecStart käsku.
  • ExecReload Commands that will run when this unit is reloaded via systemctl reload foo.service
  • ExecStop Commands that will run when this unit is considered failed or if it is stopped via systemctl stop foo.service
  • ExecStopPost Commands that will run after ExecStop has completed.
  • RestartSec The amount of time to sleep before restarting a service. Useful to prevent your failed service from attempting to restart itself every 100ms.

Selleks, et unit boodil starditaks tuleb anda käsk

# systemctl enable name.service

Mõne teenuse uniti vaatamiseks tuleb anda käsk

# systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH Daemon
Wants=sshdgenkeys.service
After=sshdgenkeys.service
After=network.target

[Service]
ExecStart=/usr/bin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always

[Install]
WantedBy=multi-user.target

# This service file runs an SSH daemon that forks for each incoming connection.
# If you prefer to spawn on-demand daemons, use sshd.socket and sshd@.service.

Erinevate systemd unit failide sis näeb nt käskudega

# sc cat postfix
# /etc/systemd/system/postfix.service
[Unit]
Description=Postfix Mail Transport Agent
After=network.target

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
ExecStartPre=-/usr/bin/postfix check
ExecStart=/usr/bin/postfix start
ExecStop=/usr/bin/postfix stop
ExecReload=/usr/bin/postfix reload
Restart=always

[Install]
WantedBy=multi-user.target

Õige kellaaeg

Süsteemi kella nägemiseks

# timedatectl
      Local time: Wed 2016-03-23 11:24:10 EET
  Universal time: Wed 2016-03-23 09:24:10 UTC
        RTC time: Wed 2016-03-23 09:23:12
       Time zone: Europe/Tallinn (EET, +0200)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Kella seadistamiseks

# timedatectl set-time "2014-05-26 11:13:54"

Systemd suudab seejuures uuendada enda kella ka ntp serveritelt. Selleks on tal olemas deemon systemd-timesyncd mille käivitamiseks tuleb anda käsk

# timedatectl set-ntp true 

Konfigureerimine toimub failist /etc/systemd/timesyncd.conf

[Time]
NTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org 0.fr.pool.ntp.org

Saadaolevate ajatsoonide vaatamiseks

# timedatectl list-timezones

Ajatsooni seadistamiseks kohalikule

# timedatectl set-timezone Europe/Tallinn

Teenuste haldus

Teenuste halduskäsud, httpd näitel

# systemctl start httpd.service
# systemctl restart httpd.service
# systemctl stop httpd.service
# systemctl reload httpd.service
# systemctl status httpd.service

Staatus annab järgneva tulemi

 # systemctl status httpd
* httpd.service - Apache Web Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2016-03-17 16:42:50 EET; 4 days ago
 Main PID: 247 (httpd)
    Tasks: 109 (limit: 512)
   CGroup: /system.slice/httpd.service
           |- 247 /usr/bin/httpd -k start -DFOREGROUND
           |- 397 /usr/bin/httpd -k start -DFOREGROUND
           |- 398 /usr/bin/httpd -k start -DFOREGROUND
           |- 399 /usr/bin/httpd -k start -DFOREGROUND
           `-1836 /usr/bin/httpd -k start -DFOREGROUND

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

Systemd pakub head võimalust uurida ja analüüsida ka boot protsessi käiku

Kaua võttis startup aega

# systemd-analyze
Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s

Kui kaua iga teenuse bootimine aega võttis

# systemd-analyze blame
          4.866s firehol.service
          1.053s dev-vda1.device
           935ms munin-node.service
           ...
           23ms systemd-random-seed.service

Kõiki boot teenuseid näeb käsuga

systemctl list-unit-files

Kõik boodil mitte startinud teenused

systemctl --failed

Süsteemi loginud kasutajad

# loginctl
   SESSION        UID USER             SEAT            
        c8          0 root                             

1 sessions listed.

Logide kasutamine

Lihtsalt journalctl käsk näitab kõiki sündmusi

Boot logi vaatamiseks

journalctl -b

Kindla ajavahemiku logide vaatamiseks

journalctl --since "2015-01-10 17:15:00"

Või ajaakna

journalctl --since "2015-01-10" --until "2015-01-11 03:00"

Aga kirjutada võib ka vabamas vormis näiteks

journalctl --since yesterday

Logi on võimalik vaadata ka konreetsete teenuste kaupa

journalctl -u nginx.service

Või mitme kombineeritud teenuse logi vaatamine kindlas ajaaknas

journalctl -u nginx.service -u php-fpm.service --since today

Samuti on võimalik logi jälgida kindla pid'i raames

journalctl _UID=33 --since today

Vahel võib olla olulne vaadata vaid teatud tasemega teateid (emerg, alter, crit, err, warning jne)

journalctl -p err -b

Journal võib asendada ka tail käsku, näiteks viimase kümne teate nägemiseks

journalctl -n

Tail -f alternatiiviks on

journalctl -f

Selleks, et näha palju journali logid kettal ruumi võtavad

# journalctl --disk-usage
Archived and active journals take up 100.2M on disk.

Logide kustutamist saab seadistada vacuum-time võtmega

# journalctl --vacuum-time=1years

Systemd timers ehk croni asendus

Vaatamiseks

# systemctl list-timers
NEXT                         LEFT     LAST                         PASSED UNIT                         ACTIVATES
Fri 2016-03-25 00:00:00 EET  13h left n/a                          n/a    shadow.timer                 shadow.service
Fri 2016-03-25 01:49:44 EET  14h left Thu 2016-03-24 01:49:44 EET  9h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service 

2 timers listed.
Pass --all to see loaded but inactive timers, too.

Timer mis stardib 15 minutit peale booti ning iga seejärel kord iga nädal

/etc/systemd/system/foo.timer
[Unit]
Description=Run foo weekly and on boot

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w 

[Install]
WantedBy=timers.target

Varundust teostav ja kord päevas käivituv timer

/etc/systemd/system/system-backup.timer

[Unit]
Description=Perform system backup 

[Timer]
OnCalendar=daily

[Install]
WantedBy=timers.target

/etc/systemd/system/system-backup.service

[Unit]
Description=Perform system backup

[Service]
Type=simple
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/root/system-backup.sh

Kasutades muutujat OnCalendar=daily käivitatakse töö iga päeva keskööl ehk sisuliselt tegemist croni @daily käsule

Käivitamiseks ja permanentselt lubamiseks

# systemctl start system-backup.timer
# systemctl enable system-backup.timer

Võimalik on kasutada käivitamisajas ka random funktsiooni pannes käivitamisaja kõikuma nt 15 minuti ulatuses

[Timer]
Unit=kasutaja-recent.service
OnUnitInactiveSec=15m
RandomizedDelaySec=15m
AccuracySec=1s

Systemd cgroups

cgroups, or control groups, have been present in the Linux kernel for some years, but have not been used very much until systemd. The kernel documentation says: "Control Groups provide a mechanism for aggregating/partitioning sets of tasks, and all their future children, into hierarchical groups with specialized behaviour." In other words, it has the potential to control, limit, and allocate resources in multiple useful ways. systemd uses cgroups, and you can see them. Et saada täielik kontroll gruppide hirearhia

# systemd-cgls
Control group /:
-.slice
|-init.scope
| `-1 /sbin/init
|-system.slice
| |-dbus.service
| | `-266 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
| |-postfix.service
| | |-11710 /usr/lib/postfix/bin/master -w
| | |-11711 pickup -l -t fifo -u
| | `-11712 qmgr -l -t fifo -u
| |-collectd.service
| | |-279 /usr/bin/collectdmon
| | `-281 collectd -f
| |-systemd-journald.service
| | `-184 /usr/lib/systemd/systemd-journald
| |-systemd-timesyncd.service
| | `-246 /usr/lib/systemd/systemd-timesyncd
| |-systemd-logind.service
| | `-282 /usr/lib/systemd/systemd-logind
| |-system-getty.slice
| | `-getty@tty1.service
| |   `-300 /sbin/agetty --noclear tty1 linux
| |-sshd.service
| | `-271 /usr/bin/sshd -D
| |-munin-node.service
| | `-339 /usr/bin/perl -wT /usr/bin/munin-node
| `-systemd-udevd.service
|   `-240 /usr/lib/systemd/systemd-udevd
`-user.slice
  `-user-0.slice
    |-session-c4.scope
    | |- 5943 sshd: root@pts/1   
    | |- 5948 -bash
    | |-11714 systemd-cgls
    | `-11715 less
    `-user@0.service
      `-init.scope
        |-4565 /usr/lib/systemd/systemd --user
        `-4569 (sd-pam) 

Et näha kõigi gruppide ja nende elementide CPU, mälu ja ketta I/O load

$ systemd-cgtop

Selleks, et panna limiit teenusele

$ systemctl set-property httpd.service CPUShares=500  
$ systemctl show -p CPUShares httpd.service
$ systemctl show httpd.service | grep CPUShares

Või kui tahame limiteerida kasutaja UIDiga 1000 protsessori kasutust

$ systemctl set-property user-1000.slice CPUShares=100 
$ systemctl daemon-reload

NB! Limiite saab kirjutada juba otse unit failidesse

http://www.slideshare.net/TsungenHsiao/resource-management-with-systemd-and-cgroups

Lingid

http://patrakov.blogspot.com/2011/01/writing-systemd-service-files.html

https://wiki.gentoo.org/wiki/Systemd

http://wiki.debian.org/systemd

http://0pointer.de/blog/projects/systemd-for-admins-1.html

https://www.freedesktop.org/software/systemd/man/systemd.network.html võrguseadistus

https://wiki.archlinux.org/index.php/systemd-networkd veel võrgundusest