Slide 1

Slide 1 text

systemd – ściągawka systemd – ściągawka Zimowisko TLUG 2014 Tomasz Torcz

Slide 2

Slide 2 text

Rozpiska dlaczego po co co z tego dla admina dobre praktyki

Slide 3

Slide 3 text

Know your tools nie śpię, bo restartuję twittera

Slide 4

Slide 4 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia

Slide 5

Slide 5 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie”

Slide 6

Slide 6 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. →

Slide 7

Slide 7 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. → czwarta połowa: Ubuntu!

Slide 8

Slide 8 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. → czwarta połowa: Ubuntu! no cake: ChromeOS, Android/Linux aczkolwiek: SailfshOS (Jolla), GENIVI, LSB5.0

Slide 9

Slide 9 text

Pisownia systemd

Slide 10

Slide 10 text

Pisownia systemd SystemD

Slide 11

Slide 11 text

Pisownia systemd SystemD systemD

Slide 12

Slide 12 text

Pisownia systemd SystemD systemD SyStEmD

Slide 13

Slide 13 text

Co to robi? zarządza systemem i usługami dzisiaj skupimy się na usługach

Slide 14

Slide 14 text

Usługi program lub zespół programów działający cały czas lub od czasu do czasu opis/defnicja usługi to unit

Slide 15

Slide 15 text

uptimed.service [Unit] Description=Uptime record tracking daemon Documentation=man:uptimed(8) man:uprecords(1) [Service] ExecStartPre=/usr/sbin/uptimed -b ExecStart=/usr/sbin/uptimed -f [Install] WantedBy=multi-user.target

Slide 16

Slide 16 text

Usługi program lub zespół programów działający cały czas lub od czasu do czasu opis/defnicja usługi to unit unity zebrane w katalogach: /usr – systemowe; /etc – administratora; /run – konfguracja nietrwała (runtime)

Slide 17

Slide 17 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian)

Slide 18

Slide 18 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian) /etc/systemd/system – konfguracja właściwa systemctl enable, systemctl set-property

Slide 19

Slide 19 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian) /etc/systemd/system – konfguracja właściwa systemctl enable, systemctl set-property /run – generatory, najwyższy priorytet

Slide 20

Slide 20 text

systemctl start exim4 Czy już działa?

Slide 21

Slide 21 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ?

Slide 22

Slide 22 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ?

Slide 23

Slide 23 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ? nie czy jest /usr/lib/systemd/system/exim4.service ?

Slide 24

Slide 24 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ? nie czy jest /usr/lib/systemd/system/exim4.service ? a może jest /etc/init.d/exim4

Slide 25

Slide 25 text

Skąd ty? # systemctl status polipo-purge.service polipo-purge.service - flush polipo disk cache Loaded: loaded (/etc/systemd/system/polipo- purge.service; static) […]

Slide 26

Slide 26 text

Skąd ty? # systemctl status polipo-purge.service polipo-purge.service - flush polipo disk cache Loaded: loaded (/etc/systemd/system/polipo- purge.service; static) […] # systemctl status hp-health.service hp-health.service - LSB: hp System Health Monitor and Command line Utility Package. Loaded: loaded (/etc/rc.d/init.d/hp-health) […]

Slide 27

Slide 27 text

Unity 1) usługi zdefniowane są w unitach 2) najważniejsza linijka to ExecStart= wskazująca binarkę 3) kolejność szukania: /run → /etc → /usr (→ SysV)

Slide 28

Slide 28 text

Cykl życia i śledzenie wykonania start gotowość działanie zakończenie → → →

Slide 29

Slide 29 text

Cykl życia i śledzenie wykonania start gotowość działanie zakończenie → → → start: lockfle nie potrzebny, czyste środowisko

Slide 30

Slide 30 text

Cykl życia i śledzenie wykonania start → gotowość działanie zakończenie → → start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne

Slide 31

Slide 31 text

Cykl życia i śledzenie wykonania start → gotowość → działanie zakończenie → start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne działanie: procesy potomne w ramach usługi

Slide 32

Slide 32 text

6811 ? S 0:00 pickup -l -t unix -u

Slide 33

Slide 33 text

6811 ? S 0:00 pickup -l -t unix -u # systemctl status 6811

Slide 34

Slide 34 text

6811 ? S 0:00 pickup -l -t unix -u # systemctl status 6811 postfix.service - Postfx Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfx.service; enabled) Active: active (running) since Thu 2014-02-06 16:39:22 CET; 46s ago Process: 6735 ExecStart=/usr/sbin/postfx start (code=exited, status=0/SUCCESS) Process: 6732 ExecStartPre=/usr/libexec/postfx/chroot-update (code=exited, status=0/SUCCESS) Process: 6727 ExecStartPre=/usr/libexec/postfx/aliasesdb (code=exited, status=0/SUCCESS) Main PID: 6810 (master) CGroup: /system.slice/postfx.service ├─6810 /usr/libexec/postfx/master -w ├─6811 pickup -l -t unix -u └─6812 qmgr -l -t unix -u Feb 06 16:39:22 mother.pipebreaker.pl postfx/master[6810]: daemon started -- version 2.10.2, confguration /etc/postfx Feb 06 16:39:22 mother.pipebreaker.pl systemd[1]: Started Postfx Mail Transport Agent.

Slide 35

Slide 35 text

Cykl życia i śledzenie wykonania start → gotowość → działanie → zakończenie start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne działanie: procesy potomne w ramach usługi zakończenie: OK czy crash? restartować? SuccessExitStatus= Restart= OnFailure=

Slide 36

Slide 36 text

Typy określanie gotowości start przed timeout'em spełnienie zależności 6 różnych, 3 podstawowe

Slide 37

Slide 37 text

Typy określanie gotowości start przed timeout'em spełnienie zależności określanie zakończenia pomyślne wyjście? restart? 6 różnych, 3 podstawowe

Slide 38

Slide 38 text

Typy określanie gotowości start przed timeout'em spełnienie zależności określanie zakończenia pomyślne wyjście? restart? 6 różnych, 3 podstawowe: simple forking oneshot

Slide 39

Slide 39 text

Type=simple najprostszy brak sygnalizacji gotowości domyślny, trywialna demonizacja [Service] ExecStart=/root/bin/looper.sh

Slide 40

Slide 40 text

Type=forking dla tradycyjnych demonów gotowość: fork() + exit() zalecany PIDFile=

Slide 41

Slide 41 text

Type=oneshot dla skryptów gotowość: po zakończeniu pracy przydatny RemainAfterExit=

Slide 42

Slide 42 text

Jak rozpoznać typ?

Slide 43

Slide 43 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests…

Slide 44

Slide 44 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple

Slide 45

Slide 45 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple # /usr/sbin/otherdaemon #

Slide 46

Slide 46 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple # /usr/sbin/otherdaemon # → Type=forking

Slide 47

Slide 47 text

Pozostałe typy dbus – dla serwisów D-Bus/KDBus gotowość: zarejestrowanie nazwy idle – jak simple uruchomienie następuje „po zbootowaniu” notify – demon komunikuje się z systemd wymaga minimalnego patcha

Slide 48

Slide 48 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita

Slide 49

Slide 49 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita forking zamiast simple? po czasie TimeoutStartSec= usługa ubita

Slide 50

Slide 50 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita forking zamiast simple? po czasie TimeoutStartSec= usługa ubita simple zamiast oneshot? usługa przejdzie w stan failed

Slide 51

Slide 51 text

Typy domyślny simple pozwalają na określenie gotowości błędne podanie kończy się płaczem

Slide 52

Slide 52 text

Po swojemu

Slide 53

Slide 53 text

Po swojemu zmiany wprowadzamy w katalogu?

Slide 54

Slide 54 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować

Slide 55

Slide 55 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować 2) .include i zmiany tego, co nas interesuje

Slide 56

Slide 56 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować 2) .include i zmiany tego, co nas interesuje 3) *.d (drop-in dirs)

Slide 57

Slide 57 text

Dropins zachowana hierarchia run/etc/usr katalog .d/, pliki *.conf

Slide 58

Slide 58 text

Dropins zachowana hierarchia run/etc/usr katalog .d/, pliki *.conf pamiętać o [Sekcja]

Slide 59

Slide 59 text

satellite.target % cat /etc/systemd/system/satellite.target.d/mount.conf [Unit] RequiresMountsFor=/var/satellite

Slide 60

Slide 60 text

transmission-daemon.service.d/ % systemctl status transmission-daemon.service transmission-daemon.service - Transmission BitTorrent Daemon Loaded: loaded (/usr/lib/systemd/system/transmission-daemon.service; enabled) Drop-In: /etc/systemd/system/transmission-daemon.service.d └─10-user-zdzichu.conf, 20-io-sched-idle.conf, 30-exec-noauth.conf, 40-restart.conf Active: active (running) since Sat 2014-01-18 12:22:28 CET; 4 days ago

Slide 61

Slide 61 text

transmission-daemon.service.d/ 10-user-zdzichu.conf: [Service] User=zdzichu 20-io-sched-idle.conf: [Service] IOSchedulingClass=idle 30-exec-noauth.conf: [Service] ExecStart= ExecStart=/usr/bin/transmission-daemon -f --log-error -T 40-restart.conf: [Service] Restart=always

Slide 62

Slide 62 text

transmission-daemon.service.d/ 10-user-zdzichu.conf: [Service] User=zdzichu 20-io-sched-idle.conf: [Service] IOSchedulingClass=idle 30-exec-noauth.conf: [Service] ExecStart= ExecStart=/usr/bin/transmission-daemon -f --log-error -T 40-restart.conf: [Service] Restart=always

Slide 63

Slide 63 text

systemd-delta przegląd zmian [OVERRIDDEN] /etc/systemd/system/[email protected] /usr/lib/systemd/system/[email protected] → --- /usr/lib/systemd/system/[email protected] 2013-08-05 11:05:34.000000000 +0200 +++ /etc/systemd/system/[email protected] 2013-01-27 17:28:54.973741536 +0100 @@ -4,5 +4,5 @@ [Service] User=ident -ExecStart=/usr/sbin/in.authd -t60 --xerror --os -E +ExecStart=/usr/sbin/in.authd -t60 --xerror --os StandardInput=socket

Slide 64

Slide 64 text

Wartości domyślne + zewn. konfg /etc/default/* i /etc/sysconfg/* EnvironmentFile=/etc/sysconfg/ladvd ExecStart=/usr/sbin/ladvd $OPTIONS

Slide 65

Slide 65 text

Wartości domyślne + zewn. konfg /etc/default/* i /etc/sysconfg/* EnvironmentFile=/etc/sysconfg/ladvd ExecStart=/usr/sbin/ladvd $OPTIONS różnice między distro poszukanie konfguracji przez admina

Slide 66

Slide 66 text

Wartości domyślne + zewn. konfg 1) przenieść konfgurację do unita 2) zminimalizować zmienne środowiskowe 3) reguły nadpisywania, system-delta

Slide 67

Slide 67 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT} ?

Slide 68

Slide 68 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT}

Slide 69

Slide 69 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT} [Service] Environment=MOUNTD_PORT=9001 EnvironmentFile=-/etc/sysconfg/nfs ExecStart=/usr/sbin/rpc.mountd -p $MOUNTD_PORT

Slide 70

Slide 70 text

Po swojemu Konfguracja w /etc/ Kopiowanie, .include, dropiny systemd-delta systemctl cat (v209)

Slide 71

Slide 71 text

Unity nie gryzą dzielić na mniejsze

Slide 72

Slide 72 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/

Slide 73

Slide 73 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d

Slide 74

Slide 74 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity

Slide 75

Slide 75 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity – wspólne restarty? PartOf= Condition*= Twoimi przyjaciółmi

Slide 76

Slide 76 text

[email protected] [Unit] Description=OpenSSH per-connection server daemon Wants=sshd-keygen.service After=auditd.service sshd-keygen.service

Slide 77

Slide 77 text

[email protected] [Unit] Description=OpenSSH per-connection server daemon Wants=sshd-keygen.service After=auditd.service sshd-keygen.service # cat sshd-keygen.service [Unit] Description=OpenSSH Server Key Generation ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key

Slide 78

Slide 78 text

abrt-vmcore.service abrt-vmcore.service - Harvest vmcores for ABRT Loaded: loaded (/usr/lib/systemd/system/abrt-vmcore.service; enabled) Active: inactive (dead) start condition failed at Thu 2014-02-06 16:42:11 CET; 5s ago ConditionDirectoryNotEmpty=/var/crash was not met Feb 06 16:42:11 mother.pipebreaker.pl systemd[1]: Started Harvest vmcores for ABRT.

Slide 79

Slide 79 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity – wspólne restarty? PartOf= Condition*= Twoimi przyjaciółmi

Slide 80

Slide 80 text

Type=notify pełna informacja rozszerzony status

Slide 81

Slide 81 text

Type=notify pełna informacja rozszerzony status – sd_notify("STATUS=Robię dwójkę")

Slide 82

Slide 82 text

Type=notify pełna informacja rozszerzony status – sd_notify("STATUS=Robię dwójkę") – systemd-notify --status="Przetwarzam plik 42 z 69."

Slide 83

Slide 83 text

rozszerzony status httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since czw 2014-02-13 11:10:46 CET; 4 days ago Process: 27130 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Status: "Total requests: 3432; Current requests/sec: 4; Current traffic: 2423 B/sec" CGroup: /system.slice/httpd.service ├─ 6368 /usr/sbin/httpd -DFOREGROUND ├─ 8408 /usr/sbin/httpd -DFOREGROUND

Slide 84

Slide 84 text

rozszerzony status httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since czw 2014-02-13 11:10:46 CET; 4 days ago Process: 27130 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Status: "Total requests: 3432; Current requests/sec: 4; Current traffic: 2423 B/sec" CGroup: /system.slice/httpd.service ├─ 6368 /usr/sbin/httpd -DFOREGROUND ├─ 8408 /usr/sbin/httpd -DFOREGROUND transmission-daemon.service - Transmission BitTorrent Daemon Loaded: loaded (/usr/lib/systemd/system/transmission-daemon.service; enabled) Drop-In: /etc/systemd/system/transmission-daemon.service.d └─10-user-zdzichu.conf, 20-io-sched-idle.conf, 30-exec-noauth.conf, 40-restart.conf Active: active (running) since Sat 2014-01-18 12:22:28 CET; 4 weeks 2 days ago Status: "Uploading 0.00 KBps, Downloading 0.02 KBps." CGroup: /system.slice/transmission-daemon.service └─9096 /usr/bin/transmission-daemon -f --log-error -T

Slide 85

Slide 85 text

rozszerzony status - python #!/usr/bin/python # # logs temperature from OWFS into postgres database import glob import os import psycopg2 import systemd.daemon import time sleep_seconds = 60 systemd.daemon.notify("STATUS=Opening DB connection...") dbconn = psycopg2.connect("dbname=temperature_log") dbconn.autocommit=True cur = dbconn.cursor() cur.execute("PREPARE put_temperature AS INSERT INTO temperatures (datetime, sensor_id, value) VALUES (NOW(), (SELECT id FROM sensors WHERE SN=$1), $2);") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") while True: for SN in glob.glob("/run/owfs/??.????????????"): systemd.daemon.notify("STATUS=Reading sensors...") temperature = open("%s/temperature" % SN).readline() # we won't be needing full path anymore, trim it SN = os.path.basename(SN) try: cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) except psycopg2.IntegrityError: print "New sensor %s! Adding to database, please correct description." % SN cur.execute("INSERT INTO sensors (SN) VALUES (%s)", (SN,)) cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) time.sleep(sleep_seconds) systemd.daemon.notify("STATUS=Cleaning up") dbconn.close() systemd.daemon.notify("READY=0")

Slide 86

Slide 86 text

rozszerzony status - python #!/usr/bin/python # # logs temperature from OWFS into postgres database import glob import os import psycopg2 import systemd.daemon import time sleep_seconds = 60 systemd.daemon.notify("STATUS=Opening DB connection...") dbconn = psycopg2.connect("dbname=temperature_log") dbconn.autocommit=True cur = dbconn.cursor() cur.execute("PREPARE put_temperature AS INSERT INTO temperatures (datetime, sensor_id, value) VALUES (NOW(), (SELECT id FROM sensors WHERE SN=$1), $2);") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") while True: for SN in glob.glob("/run/owfs/??.????????????"): systemd.daemon.notify("STATUS=Reading sensors...") temperature = open("%s/temperature" % SN).readline() # we won't be needing full path anymore, trim it SN = os.path.basename(SN) try: cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) except psycopg2.IntegrityError: print "New sensor %s! Adding to database, please correct description." % SN cur.execute("INSERT INTO sensors (SN) VALUES (%s)", (SN,)) cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) time.sleep(sleep_seconds) systemd.daemon.notify("STATUS=Cleaning up") dbconn.close() systemd.daemon.notify("READY=0")

Slide 87

Slide 87 text

rozszerzony status - python import systemd.daemon systemd.daemon.notify("STATUS=Opening DB connection...") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") systemd.daemon.notify("STATUS=Reading sensors...") systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) systemd.daemon.notify("STATUS=Cleaning up") systemd.daemon.notify("READY=0")

Slide 88

Slide 88 text

rozszerzony status - python % systemctl --user status logtemp logtemp.service - database logging of temperature from OWFS Loaded: loaded (/home/zdzichu/dev/logtemp/logtemp.service; enabled) Active: active (running) since Thu 2014-02-06 16:56:23 CET; 1 weeks 3 days ago Main PID: 11078 (logtemp.py) Status: "Sleeping until Mon Feb 17 13:35:51 2014" CGroup: /user.slice/user-1001.slice/[email protected]/logtemp.service └─11078 /usr/bin/python /home/zdzichu/dev/logtemp/logtemp.py Feb 06 16:56:22 mother.pipebreaker.pl systemd[1251]: Stopping database logging of temperature from OWFS... Feb 06 16:56:22 mother.pipebreaker.pl systemd[1251]: Starting database logging of temperature from OWFS... Feb 06 16:56:23 mother.pipebreaker.pl systemd[1251]: Started database logging of temperature from OWFS.

Slide 89

Slide 89 text

Type=notify dokładnie określa gotowość usługi rozszerza informację o statusie wymaga minimalnego łatanie

Slide 90

Slide 90 text

systemctl enable debug-shell debug-shell.service - Early root shell on /dev/tty9 FOR DEBUGGING ONLY Loaded: loaded (/usr/lib/systemd/system/debug-shell.service; disabled) Active: inactive (dead) Docs: man:sushell(8) Pomocne również (kernel command line): ● systemd.confrm_spawn=1 ● systemd.unit= ● rescue, emergency

Slide 91

Slide 91 text

journalctl logi od samego startu (również initramfs) journalctl /dev/sda journalctl -u postfx journalctl --since=yesterday

Slide 92

Slide 92 text

urlz for lulz ● systemctl help ● http://www.freedesktop.org/software/systemd/man/systemd.directives.html ● T-DOSE 2012, Open Source Lennart Poettering, The Systemd Journal http://www.youtube.com/watch?v=o1lUeQVYuNs ● CoreOS fleet – distributed init system http://www.youtube.com/watch?v=u91DnN-yaJ8 ● http://pkgs.fedoraproject.org/cgit/

Slide 93

Slide 93 text

systemd – ściągawka Dziękuje!

Slide 94

Slide 94 text

systemd – ściągawka systemd – ściągawka Zimowisko TLUG 2014 Tomasz Torcz

Slide 95

Slide 95 text

Rozpiska dlaczego po co co z tego dla admina dobre praktyki Co do prezentacji: materiału jest dość dużo, ale postarałem się zrobić komentarze w slajdach – zachęcam więc do ściągnięcia. (jeśli to czytasz, to dobrze, że ściągnąłeś :) Powrót do tematu z zimowiska 2011, dlaczego? Bo systemd nie przeminął, a wręcz przeciwnie.

Slide 96

Slide 96 text

Know your tools nie śpię, bo restartuję twittera Twórca twittera na początku dużo czasu poświęcał na sprawdzanie, czy jego aplikacja się nie wywróciła. Spał z otwartym laptopem, budząc się co jakiś czas i sprawdzając jej stan. Gdyby znał swoje narzędzia trochę lepiej, byłby w stanie napisać chociażby while true; do ./twitter; done Prawdziwym wybawieniem był dla niego /etc/inittab

Slide 97

Slide 97 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia

Slide 98

Slide 98 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” Debian – decyzja 11 lutego 2014

Slide 99

Slide 99 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. → Debian – decyzja 11 lutego 2014

Slide 100

Slide 100 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. → czwarta połowa: Ubuntu! Debian – decyzja 11 lutego 2014 Ubuntu – 14 lutego 2014

Slide 101

Slide 101 text

Why would I care? połowa linuksianego świata: Fedora, Arch, Mageia druga połowa: Debian 8.0 ”Jessie” trzecia połowa: RHEL7 CentOS, Scientifc etc. → czwarta połowa: Ubuntu! no cake: ChromeOS, Android/Linux aczkolwiek: SailfshOS (Jolla), GENIVI, LSB5.0 Debian – decyzja 11 lutego 2014 Ubuntu – 14 lutego 2014 Mimo opanowania 200% linuksowego świata, wciąż nie ma systemd w najpopularniejszej dystrybucji: As of September 2013, one billion Android devices have been activated Jednakże są telefony z systemd – system operacyjny Sailfish, telefony Jolla (ciekawostka: sprzedawane od 2013, wersja 1.0 Sailfisha – 21 lutego 2014); również Tizen (Samsung/Intel) GENIVI to konsorcjum robiące automotive Linux (dla samochodów) LSB = Linux Standards Base

Slide 102

Slide 102 text

Pisownia systemd

Slide 103

Slide 103 text

Pisownia systemd SystemD

Slide 104

Slide 104 text

Pisownia systemd SystemD systemD

Slide 105

Slide 105 text

Pisownia systemd SystemD systemD SyStEmD

Slide 106

Slide 106 text

Co to robi? zarządza systemem i usługami dzisiaj skupimy się na usługach Dzięki systemd Admin może sobie ułatwić życie na 100 sposóbów. Ale mam tylko jeden wykład, nie 100.

Slide 107

Slide 107 text

Usługi program lub zespół programów działający cały czas lub od czasu do czasu opis/defnicja usługi to unit zespół programów – gdyż usługa może składać się z wielu procesów. W takich przypadkach zazwyczaj wszystkie te procesy potrzebne są do działania. Razem powinny podlegać restartom, stopowi, ograniczaniu ich zasobów. Typowe demony działają cały czas. Od czasu do czasu – zadania uruchamianie z crona, z atd; Np. CUPS – uruchamiany, gdy w obserwowanych katalogu pojawi się coś do wydruku. Niezależnie od sposobu uruchomienia – tak samo sprawdzamy status, modyfikujemy, zabijamy opis/definicja w systemd to unit

Slide 108

Slide 108 text

uptimed.service [Unit] Description=Uptime record tracking daemon Documentation=man:uptimed(8) man:uprecords(1) [Service] ExecStartPre=/usr/sbin/uptimed -b ExecStart=/usr/sbin/uptimed -f [Install] WantedBy=multi-user.target To jest przykładowy unit. Pierwsza sekcja zawiera sprawy opisowe. Może również zawierać odniesienia do innych unitów (definicję zależności) Druga - to „usługa właściwa” Trzecia zawiera tylko informację, w jakich warunkach ma być uruchomiony. multi-user.target to taki typowy pełen start systemu.

Slide 109

Slide 109 text

Usługi program lub zespół programów działający cały czas lub od czasu do czasu opis/defnicja usługi to unit unity zebrane w katalogach: /usr – systemowe; /etc – administratora; /run – konfguracja nietrwała (runtime) zespół programów – gdyż usługa może składać się z wielu procesów. W takich przypadkach zazwyczaj wszystkie te procesy potrzebne są do działania. Razem powinny podlegać restartom, stopowi, ograniczaniu ich zasobów. Typowe demony działają cały czas. Od czasu do czasu – zadania uruchamianie z crona, z atd; Np. CUPS – uruchamiany, gdy w obserwowanych katalogu pojawi się coś do wydruku. opis/definicja w systemd to unit Katalogi – ważna sprawa, więc od niej zaczniemy; to daje punkt zaczepienia – gdzie szukać

Slide 110

Slide 110 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian) do /usr trafiają rzeczy przygotowane przez dystrybucję – instalowane w pakietach dlaczego systemd/system (masło/maślane)? bo to są usługi systemowe; użytkownicy mogą mieć swoje systemctl –user szuka podobnie, ale s/system/user/ i dodatkowo w ~/.config/systemd/user /run – rzeczy tworzone w trakcie działania systemu, znikają przy reboocie

Slide 111

Slide 111 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian) /etc/systemd/system – konfguracja właściwa systemctl enable, systemctl set-property do /usr trafiają rzeczy przygotowane przez dystrybucję – instalowane w pakietach dlaczego systemd/system (masło/maślane)? bo to są usługi systemowe; użytkownicy mogą mieć swoje systemctl –user szuka podobnie, ale s/system/user/ i dodatkowo w ~/.config/systemd/user /run – rzeczy tworzone w trakcie działania systemu, znikają przy reboocie

Slide 112

Slide 112 text

Katalogi /usr/lib/systemd/system – systemowe nie ruszać (/lib/systemd/system – sprawdzić, czy nie Debian) /etc/systemd/system – konfguracja właściwa systemctl enable, systemctl set-property /run – generatory, najwyższy priorytet do /usr trafiają rzeczy przygotowane przez dystrybucję – instalowane w pakietach dlaczego systemd/system (masło/maślane)? bo to są usługi systemowe; użytkownicy mogą mieć swoje systemctl –user szuka podobnie, ale s/system/user/ i dodatkowo w ~/.config/systemd/user /run – rzeczy tworzone w trakcie działania systemu, znikają przy reboocie

Slide 113

Slide 113 text

systemctl start exim4 Czy już działa? To jest przykład wyszukiwania unitów Jak zadziała tyłowe polecenie, które startuje usługę exim4?

Slide 114

Slide 114 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? To jest przykład wyszukiwania unitów Jak zadziała tyłowe polecenie, które startuje usługę exim4?

Slide 115

Slide 115 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ? To jest przykład wyszukiwania unitów Jak zadziała tyłowe polecenie, które startuje usługę exim4?

Slide 116

Slide 116 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ? nie czy jest /usr/lib/systemd/system/exim4.service ? To jest przykład wyszukiwania unitów Jak zadziała tyłowe polecenie, które startuje usługę exim4? Sprawdzone wszystkie ścieżki i wciąż nie ma? SYSV compatibility!

Slide 117

Slide 117 text

systemctl start exim4 Czy już działa? Nie, więc: czy jest /run/systemd/system/exim4.service ? nie czy jest /etc/systemd/system/exim4.service ? nie czy jest /usr/lib/systemd/system/exim4.service ? a może jest /etc/init.d/exim4 To jest przykład wyszukiwania unitów Jak zadziała tyłowe polecenie, które startuje usługę exim4? Mask – te czerwone mogą być linkiem do /dev/null - zabranianie startu (zwłaszcza na żądanie) – mocniejsza wersja disable - nie można też wystartować ręcznie

Slide 118

Slide 118 text

Skąd ty? # systemctl status polipo-purge.service polipo-purge.service - flush polipo disk cache Loaded: loaded (/etc/systemd/system/polipo- purge.service; static) […] Wow, tak dużo katalogu, tyle możliwości. Jak się połapać, skąd był wzięty unit? Odp: systemctl status

Slide 119

Slide 119 text

Skąd ty? # systemctl status polipo-purge.service polipo-purge.service - flush polipo disk cache Loaded: loaded (/etc/systemd/system/polipo- purge.service; static) […] # systemctl status hp-health.service hp-health.service - LSB: hp System Health Monitor and Command line Utility Package. Loaded: loaded (/etc/rc.d/init.d/hp-health) […] Wow, tak dużo katalogu, tyle możliwości. Jak się połapać, skąd był wzięty unit? Odp: systemctl status

Slide 120

Slide 120 text

Unity 1) usługi zdefniowane są w unitach 2) najważniejsza linijka to ExecStart= wskazująca binarkę 3) kolejność szukania: /run → /etc → /usr (→ SysV) fallback do sysv umożliwia powolną migrację: można utworzyć unit tak samo nazwany jak skrypt SysV i go przetestować A po co? Musi być definicja ExecStart=, gdyż systemd śledzi cykl życia

Slide 121

Slide 121 text

Cykl życia i śledzenie wykonania start gotowość działanie zakończenie → → → Cykl, więc wyobraźcie sobie strzałkę z powrotem na początek

Slide 122

Slide 122 text

Cykl życia i śledzenie wykonania start gotowość działanie zakończenie → → → start: lockfle nie potrzebny, czyste środowisko Cykl, więc wyobraźcie sobie strzałkę z powrotem na początek start: nie da się dwa razy tej samej usługi uruchomić, więc nie trzeba się obawiać kilku systemctl start; środowisko minimalne, więc nie ma ryzyka, że jakieś zmienne są dziedziczione z rootshell; brak ryzyka: w testach po ssh działa, po boocie już nie (bo inne środowisko)

Slide 123

Slide 123 text

Cykl życia i śledzenie wykonania start → gotowość działanie zakończenie → → start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne Cykl, więc wyobraźvie sobie strzałkę z powrotem na początek start: nie da się dwa razy tej samej usługi uruchomić, więc nie trzeba się obawiać kilku systemctl start; środowisko minimalne, więc nie ma ryzyka, że jakieś zmienne są dziedziczione z rootshell; brak ryzyka: w testach po ssh działa, po boocie już nie (bo inne środowisko) gotowość: usługa zainicjowała się i obsługuje zapytania

Slide 124

Slide 124 text

Cykl życia i śledzenie wykonania start → gotowość → działanie zakończenie → start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne działanie: procesy potomne w ramach usługi Cykl, więc wyobraźcie sobie strzałkę z powrotem na początek start: nie da się dwa razy tej samej usługi uruchomić, więc nie trzeba się obawiać kilku systemctl start; środowisko minimalne, więc nie ma ryzyka, że jakieś zmienne są dziedziczione z rootshell; brak ryzyka: w testach po ssh działa, po boocie już nie (bo inne środowisko) gotowość: usługa zainicjowała się i obsługuje zapytania działanie: ograniczenia zasobów per usługa tutaj QUIZ z rozpoznawaniem

Slide 125

Slide 125 text

6811 ? S 0:00 pickup -l -t unix -u

Slide 126

Slide 126 text

6811 ? S 0:00 pickup -l -t unix -u # systemctl status 6811

Slide 127

Slide 127 text

6811 ? S 0:00 pickup -l -t unix -u # systemctl status 6811 postfix.service - Postfx Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfx.service; enabled) Active: active (running) since Thu 2014-02-06 16:39:22 CET; 46s ago Process: 6735 ExecStart=/usr/sbin/postfx start (code=exited, status=0/SUCCESS) Process: 6732 ExecStartPre=/usr/libexec/postfx/chroot-update (code=exited, status=0/SUCCESS) Process: 6727 ExecStartPre=/usr/libexec/postfx/aliasesdb (code=exited, status=0/SUCCESS) Main PID: 6810 (master) CGroup: /system.slice/postfx.service ├─6810 /usr/libexec/postfx/master -w ├─6811 pickup -l -t unix -u └─6812 qmgr -l -t unix -u Feb 06 16:39:22 mother.pipebreaker.pl postfx/master[6810]: daemon started -- version 2.10.2, confguration /etc/postfx Feb 06 16:39:22 mother.pipebreaker.pl systemd[1]: Started Postfx Mail Transport Agent. Jak mówiłem przy definicji usługi, na jedną usługę może składać się kilka procesów. Tutaj są trzy, składają się na postfiksa.

Slide 128

Slide 128 text

Cykl życia i śledzenie wykonania start → gotowość → działanie → zakończenie start: lockfle nie potrzebny, czyste środowisko gotowość: można uruchamiać zależne działanie: procesy potomne w ramach usługi zakończenie: OK czy crash? restartować? SuccessExitStatus= Restart= OnFailure= Cykl, więc wyobraźcie sobie strzałkę z powrotem na początek start: nie da się dwa razy tej samej usługi uruchomić, więc nie trzeba się obawiać kilku systemctl start; środowisko minimalne, więc nie ma ryzyka, że jakieś zmienne są dziedziczione z rootshell; brak ryzyka: w testach po ssh działa, po boocie już nie (bo inne środowisko) gotowość: usługa zainicjowała się i obsługuje zapytania działanie: ograniczenia zasobów per usługa tutaj QUIZ z rozpoznawaniem zakończenie: różne reakcje, ubicie wszystkich proc.

Slide 129

Slide 129 text

Typy określanie gotowości start przed timeout'em spełnienie zależności 6 różnych, 3 podstawowe W nawiązaniu do wcześniej podanego cyklu życia Gotowość: kiedy usługę można uznać za wystartowaną. Co za tym idzie: uruchomić usługi od niej zależne Typ podaje się w unicie, definiując usługę.

Slide 130

Slide 130 text

Typy określanie gotowości start przed timeout'em spełnienie zależności określanie zakończenia pomyślne wyjście? restart? 6 różnych, 3 podstawowe W nawiązaniu do wcześniej podanego cyklu życia Gotowość: kiedy usługę można uznać za wystartowaną. Co za tym idzie: uruchomić usługi od niej zależne Typ podaje się w unicie, definiując usługę.

Slide 131

Slide 131 text

Typy określanie gotowości start przed timeout'em spełnienie zależności określanie zakończenia pomyślne wyjście? restart? 6 różnych, 3 podstawowe: simple forking oneshot W nawiązaniu do wcześniej podanego cyklu życia Gotowość: kiedy usługę można uznać za wystartowaną. Co za tym idzie: uruchomić usługi od niej zależne Typ podaje się w unicie, definiując usługę.

Slide 132

Slide 132 text

Type=simple najprostszy brak sygnalizacji gotowości domyślny, trywialna demonizacja [Service] ExecStart=/root/bin/looper.sh Brak sygnalizacji gotowości Kompatybilny z niektórymi innymi initami (np. daemontools DJBa) odpowiednik wpisania do /etc/inittab z opcją respawn zdejmuje z twórców demonów potrzebę forkowania, otwierania logów itp

Slide 133

Slide 133 text

Type=forking dla tradycyjnych demonów gotowość: fork() + exit() zalecany PIDFile= fork() tworzy dwa procesy, rodzica i potomny rodzic kończy pracę – to znak dla systemd, że usługa jest gotowa jeśli PIDFile= jest podany, to usługa uznawana jest za gotową jeśli w PIDFile zapisany zostanie PID głównego demona.

Slide 134

Slide 134 text

Type=oneshot dla skryptów gotowość: po zakończeniu pracy przydatny RemainAfterExit= proces musi się zakończyć RemainAfterExit=true powoduje, że usługa po zakończeniu jest w stanie „aktywnym”. Czyli nie będzie można jej „uruchomić” drugi raz (np.. przez przypadek), można natomiast zrobić stop/start albo restart. Przydatne np. do cronjobs

Slide 135

Slide 135 text

Jak rozpoznać typ? Pisząc nowy unit, trzeba podać prawidłowy typ. Jak określić „prawidłowy”? Najprościej – odpalić z shella

Slide 136

Slide 136 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… Po uruchomieniu program działa „na konsoli”. Można go np.. przerwać przez Control-C

Slide 137

Slide 137 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple Po uruchomieniu program działa „na konsoli”. Można go np.. przerwać przez Control-C

Slide 138

Slide 138 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple # /usr/sbin/otherdaemon # Po uruchomieniu program działa „na konsoli”. Można go np.. przerwać przez Control-C SIMPLE Drugi program – przechodzi w tło (zapewne forkuje), wraca nam prompt shella. FORKING

Slide 139

Slide 139 text

Jak rozpoznać typ? # /usr/sbin/daemon Copyright 2014 Foo Bar Baz Corp. Serving Requests… → Type=simple # /usr/sbin/otherdaemon # → Type=forking Po uruchomieniu program działa „na konsoli”. Można go np.. przerwać przez Control-C SIMPLE Drugi program – przechodzi w tło (zapewne forkuje), wraca nam prompt shella. FORKING Oczywiście demony mogą mieć przełączniki zmieniające zachowanie: --foreground --daemonize --[no]detach Czasem --debug (dodatkowo zwiększa output)

Slide 140

Slide 140 text

Pozostałe typy dbus – dla serwisów D-Bus/KDBus gotowość: zarejestrowanie nazwy idle – jak simple uruchomienie następuje „po zbootowaniu” notify – demon komunikuje się z systemd wymaga minimalnego patcha nazwę podaje się w BusName= podanie BusName= defaultuje typ to dbus dla startowania on-demand idle – przez „po zbootowaniu” rozumiany jest moment, kiedy po raz pierwszy od uruchomienia komputera kolejka zadań systemd jest pusta notify opisany szerzej pod koniec

Slide 141

Slide 141 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita A co jeśli podamy zły typ? simple zamiast forking czyli np., zapomnimy Type= Usługa forkuje, znika wystartowany proces: dla systemd jest to znak, że usługa się zakończyła, ubije pozostałe procesy

Slide 142

Slide 142 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita forking zamiast simple? po czasie TimeoutStartSec= usługa ubita A co jeśli podamy zły typ? simple zamiast forking czyli np., zapomnimy Type= Usługa forkuje, znika wystartowany proces: dla systemd jest to znak, że usługa się zakończyła, ubije pozostałe procesy forking zamiast simple: czeka na fork i się nie doczeka; domyślny timeout 90 sekund

Slide 143

Slide 143 text

Na złość mamie simple zamiast forking? zaraz po starcie usługa zostanie ubita forking zamiast simple? po czasie TimeoutStartSec= usługa ubita simple zamiast oneshot? usługa przejdzie w stan failed A co jeśli podamy zły typ? simple zamiast forking czyli np., zapomnimy Type= Usługa forkuje, znika wystartowany proces: dla systemd jest to znak, że usługa się zakończyła, ubije pozostałe procesy forking zamiast simple: czeka na fork i się nie doczeka; domyślny timeout 90 sekund simple (czyli też brak) przy skryptach zamiast oneshot; failed powoduje niespełnione zależności; robi się failed, gdyż skrypt po zrobieniu roboty kończy się

Slide 144

Slide 144 text

Typy domyślny simple pozwalają na określenie gotowości błędne podanie kończy się płaczem

Slide 145

Slide 145 text

Po swojemu Radziecka maszyna do golenia Tak samo dystrybucja dostarcza „skryptów startowych”, czyli definicji unitów. Admin czasem musi je zmodyfikować: dodać zależność, uruchomić powiązanie usługi, zmodyfikować parametr

Slide 146

Slide 146 text

Po swojemu zmiany wprowadzamy w katalogu? QUIZ nr 2

Slide 147

Slide 147 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować pamiętamy o kolejności wyszukiwania, i że adminowe /etc przysłania systemowe /usr; NIE edytujemy w /usr – zostanie nadpisane przy upgradzie pakietu Trzy metody customizacji, ich wady i zalety: etc→usr: + widać od razu całość zmian; - przy aktualizacji pakietów może się coś zmienić

Slide 148

Slide 148 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować 2) .include i zmiany tego, co nas interesuje pamiętamy o kolejnośći wyszukiwania, i że adminowe /etc przysłania systemowe /usr NIE edytujemy w /usr – zostanie nadpisane przy upgradzie pakietu Trzy metody customizacji, ich wady i zalety: etc→usr: + widać od razu całość; - przy aktualizacji pakietów może się coś zmienić .include: + widać zmiany; - czasem trudno nadpisać oryginalne wartości; - metoda uznana za przestarzałą i wycofywana

Slide 149

Slide 149 text

Po swojemu zmiany wprowadzamy w katalogu /etc/… 1) skopiować unit z /usr/… i edytować 2) .include i zmiany tego, co nas interesuje 3) *.d (drop-in dirs) pamiętamy o kolejności wyszukiwania, i że adminowe /etc przysłania systemowe /usr NIE edytujemy w /usr – zostanie nadpisane przy upgradzie pakietu Trzy metody customizacji, ich wady i zalety: etc→usr: + widać od razu całość; - przy aktualizacji pakietów może się coś zmienić .include: + widać zmiany; - czasem trudno nadpisać oryginalne wartości; - metoda uznana za przestarzałą i wycofywana dropiny: + łatwa automatyzacja; - nieoczywiste nadpisywanie

Slide 150

Slide 150 text

Dropins zachowana hierarchia run/etc/usr katalog .d/, pliki *.conf systemctl set-property (ograniczenia via cgroups) – powoduje automatycznie tworzenie dropinów w /etc

Slide 151

Slide 151 text

Dropins zachowana hierarchia run/etc/usr katalog .d/, pliki *.conf pamiętać o [Sekcja] systemctl set-property (ograniczenia via cgroups) – powoduje automatycznie tworzenie dropinów w /etc

Slide 152

Slide 152 text

satellite.target % cat /etc/systemd/system/satellite.target.d/mount.conf [Unit] RequiresMountsFor=/var/satellite Przykład dropinu Poza usługami, systemd zarządza też punktami mountowania – głównie w celu umożliwienia wyrażenia zależności od nich

Slide 153

Slide 153 text

transmission-daemon.service.d/ % systemctl status transmission-daemon.service transmission-daemon.service - Transmission BitTorrent Daemon Loaded: loaded (/usr/lib/systemd/system/transmission-daemon.service; enabled) Drop-In: /etc/systemd/system/transmission-daemon.service.d └─10-user-zdzichu.conf, 20-io-sched-idle.conf, 30-exec-noauth.conf, 40-restart.conf Active: active (running) since Sat 2014-01-18 12:22:28 CET; 4 days ago Tutaj widzimy: niezmodyfikowana jednostka w /usr customizacja dokonana dropinami – 4 pliki *conf Przyjrzyjmy się zmianom...

Slide 154

Slide 154 text

transmission-daemon.service.d/ 10-user-zdzichu.conf: [Service] User=zdzichu 20-io-sched-idle.conf: [Service] IOSchedulingClass=idle 30-exec-noauth.conf: [Service] ExecStart= ExecStart=/usr/bin/transmission-daemon -f --log-error -T 40-restart.conf: [Service] Restart=always

Slide 155

Slide 155 text

transmission-daemon.service.d/ 10-user-zdzichu.conf: [Service] User=zdzichu 20-io-sched-idle.conf: [Service] IOSchedulingClass=idle 30-exec-noauth.conf: [Service] ExecStart= ExecStart=/usr/bin/transmission-daemon -f --log-error -T 40-restart.conf: [Service] Restart=always where the assignment of an empty string removes any previous assignment (ExecStart is defined as a list, so that a "one-shot" service can run a list of processes) and the second assignment gives the desired complete list of command line arguments.

Slide 156

Slide 156 text

systemd-delta przegląd zmian [OVERRIDDEN] /etc/systemd/system/[email protected] /usr/lib/systemd/system/[email protected] → --- /usr/lib/systemd/system/[email protected] 2013-08-05 11:05:34.000000000 +0200 +++ /etc/systemd/system/[email protected] 2013-01-27 17:28:54.973741536 +0100 @@ -4,5 +4,5 @@ [Service] User=ident -ExecStart=/usr/sbin/in.authd -t60 --xerror --os -E +ExecStart=/usr/sbin/in.authd -t60 --xerror --os StandardInput=socket jak się zorientować w zmianach? systemctl status może nie wystarczać delta wyświetla modyfikacje, override, masked

Slide 157

Slide 157 text

Wartości domyślne + zewn. konfg /etc/default/* i /etc/sysconfg/* EnvironmentFile=/etc/sysconfg/ladvd ExecStart=/usr/sbin/ladvd $OPTIONS Unity to nie skrypty. w skryptach startowych czasem znajdują się funkcje podejmujące decyzję. Dwa, dystrybucje aby uniknąć modyfikacji samych skryptów startowych, część opcji wynoszą do zewnętrznych plików. W systemd nie jest to konieczne, gdyż modyfikacje unitów są minimalne, proste i widoczne.

Slide 158

Slide 158 text

Wartości domyślne + zewn. konfg /etc/default/* i /etc/sysconfg/* EnvironmentFile=/etc/sysconfg/ladvd ExecStart=/usr/sbin/ladvd $OPTIONS różnice między distro poszukanie konfguracji przez admina Unity to nie skrypty. w skryptach startowych czasem znajdują się funkcje podejmujące decyzję. Dwa, dystrybucje aby uniknąć modyfikacji samych skryptów startowych, część opcji wynoszą do zewnętrznych plików. W systemd nie jest to konieczne, gdyż modyfikacje unitów są minimalne, proste i widoczne. Absolutną herezją są rzeczy typu ENABLED=false w zewnetrznych plikach. Usługa niby włączona, a nie startuje.

Slide 159

Slide 159 text

Wartości domyślne + zewn. konfg 1) przenieść konfgurację do unita 2) zminimalizować zmienne środowiskowe 3) reguły nadpisywania, system-delta Pozbywanie się zewnętrznych konfigów. Zamiast podstawiać VAR=32 i potem $VAR, lepiej od razu wpisywać 32 w unicie

Slide 160

Slide 160 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT} ? Unity to nie skrypty Ale czasem się nie jednak nie da jeśli zdefiniowany MOUNTD_PORT, to dodaj „-p $MOUNTD_PORT”

Slide 161

Slide 161 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT} Unity to nie skrypty Ale czasem się nie jednak nie da jeśli zdefiniowany MOUNTD_PORT, to dodaj „-p $MOUNTD_PORT” Takiej konstrukcji nie możemy zastosować, bo to shell

Slide 162

Slide 162 text

Wartości domyślne + zewn. konfg . /etc/sysconfg/nfs /usr/sbin/rpc.mountd ${MOUNTD_PORT:+-p $MOUNTD_PORT} [Service] Environment=MOUNTD_PORT=9001 EnvironmentFile=-/etc/sysconfg/nfs ExecStart=/usr/sbin/rpc.mountd -p $MOUNTD_PORT Unity to nie skrypty Ale czasem się nie jednak nie da jeśli zdefiniowany MOUNTD_PORT, to dodaj „-p $MOUNTD_PORT” Takiej konstrukcji nie możemy zastosować, bo to shell . Over 9000!!!! 1) bezwarunkowo podawany port 2) znak minus przy sysconfig – nie wariuje przy braku

Slide 163

Slide 163 text

Po swojemu Konfguracja w /etc/ Kopiowanie, .include, dropiny systemd-delta systemctl cat (v209)

Slide 164

Slide 164 text

Unity nie gryzą dzielić na mniejsze Wielkie skrypty SYSV często robią kilka rzeczy naraz. Do niektórych są lepsze mechanizmy Dobra praktyki tworzenia unitów i migracji ze skryptów SYSV

Slide 165

Slide 165 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ Wielkie skrypty SYSV często robią kilka rzeczy naraz. Do niektórych są lepsze mechanizmy

Slide 166

Slide 166 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d Wielkie skrypty SYSV często robią kilka rzeczy naraz. Do niektórych są lepsze mechanizmy tmpfiles: 1) tak przydatny, że dawno sportowany do innych dystrybucji i initów; 2) potrzebny przy /run na tmpfs; 3) przesłanianie katalogów podobnie jak przy unitach

Slide 167

Slide 167 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity Wielkie skrypty SYSV często robią kilka rzeczy naraz. Do niektórych są lepsze mechanizmy tmpfiles: 1) tak przydatny, że dawno sportowany do innych dystrybucji i initów; 2) potrzebny przy /run na tmpfs; 3) przesłanianie katalogów podobnie jak przy unitach ExecStartPre= kilka poleceń wykonanych wg kolejności w pliku; może to być np.. sprawdzenie poprawności konfiga lub coś. nie powinno to być ładowanie modułów czy mkdir

Slide 168

Slide 168 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity – wspólne restarty? PartOf= Condition*= Twoimi przyjaciółmi Wielkie skrypty SYSV często robią kilka rzeczy naraz. Do niektórych są lepsze mechanizmy tmpfiles: 1) tak przydatny, że dawno sportowany do innych dystrybucji i initów; 2) potrzebny przy /run na tmpfs; 3) przesłanianie katalogów podobnie jak przy unitach ExecStartPre= kilka poleceń wykonanych wg kolejności w pliku; może to być np.. sprawdzenie poprawności konfiga lub coś. nie powinno to być ładowanie modułów czy mkdir Jak podzielimy na mniejsze, może nam się zrobić mnóstwo unitów; przyjrzyjmy się warunkom

Slide 169

Slide 169 text

[email protected] [Unit] Description=OpenSSH per-connection server daemon Wants=sshd-keygen.service After=auditd.service sshd-keygen.service ssh keygen jest wołane za każdym razem, ALE to nie znaczy, że zawsze się wykona, gdyż…

Slide 170

Slide 170 text

[email protected] [Unit] Description=OpenSSH per-connection server daemon Wants=sshd-keygen.service After=auditd.service sshd-keygen.service # cat sshd-keygen.service [Unit] Description=OpenSSH Server Key Generation ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key ssh keygen jest wołane za każdym razem, ALE to nie znaczy, że zawsze się wykona, gdyż… uruchomienie keygen zależy od braku plików z kluczami

Slide 171

Slide 171 text

abrt-vmcore.service abrt-vmcore.service - Harvest vmcores for ABRT Loaded: loaded (/usr/lib/systemd/system/abrt-vmcore.service; enabled) Active: inactive (dead) start condition failed at Thu 2014-02-06 16:42:11 CET; 5s ago ConditionDirectoryNotEmpty=/var/crash was not met Feb 06 16:42:11 mother.pipebreaker.pl systemd[1]: Started Harvest vmcores for ABRT. Tutaj: uruchomi się, jeśli /var/crash nie jest puste

Slide 172

Slide 172 text

Unity nie gryzą dzielić na mniejsze – ładowanie modułów? /etc/modules-load.d/ – tworzenie katalogów, plików? tmpfles.d – różne czynności? ExecStartPre= lub inne unity – wspólne restarty? PartOf= Condition*= Twoimi przyjaciółmi Co do condition, to możemy w ten sposób zastąpić konstrukcję if … then … else z skryptów. Tworzymy dwa unity, robiące obydwie rzeczy. Te dwa unity mają sprzeczne Condition. Usługa faktyczna wymaga obu. Wykonuje się tylko ten, którego Condition działa.

Slide 173

Slide 173 text

Type=notify pełna informacja rozszerzony status proste type (simple, forking) nie zawsze wystarczają Debian – readiness protocol proposal Pełna informacja: READY=1; nie trzeba zakładać, że po forku usługa już działa

Slide 174

Slide 174 text

Type=notify pełna informacja rozszerzony status – sd_notify("STATUS=Robię dwójkę") proste type (simple, forking) nie zawsze wystarczają Debian – readiness protocol proposal Pełna informacja: READY=1; nie trzeba zakładać, że po forku usługa już działa rozszerzony status: proste wywołanie

Slide 175

Slide 175 text

Type=notify pełna informacja rozszerzony status – sd_notify("STATUS=Robię dwójkę") – systemd-notify --status="Przetwarzam plik 42 z 69." proste type (simple, forking) nie zawsze wystarczają Debian – readiness protocol proposal Pełna informacja: READY=1; nie trzeba zakładać, że po forku usługa już działa rozszerzony status: proste wywołanie W shellu też: np.. długi cronjob (również widziany w systemctl status) może informować o postępie

Slide 176

Slide 176 text

rozszerzony status httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since czw 2014-02-13 11:10:46 CET; 4 days ago Process: 27130 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Status: "Total requests: 3432; Current requests/sec: 4; Current traffic: 2423 B/sec" CGroup: /system.slice/httpd.service ├─ 6368 /usr/sbin/httpd -DFOREGROUND ├─ 8408 /usr/sbin/httpd -DFOREGROUND

Slide 177

Slide 177 text

rozszerzony status httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since czw 2014-02-13 11:10:46 CET; 4 days ago Process: 27130 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Status: "Total requests: 3432; Current requests/sec: 4; Current traffic: 2423 B/sec" CGroup: /system.slice/httpd.service ├─ 6368 /usr/sbin/httpd -DFOREGROUND ├─ 8408 /usr/sbin/httpd -DFOREGROUND transmission-daemon.service - Transmission BitTorrent Daemon Loaded: loaded (/usr/lib/systemd/system/transmission-daemon.service; enabled) Drop-In: /etc/systemd/system/transmission-daemon.service.d └─10-user-zdzichu.conf, 20-io-sched-idle.conf, 30-exec-noauth.conf, 40-restart.conf Active: active (running) since Sat 2014-01-18 12:22:28 CET; 4 weeks 2 days ago Status: "Uploading 0.00 KBps, Downloading 0.02 KBps." CGroup: /system.slice/transmission-daemon.service └─9096 /usr/bin/transmission-daemon -f --log-error -T

Slide 178

Slide 178 text

rozszerzony status - python #!/usr/bin/python # # logs temperature from OWFS into postgres database import glob import os import psycopg2 import systemd.daemon import time sleep_seconds = 60 systemd.daemon.notify("STATUS=Opening DB connection...") dbconn = psycopg2.connect("dbname=temperature_log") dbconn.autocommit=True cur = dbconn.cursor() cur.execute("PREPARE put_temperature AS INSERT INTO temperatures (datetime, sensor_id, value) VALUES (NOW(), (SELECT id FROM sensors WHERE SN=$1), $2);") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") while True: for SN in glob.glob("/run/owfs/??.????????????"): systemd.daemon.notify("STATUS=Reading sensors...") temperature = open("%s/temperature" % SN).readline() # we won't be needing full path anymore, trim it SN = os.path.basename(SN) try: cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) except psycopg2.IntegrityError: print "New sensor %s! Adding to database, please correct description." % SN cur.execute("INSERT INTO sensors (SN) VALUES (%s)", (SN,)) cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) time.sleep(sleep_seconds) systemd.daemon.notify("STATUS=Cleaning up") dbconn.close() systemd.daemon.notify("READY=0")

Slide 179

Slide 179 text

rozszerzony status - python #!/usr/bin/python # # logs temperature from OWFS into postgres database import glob import os import psycopg2 import systemd.daemon import time sleep_seconds = 60 systemd.daemon.notify("STATUS=Opening DB connection...") dbconn = psycopg2.connect("dbname=temperature_log") dbconn.autocommit=True cur = dbconn.cursor() cur.execute("PREPARE put_temperature AS INSERT INTO temperatures (datetime, sensor_id, value) VALUES (NOW(), (SELECT id FROM sensors WHERE SN=$1), $2);") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") while True: for SN in glob.glob("/run/owfs/??.????????????"): systemd.daemon.notify("STATUS=Reading sensors...") temperature = open("%s/temperature" % SN).readline() # we won't be needing full path anymore, trim it SN = os.path.basename(SN) try: cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) except psycopg2.IntegrityError: print "New sensor %s! Adding to database, please correct description." % SN cur.execute("INSERT INTO sensors (SN) VALUES (%s)", (SN,)) cur.execute("EXECUTE put_temperature (%s, %s);", (SN, temperature) ) systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) time.sleep(sleep_seconds) systemd.daemon.notify("STATUS=Cleaning up") dbconn.close() systemd.daemon.notify("READY=0")

Slide 180

Slide 180 text

rozszerzony status - python import systemd.daemon systemd.daemon.notify("STATUS=Opening DB connection...") systemd.daemon.notify("READY=1") systemd.daemon.notify("STATUS=Entering main loop") systemd.daemon.notify("STATUS=Reading sensors...") systemd.daemon.notify("STATUS=Sleeping until %s" % time.ctime(time.time() + sleep_seconds)) systemd.daemon.notify("STATUS=Cleaning up") systemd.daemon.notify("READY=0") Linijka z sleeping until bardzo pomocna

Slide 181

Slide 181 text

rozszerzony status - python % systemctl --user status logtemp logtemp.service - database logging of temperature from OWFS Loaded: loaded (/home/zdzichu/dev/logtemp/logtemp.service; enabled) Active: active (running) since Thu 2014-02-06 16:56:23 CET; 1 weeks 3 days ago Main PID: 11078 (logtemp.py) Status: "Sleeping until Mon Feb 17 13:35:51 2014" CGroup: /user.slice/user-1001.slice/[email protected]/logtemp.service └─11078 /usr/bin/python /home/zdzichu/dev/logtemp/logtemp.py Feb 06 16:56:22 mother.pipebreaker.pl systemd[1251]: Stopping database logging of temperature from OWFS... Feb 06 16:56:22 mother.pipebreaker.pl systemd[1251]: Starting database logging of temperature from OWFS... Feb 06 16:56:23 mother.pipebreaker.pl systemd[1251]: Started database logging of temperature from OWFS. Jest to wartościowe, gdyż długie zadania z crona

Slide 182

Slide 182 text

Type=notify dokładnie określa gotowość usługi rozszerza informację o statusie wymaga minimalnego łatanie Łatki na tyle minimalne, że często upstream przyjmuje. W przypadku braku systemd funkcje kończa się bez błędu.

Slide 183

Slide 183 text

systemctl enable debug-shell debug-shell.service - Early root shell on /dev/tty9 FOR DEBUGGING ONLY Loaded: loaded (/usr/lib/systemd/system/debug-shell.service; disabled) Active: inactive (dead) Docs: man:sushell(8) Pomocne również (kernel command line): ● systemd.confrm_spawn=1 ● systemd.unit= ● rescue, emergency Małe przydatne rzeczy

Slide 184

Slide 184 text

journalctl logi od samego startu (również initramfs) journalctl /dev/sda journalctl -u postfx journalctl --since=yesterday O journalu można kolejną prezentację zrobić zresztą jest, link na końcu

Slide 185

Slide 185 text

urlz for lulz ● systemctl help ● http://www.freedesktop.org/software/systemd/man/systemd.directives.html ● T-DOSE 2012, Open Source Lennart Poettering, The Systemd Journal http://www.youtube.com/watch?v=o1lUeQVYuNs ● CoreOS fleet – distributed init system http://www.youtube.com/watch?v=u91DnN-yaJ8 ● http://pkgs.fedoraproject.org/cgit/ Przed napisanie unita najlepiej sprawdzić, czy już ktoś tego nie zrobił – np.. w Fedorze Po napisaniu: wysłać do programistów; man 7 daemon ^^ pełen opis instalacji unitów

Slide 186

Slide 186 text

systemd – ściągawka Dziękuje!