В этой статье рассмотрим команды 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-by\x2duuid-6e6e3d02\x2d78ba\x2d4d8a\x2dbe29\x2db43599a92359.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.

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


Сводка
Команды SystemD
Имя статьи
Команды SystemD
Описание
В этой статье рассмотрим команды SystemD, а именно systemctl, timedatectl, localectl, journalctl и некоторые другие

3 Replies to “Команды SystemD”

  1. Добрый день, читаю подготовленный вами материал, большое спасибо!
    Возможно, ошибка в приведенном примере:
    sudo hostnamectl set-hostname —pretty «debian 11 :-)»
    произошла из за того, что надо было написать:
    sudo hostnamectl set-hostname «debian 11 :-)» —pretty

    1. Да нет, тут любая команда выполненная с sudo привела бы к такой ошибке. Дело в том что мы изменили имя компьютера на deb-11, а в конфиге (/etc/hosts) осталось старое имя. Вот его вручную нужно было поменять.

  2. Здравствуйте! Не подскажите, как выполнить команду rm в unit’е systemd? Нужно перед запуском определённого unit’а, выполнить очистку некоторого каталога, в который пишет этот unit. Сделал так, создал каталог unit.service.d в /etc/systemd/system/, в этом каталоге файл unit.conf с содержимым:
    [Service]
    ExecStartPre=/usr/bin/sh -c ‘rm -r /path/to/folder/*’
    Но при выполнении, возникает ошибка «sh[3559277]: rm: невозможно удалить ‘/path/to/folder/some_file’: Отказано в доступе».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *