Команды SystemD

В этой статье рассмотрим команды SystemD, а именно systemctl, timedatectl, localectljournalctl и некоторые другие.















Введение




В прошлых статьях по SystemD я рассказывал про юниты разных типов, а именно службы, таргеты и таймеры. А в этой пробегусь по утилитам, которые входят в систему SystemD, рассмотрим следующие команды:




  • systemctl — управляет юнитами, запускает их, останавливает, показывает конфигурацию и делает многое другое,
  • systemd-analyze — показывает необходимое для загрузки время,
  • timedatectl — управляет временем на компьютере,
  • hostnamectl — управляет именем компьютера,
  • localectl — управляет региональными настройками, 
  • loginctl — управляет сессиями и пользователями,
  • journalctl — позволяет просматривать системный жунрал.




Команда systemctl




Эту команду мы уже разбирали, а в этой статье просто напомню основные подкоманды:




  • systemctl status <имя службы> — посмотреть статус службы;
  • systemctl stop <имя службы> — остановить службу;
  • systemctl start <имя службы> — запустить службу;
  • systemctl restart <имя службы> — перезапустить службу;
  • systemctl reload <имя службы> — перечитать конфигурационный файл приложения;
  • systemctl cat <имя службы> — прочитать файл юнита;
  • systemctl daemon-reload — повторно инициализировать все юниты;
  • systemctl enable <имя службы> — добавить службу в автозагрузку;
  • systemctl disable <имя службы> — убрать службу из автозагрузки;
  • systemctl is-enabled <имя службы> — проверить, включена ли автозагрузка для службы;
  • systemctl list-units -t service — посмотреть все запущенные службы;
  • systemctl list-units -t service --all — посмотреть все службы;
  • systemctl get-default — узнать текущий загрузочный таргет по умолчанию;
  • systemctl set-default -f <Имя таргета> – установить загрузочный таргет, как таргет по умолчанию;
  • systemctl isolate <название таргета> – запустить другой загрузочный таргет.




Вообще эта команда делает намного больше. Если кому-то интересно, то вот ссылка на официальный мануал, на английском языке.




Команда systemd-analyze




В SystemD есть команда, которая показывает необходимое для загрузки время:




alex@deb:~$ systemd-analyze
Startup finished in 3.033s (kernel) + 15.281s (userspace) = 18.314s
graphical.target reached after 14.855s in userspace




Можем проверить время запуска отдельных служб:




alex@deb:~$ systemd-analyze blame
8.745s systemd-journal-flush.service
6.958s cloud-init-local.service
4.293s nginx.service
2.142s man-db.service
2.101s systemd-random-seed.service
1.687s cloud-init.service
1.599s logrotate.service
1.246s ifupdown-pre.service
1.052s dev-sda1.device
 697ms apparmor.service
 688ms apache2.service
 549ms cloud-config.service
 510ms ssh.service
 422ms cloud-final.service
 297ms keyboard-setup.service
 206ms rsyslog.service
 201ms systemd-udev-trigger.service
 199ms systemd-logind.service
 177ms e2scrub_reap.service
 161ms systemd-udevd.service
 157ms user@1000.service
 144ms systemd-journald.service
 137ms modprobe@drm.service
 111ms systemd-modules-load.service
 103ms systemd-sysusers.service
  91ms systemd-tmpfiles-setup-dev.service
  90ms dev-disk-byx2duuid-6e6e3d02x2d78bax2d4d8ax2dbe29x2db43599a92359.swap
  58ms e2scrub_all.service
  57ms modprobe@configfs.service
  56ms systemd-sysctl.service
  54ms systemd-timesyncd.service
  48ms systemd-tmpfiles-setup.service
  46ms networking.service
  44ms systemd-remount-fs.service
  41ms modprobe@fuse.service
  27ms dev-hugepages.mount
  26ms dev-mqueue.mount
  26ms console-setup.service
  26ms sys-kernel-debug.mount
  25ms sys-kernel-tracing.mount
  24ms kmod-static-nodes.service
  23ms systemd-user-sessions.service
  21ms systemd-update-utmp.service
   8ms user-runtime-dir@1000.service
   7ms systemd-update-utmp-runlevel.service
   2ms sys-kernel-config.mount
   2ms sys-fs-fuse-connections.mount




Здесь мы видим временные метки и последовательность запуска служб SystemD.




Команда timedatectl




Утилита timedatectl позволяет смотреть и изменять настройки системных часов. Вы можете использовать эту команду для:




  • изменения текущей даты,
  • изменения времени и часового пояса,
  • включения автоматической синхронизации системных часов с NTP-сервером.




Утилита показывает время в разных ракурсах:




  • Local time — локальное время в операционной системе;
  • Universal time — всемирное координированное время (UTC), стандарт по которому общество регулирует время;
  • RTC time — часы реального времени, представляют из себя элемент материнской платы.




Про настройку времени на сервере Linux я уже писал здесь, а в этой статье разбираемся именно с утилитой timedatectl.




В системах с SystemD есть механизм синхронизации времени, который называется systemd-timesyncd. Этот механизм является частью SystemD и не требует установки.




Давайте теперь посмотрим на реальные примеры работы команды timedatectl в системах с SystemD.




Посмотрим текущее время:




alex@deb:~$ timedatectl
               Local time: Ср 2022-08-31 12:16:11 MSK
           Universal time: Ср 2022-08-31 09:16:11 UTC
                 RTC time: Ср 2022-08-31 09:16:12
                Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no




Тут мы видим, что локальное время 12:16:11, UTC — 09:16:11, а аппаратное время — 09:16:12. Часовой пояс Europe/Moscow. Также видим:




  • System clock synchronized — синхронизация времени включена;
  • NTP service — служба NTP активна;
  • RTC in local TZ — аппаратные часы работают не в локальном часовом поясе.




Добавлять сервера синхронизации времени можно в конфигурационном файле /etc/systemd/timesyncd.conf, а редактировать этот файл может только root. Также после редактирования нужно перезагрузить службу:




alex@deb:~$ sudo nano /etc/systemd/timesyncd.conf
NTP=0.ru.pool.ntp.org 1.ru.pool.ntp.org 2.ru.pool.ntp.org 3.ru.pool.ntp.org
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

alex@deb:~$ sudo systemctl restart systemd-timesyncd




Тут мы указали:




  • NTP — пул серверов времени для синхронизации;
  • FallbackNTP — запасной пул серверов;
  • RootDistanceMaxSec — попытка связаться с основным пулом в течении этого количества секунд;
  • PollIntervalMinSec и PollIntervalMaxSec — если не получилось связаться с пулами серверов в течении RootDistanceMaxSec, то повторять попытки через этот интервал (указывается минимальный и максимальный интервал).




Также мы можем посмотреть все возможные часовые пояса:




alex@deb:~$ timedatectl list-timezones




И установить часовой пояс:




alex@deb:~$ sudo timedatectl set-timezone "Europe/Moscow"




Устанавливать дату и время вручную можно только если у вас не настроена синхронизация с ntp сервером. А включить или выключить синхронизацию времени можно так:




alex@deb:~$ sudo set-ntp on
alex@deb:~$ sudo set-ntp off




Установить время вручную:




alex@deb:~$ sudo timedatectl set-time 15:58:30




Установить дату вручную:




alex@deb:~$ sudo timedatectl set-time 2019-08-31




Сразу установить дату и время вручную:




alex@deb:~$ sudo timedatectl set-time '2019-08-31 16:14:50'




Команда hostnamectl




Команда hostnamectl используется для получения и изменения имени компьютера.




Этот инструмент различает три разных имени компьютера:




  • Pretty hostname (красивое имя) — может включать любые специальные символы;
  • Static hostname (статическое имя) — используется для инициализации компьютера в сети;
  • Временное имя, которое является запасным.




Если статическое имя установлено и отличное от localhost, то временное имя не используется. Статическое имя ограничено длиной 64 символа. Статическое имя хранится в /etc/hostname. Красивое имя хранится в /etc/machine-info.




alex@deb:~$ cat /etc/hostname
deb




В системах с SystemD посмотреть имя компьютера можно с помощью команды:




alex@deb:~$ hostnamectl
   Static hostname: deb
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 2460f8d05ba8477986268cde74d6ed47
           Boot ID: 3ef6c4dbd2664add92e38086b0c0379e
    Virtualization: kvm
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.10.0-15-amd64
      Architecture: x86-64




Статическое имя у нас deb, красивого имени нет. Также здесь видна информацию об операционной системе, и то что это виртуальная машина (kvm).




Поменять имя компьютеру может только пользователь root:




alex@deb:~$ sudo hostnamectl set-hostname --static deb-11

alex@deb:~$ hostnamectl
   Static hostname: deb-11
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 2460f8d05ba8477986268cde74d6ed47
           Boot ID: 3ef6c4dbd2664add92e38086b0c0379e
    Virtualization: kvm
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.10.0-15-amd64
      Architecture: x86-64




Установить красивое имя компьютера можно так:




alex@deb-11:~$ sudo hostnamectl set-hostname --pretty "debian 11 :-)"
sudo: unable to resolve host deb-11: Неизвестное имя или служба

alex@deb-11:~$ hostnamectl
   Static hostname: deb-11
   Pretty hostname: debian 11 :-)
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 2460f8d05ba8477986268cde74d6ed47
           Boot ID: 3ef6c4dbd2664add92e38086b0c0379e
    Virtualization: kvm
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.10.0-15-amd64
      Architecture: x86-64




В примере выше мы столкнулись с ошибкой: «sudo: unable to resolve host deb-11: Неизвестное имя или служба«. Чтобы избавится от неё, поправьте файл /etc/hosts, напротив адреса 127.0.1.1 нужно указать новое имя компьютера:




alex@deb-11:~$ sudo nano /etc/hosts
127.0.1.1 deb-11 deb-11




Кстати, если вы установите статическое имя с помощью показанной команды, то у вас удалится красивое имя:




alex@deb-11:~$ sudo hostnamectl set-hostname deb

alex@deb:~$ hostnamectl
   Static hostname: deb
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 2460f8d05ba8477986268cde74d6ed47
           Boot ID: 3ef6c4dbd2664add92e38086b0c0379e
    Virtualization: kvm
  Operating System: Debian GNU/Linux 11 (bullseye)
            Kernel: Linux 5.10.0-15-amd64
      Architecture: x86-64




Изменения сразу вступают в силу, ничего перезагружать не нужно, а чтобы приглашение команды изменилось нужно всего-лишь перезайти в систему. Единственное, конфиг /etc/hosts не изменяется, и в нём нужно изменить имя на новое вручную.




Команда localectl




Команда localectl используется для получения и изменения региональных настроек (локали) в системе.




Вообще про региональные настройки я уже писал здесь, а в этой статье разбираемся именно с утилитой localectl.




Посмотреть текущие настройки можно так:




alex@deb:~$ localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: n/a
      X11 Layout: us,ru
       X11 Model: pc105
     X11 Variant: ,
     X11 Options: grp:alt_shift_toggle,grp_led:scroll




System Locale — это системная локаль по умолчанию, сейчас это Английский язык в формате UTF-8.




Посмотреть список доступных для выбора (сгенерированных) локалей можно так:




alex@deb:~$ localectl list-locales
C.UTF-8
en_US.UTF-8
ru_RU.UTF-8




Сгенерировать новые локали этой утилитой нельзя.




Указать локаль по умолчанию можно так:




alex@deb:~$ sudo localectl set-locale LANG="ru_RU.UTF-8"

alex@deb:~$ localectl
   System Locale: LANG=ru_RU.UTF-8
       VC Keymap: n/a
      X11 Layout: us,ru
       X11 Model: pc105
     X11 Variant: ,
     X11 Options: grp:alt_shift_toggle,grp_led:scroll




Команда loginctl




Эта команда позволяет просматривать активные сеансы пользователей и завершать их.




Посмотреть список сессий можно так:




alex@deb:~$ loginctl list-sessions
SESSION  UID USER SEAT TTY
      1 1000 alex      pts/0

1 sessions listed.




Посмотреть список подключенных пользователей так:




alex@deb:~$ loginctl list-users
 UID USER
1000 alex

1 users listed.




Но пользователи переключившие себя на других пользователей с помощью команды su, не будут показаны. Например если пользователь подключился по ssh под alex, а затем используя su переключился на root, то здесь будет только первый логин alex.




Посмотреть статус сессии можно так (но вначале давайте переключимся на root пользователя, так вывод интереснее):




alex@deb:~$ su - root

root@deb:~# loginctl session-status
1 - alex (1000)
           Since: Tue 2022-08-30 12:27:59 MSK; 24h ago
          Leader: 648 (sshd)
             TTY: pts/0
          Remote: 172.28.80.14
         Service: sshd; type tty; class user
           State: active
            Unit: session-1.scope
                  ├─ 648 sshd: alex [priv]
                  ├─ 661 sshd: alex@pts/0
                  ├─1576 -bash
                  ├─1598 su - root
                  ├─1599 -bash
                  ├─1604 loginctl session-status
                  └─1605 less




Видим что хоть мы сейчас работаем под пользователем root, сессия у нас подготовлена для пользователя alex. Время входа в систему 2022-08-30 12:27:59, зашли в систему мы 24 часа назад. Тут же виден мой ip адрес с которого я зашел в систему. Видно что для входа я использовал ssh. Состояние сессии активное. После подключения под пользователем alex я начал работать в bash, выполнил команду su — root, последние две команды которые я выполнил это loginctl session-status которая использовала команду less для вывода результата на экран.




Увидеть информацию об активных сессиях можно выполнив команду без опций:




alex@deb:~$ loginctl
SESSION  UID USER SEAT TTY
      1 1000 alex      pts/0

1 sessions listed.




Убить или завершить сессию по имени пользователя (сможет только root):




alex@deb:~$ sudo loginctl kill-user <имя пользователя>
alex@deb:~$ sudo loginctl terminate-user <имя пользователя>




Убить или завершить сессию по номеру сессии (сможет только root):




alex@deb:~$ sudo loginctl kill-session <номер сессии>
alex@deb:~$ sudo terminate-session <номер сессии>




Команда journalctl




Команду journalctl можно использовать для просмотра содержимого журнала SystemD. Системный журнал хранит записи ядра, служб и приложений в бинарном виде.




Логирование настраивается в конфигурационном файле: /etc/systemd/journald.conf.




Рассмотрим некоторые параметры:




Storage:




  • volatile — хранить журнал только в памяти, используется /run/log/journal;
  • persistent — хранить журнал на диске, используется /var/log/journal;
  • auto — если существует файл /var/log/journal то хранится на диске, если нет то в памяти;
  • none — не хранить журнал.




Compress:




  • yes — сжимать логи;
  • no — не сжимать.




SplitMode  Определяет доступ к журналу пользователям:




  • uid — все пользователи имеют доступ;
  • login — каждый пользователь может читать только сообщения, относящиеся к его сеансу;
  • none — пользователи не имеют доступа;




SyncIntervalSec  время в секундах, после которого происходит запись журнала на диск;




RateLimitIntervalSec и RateLimitBurst  настройки ограничения скорости генерации сообщений для каждой службы. По умолчанию 10000 сообщений за 30 секунд;




SystemMaxUse — максимальный размер журналов на диске;




SystemKeepFree — объём свободного места, которое должно оставаться на диске после сохранения логов;




RuntimeMaxUse — максимальный объём, который логи могут занимать в файловой системе /run;




RuntimeKeepFree — объём свободного места, которое должно оставаться в файловой системе /run после сохранения логов;




Команда journalctl без параметров покажет все содержимое журнала. Дополнительными параметрами можно отфильтровать вывод. Рассмотрим некоторые способы фильтрации ниже.




Посмотреть логи с момента загрузки системы использующей SystemD можно с помощью следующей команды:




# journalctl -b 




Список предыдущих сессий (если журнал хранится на диске):




# journalctl --list-boots 




Журнал определенной сессии:




# journalctl -b <номер сессии>




Вывести журнал с определенной даты:




# journalctl --since "2019-08-16 09:35:00"




Журнал за вчера или сегодня:




# journalctl --since yesterday
# journalctl --since today




Журнал для определенного сервиса по имени сервиса:




# journalctl -u <имя сервиса>




Фильтруем журнал по номеру процесса:




# journalctl _PID=<номер процесса>




Фильтруем журнал по UID пользователя:




# journalctl _UID=<номер пользователя>




Сообщения ядра:




# journalctl -k




Сообщения об ошибках:




# journalctl -p err




Наблюдать за журналом в режиме реального времени:




# journalctl -f




Посмотреть сколько занимает журнал места на диске:




# journalctl --disk-usage









Итог




Мы познакомились с командами используемыми в системах с SystemD:




  • systemctl,
  • systemd-analyze,
  • timedatectl,
  • hostnamectl,
  • localectl
  • loginctl,
  • journalctl.




И разобрали на примерах их возможности.










2022-08-31T17:57:19
Администрирование Linux