В этой статье рассмотрим команды SystemD, а именно systemctl, timedatectl, localectl, journalctl и некоторые другие.
Введение
В прошлых статьях по 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.
И разобрали на примерах их возможности.