Команды SystemD
Введение
В прошлых статьях по SystemD я рассказывал про юниты разных типов, а именно службы , таргеты и таймеры . А в этой пробегусь по утилитам, которые входят в систему SystemD, рассмотрим следующие команды:
systemctl— управляет юнитами, запускает их, останавливает, показывает конфигурацию и делает многое другое,systemd-analyze— показывает необходимое для загрузки время,timedatectl— управляет временем на компьютере,hostnamectl— управляет именем компьютера,localectl— управляет региональными настройками,loginctl— управляет сессиями и пользователями,journalctl— позволяет просматривать системный жунрал.
Команда systemctl
Напомню основные подкоманды для systemctl:
systemctl status <имя службы>— посмотреть статус службы;systemctl stop <имя службы>— остановить службу;systemctl start <имя службы>— запустить службу;systemctl restart <имя службы>— перезапустить службу;systemctl reload <имя службы>— перечитать конфигурационный файл приложения;systemctl cat <имя службы>— прочитать файл юнита;systemctl daemon-reload— повторно инициализировать все юниты;ystemctl 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 есть команда, которая показывает необходимое для загрузки время:
$ systemd-analyze
Startup finished in 3.033s (kernel) + 15.281s (userspace) = 18.314s
graphical.target reached after 14.855s in userspace
Можем проверить время запуска отдельных служб:
$ 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.
Посмотрим текущее время:
$ 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. После редактирования нужно перезагрузить службу:
$ 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
$ sudo systemctl restart systemd-timesyncd
Мы указали:
- NTP — пул серверов времени для синхронизации;
- FallbackNTP — запасной пул серверов;
- RootDistanceMaxSec — попытка связаться с основным пулом в течении этого количества секунд;
- PollIntervalMinSec и PollIntervalMaxSec — если не получилось связаться с пулами серверов в течении RootDistanceMaxSec, то повторять попытки через этот интервал (указывается минимальный и максимальный интервал).
Также можем посмотреть все возможные часовые пояса:
$ timedatectl list-timezones
И установить часовой пояс:
$ sudo timedatectl set-timezone "Europe/Moscow"
Устанавливать дату и время вручную можно только если у вас не настроена синхронизация с ntp сервером. А включить или выключить синхронизацию времени можно так:
$ sudo set-ntp on
$ sudo set-ntp off
Установить время вручную:
$ sudo timedatectl set-time 15:58:30
Установить дату вручную:
$ sudo timedatectl set-time 2019-08-31
Сразу установить дату и время вручную:
$ sudo timedatectl set-time '2019-08-31 16:14:50'
Команда hostnamectl
Команда hostnamectl используется для получения и изменения имени компьютера.
Этот инструмент различает три разных имени компьютера:
- Pretty hostname (красивое имя) — может включать любые специальные символы;
- Static hostname (статическое имя) — используется для инициализации компьютера в сети;
- Временное имя, которое является запасным.
Если статическое имя установлено и отличное от localhost, то временное имя не используется. Статическое имя ограничено длиной 64 символа. Статическое имя хранится в /etc/hostname. Красивое имя хранится в /etc/machine-info.
$ cat /etc/hostname
deb
В системах с SystemD посмотреть имя компьютера можно с помощью команды:
$ 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).
Поменять имя компьютеру:
$ sudo hostnamectl set-hostname --static deb-11
$ 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
Установить красивое имя компьютера можно так:
$ sudo hostnamectl set-hostname --pretty "debian 11 :-)"
sudo: unable to resolve host 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 нужно указать новое имя компьютера:
$ sudo nano /etc/hosts
127.0.1.1 deb-11 deb-11
Кстати, если вы установите статическое имя с помощью показанной команды, то у вас удалится красивое имя:
$ sudo hostnamectl set-hostname 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.
Посмотреть текущие настройки можно так:
$ 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.
Посмотреть список доступных для выбора (сгенерированных) локалей можно так:
$ localectl list-locales
C.UTF-8
en_US.UTF-8
ru_RU.UTF-8
Сгенерировать новые локали этой утилитой нельзя.
Указать локаль по умолчанию можно так:
$ sudo localectl set-locale LANG="ru_RU.UTF-8"
$ 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
Эта команда позволяет просматривать активные сеансы пользователей и завершать их.
Посмотреть список сессий можно так:
$ loginctl list-sessions
SESSION UID USER SEAT TTY
1 1000 alex pts/0
1 sessions listed.
Посмотреть список подключенных пользователей так:
$ loginctl list-users
UID USER
1000 alex
1 users listed.
Но пользователи переключившие себя на других пользователей с помощью команды su, не будут показаны. Например если пользователь подключился по ssh под alex, а затем используя su переключился на root, то здесь будет только первый логин alex.
Посмотреть статус сессии можно так (но вначале давайте переключимся на root пользователя, так вывод интереснее):
$ su - root
# 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для вывода результата на экран.
Увидеть информацию об активных сессиях можно выполнив команду без опций:
$ loginctl
SESSION UID USER SEAT TTY
1 1000 alex pts/0
1 sessions listed.
Убить или завершить сессию по имени пользователя (сможет только root):
$ sudo loginctl kill-user <имя пользователя>
$ sudo loginctl terminate-user <имя пользователя>
Убить или завершить сессию по номеру сессии (сможет только root):
$ sudo loginctl kill-session <номер сессии>
$ 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
Если понравилась статья, подпишись на мой канал в VK или Telegram .