Zarządzanie usługami: systemctl

Zarządzanie usługami w systemie CentOS 7 odbywa się w ramach systemd.

  1. systemd oferuje szerokie możliwości zarządzania zasobami systemu operacyjnego, w tym usługami. Przeanalizuj wyniki poniższych komend:

    # systemctl
    # systemctl list-unit-files
    # systemctl list-units ssh*|dbus*
    
    # systemctl list-units --type=target|socket|service|device
    # systemctl list-units --type=socket lvm*
    
    # systemctl [--after|before] list-dependencies sshd
    # systemctl status /dev/vda
    # systemctl status /tmp
    
  2. W celu zapoznania się z koncepcją poziomów pracy oferowaną przez systemd wykonaj następujące polecenia:

    # systemctl get-default
    # ls -la /etc/systemd/system
    
    # systemctl set-default rescue.target; reboot
    # systemctl set-default multi-user.target; reboot
    
    # systemctl default|rescue
    # runlevel
    # systemctl isolate rescue.target
    # runlevel
    # systemctl isolate multi-user
    # runlevel
    
    # systemctl is-system-running
    
    # poweroff [--force]
    # systemctl start poweroff.target
    
  3. Czym różni się poziom pracy rescue od emergency?

  4. Czym różni się zastosowanie komendy systemctl reboot od systemctl kexec? Ile czasu trwa restart systemu przy zastosowaniu każdej z komend?

    Poniższe komendy ilustrują sposób określania wersji jądra, która ma być użyta przy zastosowaniu drugiej z komend:

    # uname -a
    # kexec -l /boot/vmlinuz-3.10.0-1160.88.1.el7.x86_64 \
         --initrd=/boot/initramfs-3.10.0-1160.88.1.el7.x86_64.img  \
         --reuse-cmdline
    
    # systemctl kexec
    

    Po ponownym zalogowaniu się do systemu sprawdź z jakiego jądra korzysta teraz system.

    Do czego służy komenda grub2-set-default?

  5. Wykonaj poniższe komendy, żeby zapoznać się z zarządzaniem demonami na przykładzie sshd (można to zrobić także na maszynach wirtualnych, gdyż sesja logowania pozostaje nietknięta).

    # systemctl status sshd
    # systemctl stop sshd
    # systemctl start sshd
    
    # systemctl is-enabled sshd
    # systemctl disable sshd
    # systemctl enable sshd
    
  6. Przeanalizuj zawartość pliku konfigurującego usługi sshd i utwórz usługę sshd, która będzie używała portu 2222.

    # cd /etc/systemd/system
    # systemctl --full edit sshd
    # mv sshd.service sshd2222.service
    # systemctl daemon-reload
    # systemctl start sshd2222
    # systemctl status sshd2222
    # ss -nltp
    
    # ssh -p 2222 192.158.142.i
    

    Sprawdź, że można zmienić domyślny port, na którym nasłuchuje demon sshd, albo poprzez modyfikację samego pliku definiującego usługę, albo pliku /etc/sysconfig/sshd2222 pozwalającego na modyfikację opcji demona.

  7. Przeanalizuj sposób zarządzania usługami na przykładzie vmstat.service. Ten plik, który znajduje się w repozytorium /git/tm-scripts, należy umieścić w katalogu /etc/systemd/system, a następnie wykonać komendy

    # systemctl daemon-reload
    # systemctl cat vmstat
    # systemctl status vmstat
    
  8. Uruchom usługę vmstat i obserwuj komunikaty pojawiające się w dziennikach zdarzeń:

    # journalctl [-x] [-fr] -u vmstat
    # tail -f /var/log/messages
    

    Co się dzieje, jeśli wykonać komendę pkill vmstat? Jak usługa się zachowuje, jeśli zmodyfikować jej definicję poprzez zakomentowanie wiersza Restart=always?

    W czasie wykonywania tego zadania warto dodatkowo uruchomić skrypt make-io.sh.

  9. Zapoznaj się z możliwościami analizy dzienników zdarzeń, jakie daje komenda journactl:

    # journalctl -u sshd
    # journalctl [-x] -b [-fr] -u sshd
    # journalctl -p err -u sshd
    # journalctl -a --since=2019-04-12 -u sshd
    # journalctl -a --until=2019-04-12 -u sshd
    # journalctl --since=yesterday
    # journalctl --since=2019-01-15 --until="2019-02-16 23:59:59"
    # journalctl -u sshd --since=00:00 --until=9:30
    # journalctl /dev/vda
    # journalctl -u /tmp
    # journalctl -o verbose -n -u sshd
    # journalctl _UID=1000
    # journalctl _COMM=sshd
    # journalctl _COMM=sudo
    # journalctl _HOSTNAME=polon _COMM=sshd
    
  10. W jakim zakresie zwykły użytkownik (np. labul) może korzystać z komendy journalctl? Dodaj użytkownika labul do grupy uniksowej adm (usermod -a -G adm labul) i sprawdź jego uprawnienia.

  11. Zainstaluj pakiet stress i zapoznaj się z konfiguracją usługi dla tego programu, którą można pobrać (do katalogu /etc/systemd/system) ze strony http://jkob.fizyka.umk.pl/labul/scripts/stress-cpu.service. Uruchom tę usługę, sprawdź jej status i przekonaj się, czy ustawione ograniczenia na zużycie CPU są respektowane przez planistę.

    # systemctl status stress
    # top
    

    Wartość parametru CPUQuota może zostać zmieniona w czasie działania usługi:

    # systemctl --runtime set-property stress CPUQuota=10%
    # systemctl status stress
    
  12. Wykonaj analogiczne ćwiczenia dla usługi stress-memory (http://jkob.fizyka.umk.pl/labul/scripts/stress-memory.service).

    # systemctl start stress-memory
    # systemctl status stress-memory
    # systemctl status stress-memory
    # ...
    

    Ogranicz wielkość dostępnej pamięci dla usługi stress-memory:

    # systemctl --runtime set-property vmstat.service MemoryLimit=100M
    # systemctl restart stress-memory
    # systemctl status stress-memory
    # systemctl status stress-memory
    # ...
    
  13. Przeanalizuj wyniki działania komend systemd-analyze blame oraz systemd-analyze time.

  14. Zwykli użytkownicy mogą także korzystać z dobrodziejstw demona systemd (zob. https://www.emacswiki.org/emacs/EmacsAsDaemon). Np. komenda systemctl enable --user emacs uruchamia zdemonizowaną wersję edytora emacs, pod warunkiem, że w katalogu ~/.config/systemd/user utworzony zostanie plik emacs.service z następującą zawartością:

    [Unit]
    Description=Emacs text editor
    Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/emacs --daemon --load=~/.emacs
    ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
    Environment="SSH_AUTH_SOCK=%t/keyring/ssh" "LANG=pl_PL.UTF-8" "LANGUAGE=pl_PL"
    Restart=on-failure
    
    [Install]
    WantedBy=default.target
    

    Komenda systemctl start --user emacs uruchamia tego demona, a komenda systemctl enable --user emacs powoduje, że demon będzie automatycznie uruchamiany po zalogowaniu się.