Systemd
Toores. Ehk seda pala võib täiendada.
Sisukord
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.
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