108.2 Урок 2
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Розділ: |
108 Основні системні служби |
Тема: |
108.2 Системне журналювання |
Урок: |
2 з 2 |
Вступ
Із загальним прийняттям systemd
усіма основними дистрибутивами, демон журналу (systemd-journald
) став стандартною службою журналювання. У цьому уроці ми обговоримо, як він працює та як ви можете використовувати його, щоб робити ряд речей: запитувати дані з нього, фільтрувати його інформацію за різними критеріями, налаштовувати його зберігання та розмір, видаляти старі дані, отримувати їх із системи відновлення або копії файлової системи та — останнє, але не менш важливе — зрозуміти його взаємодію з rsyslogd
.
Основи systemd
Вперше представлений у Fedora, systemd
поступово замінив SysV Init як de facto системний і сервісний менеджер у більшості основних дистрибутивах Linux. Серед його сильних сторін можна виділити наступне:
-
Простота конфігурації: unit-файли на відміну від сценаріїв ініціалізації SysV.
-
Універсальне керування: окрім демонов і процесів, він також керує пристроями, сокетами та точками монтування.
-
Зворотна сумісність із SysV Init і Upstart.
-
Паралельне завантаження під час завантаження ОС: служби завантажуються паралельно на відміну від того, як Sysv Init завантажує їх послідовно.
-
Він містить службу журналювання під назвою journal, яка має такі переваги:
-
Централізує всі журнали в одному місці.
-
Не потребує ротації журналів.
-
Журнали можна вимкнути, завантажити в оперативну пам’ять або зробити постійними.
-
Модулі та цілі
systemd
працює з модулями. Модулем є будь-який ресурс, яким може керувати systemd
(наприклад, мережа, bluetooth тощо). Модулі, у свою чергу, керуються файлами модулів. Це звичайні текстові файли, які містяться в /lib/systemd/system
і містять параметри конфігурації — у формі розділів і директив — для певного ресурсу, яким потрібно керувати. Існує декілька типів модулів: service
, mount
, automount
, swap
, timer
, device
, socket
, path
, timer
, snapshot
, slice
, scope
і target
. Таким чином, кожне ім’я файлу блоку відповідає шаблону <назва_ресурсу>.<тип_модуля>
(наприклад, reboot.service
).
Target — це особливий тип модулю, який нагадує класичні рівні запуску SysV Init. Це пояснюється тим, що target-модуль об’єднує різні ресурси для представлення певного стану системи (наприклад, graphical.target
подібний до runlevel 5
тощо). Щоб перевірити поточну ціль у вашій системі, скористайтеся командою systemctl get-default
:
carol@debian:~$ systemctl get-default graphical.target
З іншого боку, цілі та рівні виконання відрізняються тим, що перші взаємопов’язані, а другі – ні. Таким чином, ціль може викликати інші цілі, що неможливо з рівнями запуску.
Note
|
Пояснення того, як працюють модулі |
Системний журнал: systemd-journald
systemd-journald
— це системна служба, яка піклується про отримання журнальної інформації з різноманітних джерел: повідомлень ядра, простих і структурованих системних повідомлень, стандартного виведення та стандартних помилок служб, а також записів аудиту від підсистеми аудиту ядра (для додаткових відомостей дивіться man-сторінку для systemd-journald
). Його місія полягає у створенні та підтримці структурованого та індексованого журналу.
Його конфігураційний файл має назву /etc/systemd/journald.conf
і, як і з будь-якою іншою службою, ви можете використати команду systemctl
, щоб запустити його, перезапустити, зупинити або — просто — перевірити його статус :
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Sat 2019-10-12 13:43:06 CEST; 5min ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 178 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 4915) CGroup: /system.slice/systemd-journald.service └─178 /lib/systemd/systemd-journald (...)
Також можливі файли конфігурації типу journal.conf.d/*.conf
, які можуть включати конфігурації, що стосуються окремих пакунків (щоб дізнатися більше, зверніться до man-сторінки journald.conf
).
Якщо журнал ввімкнено, він може зберігатися або постійно на диску, або в непостійній формі у файловій системі на основі оперативної пам’яті. Журнал не є звичайним текстовим файлом, це двійковий файл. Таким чином, ви не можете використовувати інструменти аналізу тексту, такі як less
або more
, щоб прочитати його вміст; замість них використовується команда journalctl
.
Запит щодо вмісту журналу
journalctl
— це утиліта, яку ви використовуєте для запиту до журналу systemd
. Щоб відкрити його, ви повинні або бути адміністратором, або використовувати sudo
. Якщо надіслати запит без параметрів, він роздрукує весь журнал у хронологічному порядку (першими у списку будуть найстаріші записи):
root@debian:~# journalctl -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:19:46 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...) Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu (...)
Ви можете робити більш конкретні запити, використовуючи кілька перемикачів:
-r
-
Повідомлення журналу будуть надруковані у зворотному порядку:
root@debian:~# journalctl -r -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:30:30 CEST. -- Oct 12 14:30:30 debian sudo[1356]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:30:30 debian sudo[1356]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -r Oct 12 14:19:53 debian sudo[1348]: pam_unix(sudo:session): session closed for user root (...)
-f
-
Він друкуватиме останні повідомлення журналу та продовжуватиме друкувати нові записи, щойно вони будуть додані до журналу – подібно до
tail -f
:root@debian:~# journalctl -f -- Logs begin at Sat 2019-10-12 13:43:06 CEST. -- (...) Oct 12 14:44:42 debian sudo[1356]: pam_unix(sudo:session): session closed for user root Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) (...)
-e
-
Він перейде в кінець журналу, щоб останні записи було видно в межах сторінки:
root@debian:~# journalctl -e (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-n <value>, --lines=<value>
-
Він надрукує останні рядки в кількості value (якщо
<value>
не вказано, за замовчуванням воно дорівнює 10):root@debian:~# journalctl -n 5 (...) Oct 12 14:44:44 debian sudo[1375]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -f Oct 12 14:44:44 debian sudo[1375]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 14:45:57 debian sudo[1375]: pam_unix(sudo:session): session closed for user root Oct 12 14:48:39 debian sudo[1378]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/journalctl -e Oct 12 14:48:39 debian sudo[1378]: pam_unix(sudo:session): session opened for user root by carol(uid=0)
-k
,--dmesg
-
Еквівалент використання команди
dmesg
:root@debian:~# journalctl -k -- Logs begin at Sat 2019-10-12 13:43:06 CEST, end at Sat 2019-10-12 14:53:20 CEST. -- Oct 12 13:43:06 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18 Oct 12 13:43:06 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=b6be6117-5226-4a8a-bade-2db35ccf4cf4 ro qu Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' Oct 12 13:43:06 debian kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
Навігація та пошук у журналі
Ви можете переглядати вихідні дані журналу за допомогою:
-
PageUp, PageDown і клавіш зі стрілками для переміщення вгору, вниз, вліво і вправо.
-
>, щоб перейти до кінця виведення.
-
< для переходу на початок виведення.
Ви можете шукати рядки як вперед, так і назад від поточної позиції перегляду:
-
Пошук вперед: натисніть / і введіть рядок для пошуку, потім натисніть Enter.
-
Пошук у зворотному напрямку: натисніть ? і введіть рядок для пошуку, потім натисніть Enter.
Щоб переходити між збігами в пошуках, використовуйте N, щоб перейти до наступного збігу, і Shift+N, щоб перейти до попереднього.
Фільтрування даних журналу
Журнал дозволяє фільтрувати дані журналу за різними критеріями:
- Номер завантаження
-
--list-boots
-
У ньому перераховані всі доступні завантаження. Вихідні дані складаються з трьох колонок; перший визначає номер завантаження (
0
стосується поточного завантаження,-1
— попереднього,-2
передує попередньому і так далі); другий стовпець — ідентифікатор завантаження; третій показує мітки часу:root@debian:~# journalctl --list-boots 0 83df3e8653474ea5aed19b41cdb45b78 Sat 2019-10-12 18:55:41 CEST—Sat 2019-10-12 19:02:24 CEST
-b
,--boot
-
Він показує всі повідомлення від поточного завантаження. Щоб переглянути повідомлення журналу з попередніх завантажень, просто додайте параметр offset, як описано вище. Наприклад, щоб надрукувати повідомлення з попереднього завантаження, ви введете
journalctl -b -1
. Однак пам’ятайте, що для відновлення інформації з попередніх журналів необхідно ввімкнути постійність журналу (ви дізнаєтеся, як це зробити в наступному розділі):root@debian:~# journalctl -b -1 Specifying boot ID has no effect, no persistent journal was found
- Пріоритет
-
-p
-
Цікаво, що ви також можете фільтрувати за серйозністю/пріоритетом за допомогою параметра
-p
:root@debian:~# journalctl -b -0 -p err -- No entries --
Журнал повідомляє, що поки що не було жодних повідомлень із пріоритетом
error
(або вище) від поточного завантаження. Примітка:-b -0
можна опустити, коли йдеться про поточне завантаження.NoteЗверніться до попереднього уроку, щоб отримати повний список усіх рівнів серйозності
syslog
(так званих пріоритетів).
- Проміжок часу
-
Ви можете наказати
journalctl
друкувати лише повідомлення, зареєстровані протягом певного періоду часу, використовуючи перемикачі--since
і--until
. Специфікація дати має відповідати форматуYYYY-MM-DD HH:MM:SS
. Якщо опустити компонент часу, буде прийнято опівночі. Таким же чином, якщо дата опущена, передбачається поточний день. Наприклад, щоб переглянути повідомлення, зареєстровані з 19:00 до 19:01, ви введете:root@debian:~# journalctl --since "19:00:00" --until "19:01:00" -- Logs begin at Sat 2019-10-12 18:55:41 CEST, end at Sat 2019-10-12 20:10:50 CEST. -- Oct 12 19:00:14 debian systemd[1]: Started Run anacron jobs. Oct 12 19:00:14 debian anacron[1057]: Anacron 2.3 started on 2019-10-12 Oct 12 19:00:14 debian anacron[1057]: Normal exit (0 jobs run) Oct 12 19:00:14 debian systemd[1]: anacron.timer: Adding 2min 47.988096s random time.
Так само ви можете використати дещо іншу специфікацію часу:
"integer time-unit ago"
. Таким чином, щоб побачити повідомлення, зареєстровані дві хвилини тому, ви введетеsudo journalctl --since "2 minutes ago"
. Також можна використовувати+
і-
, щоб вказати час відносно поточного часу, тому--since "-2 minutes"
та--since "2 minutes ago"
є еквівалентними.Крім числових виразів, ви можете вказати кілька ключових слів:
yesterday
-
Станом на північ дня перед поточним днем.
today
-
Станом на північ поточного дня.
tomorrow
-
Станом на північ наступного дня після поточного дня.
now
-
Поточний час.
Давайте переглянемо всі повідомлення з опівночі до сьогодні о 21:00:
root@debian:~# journalctl --since "today" --until "21:00:00" -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:06:15 CEST. -- Oct 12 20:45:29 debian sudo[1416]: carol : TTY=pts/0 ; PWD=/home/carol ; USER=root ; COMMAND=/bin/systemctl r Oct 12 20:45:29 debian sudo[1416]: pam_unix(sudo:session): session opened for user root by carol(uid=0) Oct 12 20:45:29 debian systemd[1]: Stopped Flush Journal to Persistent Storage. (...)
NoteЩоб дізнатися більше про різні синтаксиси специфікацій часу, зверніться до man-сторінки
systemd.time
.
- Програма
-
Щоб переглянути повідомлення журналу, пов’язані з певним виконуваним файлом, використовується такий синтаксис:
journalctl /path/to/executable
:root@debian:~# journalctl /usr/sbin/sshd -- Logs begin at Sat 2019-10-12 20:45:29 CEST, end at Sat 2019-10-12 21:54:49 CEST. -- Oct 12 21:16:28 debian sshd[1569]: Accepted password for carol from 192.168.1.65 port 34050 ssh2 Oct 12 21:16:28 debian sshd[1569]: pam_unix(sshd:session): session opened for user carol by (uid=0) Oct 12 21:16:54 debian sshd[1590]: Accepted password for carol from 192.168.1.65 port 34052 ssh2 Oct 12 21:16:54 debian sshd[1590]: pam_unix(sshd:session): session opened for user carol by (uid=0)
- Модуль
-
Пам’ятайте, що модулем є будь-який ресурс, який обробляє
systemd
, і за ним ви також можете фільтрувати.-u
-
Він показує повідомлення про вказаний модуль:
root@debian:~# journalctl -u ssh.service -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 12:22:59 CEST. -- Oct 13 10:51:00 debian systemd[1]: Starting OpenBSD Secure Shell server... Oct 13 10:51:00 debian sshd[409]: Server listening on 0.0.0.0 port 22. Oct 13 10:51:00 debian sshd[409]: Server listening on :: port 22. (...)
NoteЩоб надрукувати всі завантажені та активні модулі, використовуйте
systemctl list-units
; щоб переглянути всі встановлені файли модулів, використовуйтеsystemctl list-unit-files
.
- Поля
-
Журнал також можна відфільтрувати за певними полями за допомогою будь-якого з наступних синтаксисів:
-
<field-name>=<value>
-
_<field-name>=<value>_
-
__<field-name>=<value>
PRIORITY=
-
Одне з восьми можливих значень пріоритету
syslog
у десятковому форматі:root@debian:~# journalctl PRIORITY=3 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:30:50 CEST. -- Oct 13 10:51:00 debian avahi-daemon[314]: chroot.c: open() failed: No such file or directory
Зверніть увагу, як ви могли б досягти таких самих вихідних даних, використовуючи команду
sudo journalctl -p err
, яку ми бачили вище. SYSLOG_FACILITY=
-
Будь-який із можливих кодів об’єкта, відформатований як десятковий рядок. Наприклад, щоб переглянути всі повідомлення на рівні користувача:
root@debian:~# journalctl SYSLOG_FACILITY=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:42:52 CEST. -- Oct 13 10:50:59 debian mtp-probe[227]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[227]: bus: 1, device: 2 was not an MTP device Oct 13 10:50:59 debian mtp-probe[238]: checking bus 1, device 2: "/sys/devices/pci0000:00/0000:00:06.0/usb1/1-1" Oct 13 10:50:59 debian mtp-probe[238]: bus: 1, device: 2 was not an MTP device
_PID=
-
Показати повідомлення, створені певним ідентифікатором процесу. Щоб побачити всі повідомлення, створені
systemd
, вам слід ввести:root@debian:~# journalctl _PID=1 -- Logs begin at Sun 2019-10-13 10:50:59 CEST, end at Sun 2019-10-13 14:50:15 CEST. -- Oct 13 10:50:59 debian systemd[1]: Mounted Debug File System. Oct 13 10:50:59 debian systemd[1]: Mounted POSIX Message Queue File System. Oct 13 10:50:59 debian systemd[1]: Mounted Huge Pages File System. Oct 13 10:50:59 debian systemd[1]: Started Remount Root and Kernel File Systems. Oct 13 10:50:59 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
_BOOT_ID
-
На основі ідентифікатора завантаження ви можете виділити повідомлення від певного завантаження, наприклад:
sudo journalctl _BOOT_ID=83df3e8653474ea5aed19b41cdb45b78
. _TRANSPORT
-
Показати повідомлення, отримані від певного транспорту. Можливі значення:
audit
(підсистема аудиту ядра),driver
(генерується внутрішньо),syslog
(сокет системного журналу),journal
(власний протокол журналу),stdout
(стандартний вихід служб або стандартна помилка) ,kernel
(кільцевий буфер ядра — те саме, щоdmesg
,journalctl -k
абоjournalctl --dmesg
):root@debian:~# journalctl _TRANSPORT=journal -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:46:36 CEST. -- Oct 13 20:19:58 debian systemd[1]: Started Create list of required static device nodes for the current kernel. Oct 13 20:19:58 debian systemd[1]: Starting Create Static Device Nodes in /dev... Oct 13 20:19:58 debian systemd[1]: Started Create Static Device Nodes in /dev. Oct 13 20:19:58 debian systemd[1]: Starting udev Kernel Device Manager... (...)
-
Об’єднання полів
Поля не є взаємовиключними, тому ви можете використовувати декілька в одному запиті. Однак відображатимуться лише повідомлення, що відповідають значенню обох полів одночасно:
root@debian:~# journalctl PRIORITY=3 SYSLOG_FACILITY=0 -- No entries -- root@debian:~# journalctl PRIORITY=4 SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:21:55 CEST. -- Oct 13 20:19:58 debian kernel: acpi PNP0A03:00: fail to add MMCONFIG information, can't access extended PCI configuration (...)
Якщо ви не використовуєте роздільник +
для поєднання двох виразів у спосіб логічного АБО:
root@debian:~# journalctl PRIORITY=3 + SYSLOG_FACILITY=0 -- Logs begin at Sun 2019-10-13 20:19:58 CEST, end at Sun 2019-10-13 20:24:02 CEST. -- Oct 13 20:19:58 debian kernel: Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (...9 Oct 13 20:19:58 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID= (...) (...)
З іншого боку, ви можете вказати два значення для одного поля, і всі записи, які відповідають будь-якому значенню, будуть показані:
root@debian:~# journalctl PRIORITY=1 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:30:14 CEST. -- -- No entries -- root@debian:~# journalctl PRIORITY=1 PRIORITY=3 -- Logs begin at Sun 2019-10-13 17:16:24 CEST, end at Sun 2019-10-13 17:32:12 CEST. -- Oct 13 17:16:27 debian connmand[459]: __connman_inet_get_pnp_nameservers: Cannot read /pro Oct 13 17:16:27 debian connmand[459]: The name net.connman.vpn was not provided by any .se
Note
|
Поля журналу належать до будь-якої з наступних категорій: “Поля журналу користувача”, “Надійні поля журналу”, “Поля журналу ядра”, “Поля від імені іншої програми” та “Поля адреси”. Для отримання додаткової інформації на цю тему, включаючи повний список полів, перегляньте man-сторінку для |
Ручні записи в системному журналі: systemd-cat
Подібно до того, як команда logger
використовується для надсилання повідомлень із командного рядка до системного журналу (як ми бачили в попередньому уроці), команда systemd-cat
виконує подібні, але більш складні задачі з системним журналом. Це дозволяє нам надсилати стандартний вхід (stdin), вихід (stdout) і помилку (stderr) до журналу.
Якщо команду викликати без параметрів, вона надішле все, що прочитає з stdin, до журналу. Після завершення натисніть Ctrl+C:.
carol@debian:~$ systemd-cat This line goes into the journal. ^C
Якщо їй передано результат попередньої команди, це також буде надіслано до журналу:
carol@debian:~$ echo "And so does this line." | systemd-cat
Якщо за нею слідує команда, результати цієї команди також будуть надіслані до журналу разом із stderr (якщо є):
carol@debian:~$ systemd-cat echo "And so does this line too."
Також існує можливість вказати рівень пріоритету за допомогою опції -p
:
carol@debian:~$ systemd-cat -p emerg echo "This is not a real emergency."
Зверніться до man-сторінки systemd-cat
, щоб дізнатися про інші параметри.
Щоб переглянути останні чотири рядки в журналі:
carol@debian:~$ journalctl -n 4 (...) -- Logs begin at Sun 2019-10-20 13:43:54 CEST. -- Nov 13 23:14:39 debian cat[1997]: This line goes into the journal. Nov 13 23:19:16 debian cat[2027]: And so does this line. Nov 13 23:23:21 debian echo[2030]: And so does this line too. Nov 13 23:26:48 debian echo[2034]: This is not a real emergency.
Note
|
Записи журналу з рівнем пріоритету emergency будуть надруковані жирним червоним шрифтом у більшості систем. |
Постійне зберігання журналу
Як згадувалося раніше, у вас є три варіанти щодо розташування журналу:
-
Ведення журналу можна взагалі вимкнути (проте все ще можливе переспрямування на інші об’єкти, такі як консоль).
-
Зберігайте його в пам’яті, що робить його непостійним, і позбавляйтеся від журналів під час кожного перезавантаження системи. У цьому випадку буде створено та використано каталог
/run/log/journal
. -
Зробіть його постійним, щоб вести журнал на диску. У цьому випадку повідомлення журналу потраплять до каталогу
/var/log/journal
.
Поведінка за замовчуванням така: якщо /var/log/journal/
не існує, журнали будуть збережені в непостійний спосіб у каталозі /run/log/journal/
і, отже втрачені з перезавантаженням. Ім’я каталогу — /etc/machine-id
— це шістнадцятковий 32-символьний рядок нижнього регістру, який закінчується символом переходу до нового рядка:
carol@debian:~$ ls /run/log/journal/8821e1fdf176445697223244d1dfbd73/ system.journal
Якщо ви спробуєте прочитати його за допомогою less, ви отримаєте попередження, тому замість згаданої команди використовуйте команду journalctl
:
root@debian:~# less /run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal "/run/log/journal/9a32ba45ce44423a97d6397918de1fa5/system.journal" may be a binary file. See it anyway? root@debian:~# journalctl -- Logs begin at Sat 2019-10-05 21:26:38 CEST, end at Sat 2019-10-05 21:31:27 CEST. -- (...) Oct 05 21:26:44 debian systemd-journald[1712]: Runtime journal (/run/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 4.9M, max 39.5M, 34.6M free. Oct 05 21:26:44 debian systemd[1]: Started Journal Service. (...)
Якщо /var/log/journal/
існує, журнали зберігатимуться там постійно. Якщо цей каталог буде видалено, systemd-journald
не створить його заново, а натомість запише до /run/log/journal
. Щойно ми знову створимо /var/log/journal/
і перезапустимо демон, постійне журналювання буде відновлено:
root@debian:~# mkdir /var/log/journal/ root@debian:~# systemctl restart systemd-journald root@debian:~# journalctl (...) Oct 05 21:33:49 debian systemd-journald[1712]: Received SIGTERM from PID 1 (systemd). Oct 05 21:33:49 debian systemd[1]: Stopped Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Journal Service... Oct 05 21:33:49 debian systemd-journald[1768]: Journal started Oct 05 21:33:49 debian systemd-journald[1768]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.1G, 1.1G free. Oct 05 21:33:49 debian systemd[1]: Started Journal Service. Oct 05 21:33:49 debian systemd[1]: Starting Flush Journal to Persistent Storage... (...)
Note
|
За замовчуванням для кожного користувача, який увійшов у систему, будуть окремі файли журналу, розташовані в |
Окрім того, спосіб роботи демона журналу зі збереженням журналів можна змінити після встановлення, налаштувавши його файл конфігурації: /etc/systemd/journald.conf
. Ключовою опцією є Storage=
і вона може мати такі значення:
Storage=volatile
-
Дані журналу зберігатимуться виключно в пам’яті у
/run/log/journal/
. Якщо його немає, цей каталог буде створено. Storage=persistent
-
За замовчуванням дані журналу зберігаються на диску — у папці
/var/log/journal/
— із резервним поверненням до пам’яті (/run/log/journal/
) під час початкових етапів завантаження та якщо диск недоступний для запису . За потреби буде створено обидва каталоги. Storage=auto
-
auto
подібний доpersistent
, але каталог/var/log/journal
не створюється за потреби. Це значення за умовчанням. Storage=none
-
Усі дані журналу буде видалено. Однак пересилання до інших цілей, таких як консоль, буфер журналу ядра або сокет системного журналу, все ще можливе.
Наприклад, щоб systemd-journald
створив /var/log/journal/
і переключився на постійне сховище, ви повинні відредагувати /etc/systemd/journald.conf
і встановити Storage=persistent
, зберегти файл і перезапустіть демон за допомогою sudo systemctl restart systemd-journald
. Щоб переконатися, що перезапуск пройшов бездоганно, ви завжди можете перевірити статус демона:
root@debian:~# systemctl status systemd-journald systemd-journald.service - Journal Service Loaded: loaded (/lib/systemd/system/systemd-journald.service; static; vendor preset: enabled) Active: active (running) since Wed 2019-10-09 10:03:40 CEST; 2s ago Docs: man:systemd-journald.service(8) man:journald.conf(5) Main PID: 1872 (systemd-journal) Status: "Processing requests..." Tasks: 1 (limit: 3558) Memory: 1.1M CGroup: /system.slice/systemd-journald.service └─1872 /lib/systemd/systemd-journald Oct 09 10:03:40 debian10 systemd-journald[1872]: Journal started Oct 09 10:03:40 debian10 systemd-journald[1872]: System journal (/var/log/journal/9a32ba45ce44423a97d6397918de1fa5) is 8.0M, max 1.2G, 1.2G free.
Note
|
Файли журналу в |
Видалення старих даних журналу. Розмір журналу
Журнали зберігаються у файлах журналу, імена файлів яких закінчуються на .journal
або .journal~
і знаходяться у відповідному каталозі (/run/log/journal
або /var/log/journal
, залежно від налаштувань). Щоб перевірити, скільки дискового простору зараз зайнято файлами журналу (як заархівованими, так і активними), використовуйте перемикач --disk-usage
:
root@debian:~# journalctl --disk-usage Archived and active journals take up 24.0M in the filesystem.
Журнали systemd
за замовчуванням можуть використовувати максимум 10% від розміру файлової системи, де вони зберігаються. Наприклад, у файловій системі 1 ГБ вони не займатимуть більше 100 МБ. Після досягнення цього ліміту старі журнали почнуть зникати, щоб зайнятий простір залишався наближеним до цього значення.
Однак обмеження розміру збережених файлів журналу можна контролювати, налаштувавши низку параметрів конфігурації в /etc/systemd/journald.conf
. Ці параметри поділяються на дві категорії залежно від типу файлової системи, яка використовується: постійні (/var/log/journal
) або в пам`яті (/run/log/journal
). У першому варіанті використовуються параметри, які починаються словом System
і застосовуватимуться, лише якщо постійне журналювання ввімкнено належним чином і після повного завантаження операційної системи. Назви параметрів для другої категорії починаються зі слова Runtime
і застосовуватимуться в таких сценаріях:
SystemMaxUse=
,RuntimeMaxUse=
-
Вони контролюють обсяг дискового простору, який може зайняти журнал. За замовчуванням він становить 10% від розміру файлової системи, але його можна змінити (наприклад,
SystemMaxUse=500M
), якщо значення не перевищує максимум 4 ГБ. SystemKeepFree=
,RuntimeKeepFree=
-
Вони контролюють обсяг дискового простору, який має залишатися вільним для інших користувачів. За замовчуванням він становить 15% від розміру файлової системи, але його можна змінити (наприклад,
SystemKeepFree=500M
), якщо значення не перевищує максимум 4 ГБ.Щодо пріоритету
*MaxUse
і*KeepFree
,systemd-journald
задовольнить обидва, використовуючи менше з двох значень. Так само майте на увазі, що видаляються лише архівні (на відміну від активних) файли журналу. SystemMaxFileSize=
,RuntimeMaxFileSize=
-
Вони контролюють максимальний розмір, до якого можуть зрости окремі файли журналу. Типовим значенням є 1/8 від
*MaxUse
. Зменшення розміру виконується синхронно, і значення можна вказувати в байтах або за допомогоюK
,M
,G
,T
,P
,E
для кілобайт, мегабайт, гігабайт, терабайт, петабайт і ексібайт відповідно. SystemMaxFiles=
,RuntimeMaxFiles=
-
Вони встановлюють максимальну кількість окремих і архівних файлів журналу для зберігання (на активні файли журналу не впливають). За замовчуванням 100.
Окрім видалення на основі розміру та ротації повідомлень журналу, systemd-journald
також дозволяє використовувати критерії на основі часу, використовуючи такі два параметри: MaxRetentionSec=
і MaxFileSec=
. Зверніться до man-сторінки journald.conf
для отримання додаткової інформації про ці та інші параметри.
Note
|
Кожного разу, коли ви змінюєте типову поведінку |
Очищення журналу
Ви можете вручну очистити архівні файли журналу в будь-який час за допомогою будь-якого з наступних трьох варіантів:
--vacuum-time=
-
This time-based option will eliminate all messages in journal files with a timestamp older than the specified timeframe. Values must be written with any of the following suffixes:
s
,m
,h
,days
(ord
),months
,weeks
(orw
) andyears
(ory
). For instance, to get rid of all messages in archived journal files that are older than 1 month:root@debian:~# journalctl --vacuum-time=1months Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/system@27dd08376f71405a91794e632ede97ed-0000000000000001-00059475764d46d6.journal (16.0M). Deleted archived journal /var/log/journal/7203088f20394d9c8b252b64a0171e08/user-1000@e7020d80d3af42f0bc31592b39647e9c-000000000000008e-00059479df9677c8.journal (8.0M).
--vacuum-size=
-
This size-based option will delete archived journal files until they occupy a value below the specified size. Values must be written with any of the following suffixes:
K
,M
,G
orT
. For instance, to eliminate archived journal files until they are below 100 Mebibytes:root@debian:~# journalctl --vacuum-size=100M Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
--vacuum-files=
-
This option will take care that no more archived journal files than the specified number remain. The value is an integer. For instance, to limit the number of archived journal files to 10:
root@debian:~# journalctl --vacuum-files=10 Vacuuming done, freed 0B of archived journals from /run/log/journal/9a32ba45ce44423a97d6397918de1fa5.
Під час очищення видаляються лише архівні файли журналу. Якщо ви хочете позбутися всього (включно з активними файлами журналу), вам потрібно використати сигнал (SIGUSR2
), який викликає негайну ротацію файлів журналу з опцією --rotate
. Інші важливі сигнали можна викликати за допомогою таких параметрів:
--flush
(SIGUSR1)
-
Він використовується для очищення файлів журналу з
/run/
до/var/
, щоб зробити журнал постійним. Для цього потрібно ввімкнути постійне журналювання та змонтувати/var/
. --sync
(SIGRTMIN+1
)-
Він використовується для запиту запису всіх незаписаних даних журналу на диск.
Note
|
Щоб перевірити внутрішню узгодженість файлу журналу, використовуйте |
Отримання даних журналу із системи відновлення
Як системний адміністратор ви можете опинитися в ситуації, коли вам знадобиться отримати доступ до файлів журналу на жорсткому диску несправної машини через систему відновлення (завантажувальний компакт-диск або USB-ключ, що містить живий дистрибутив Linux).
journalctl
шукає файли журналу в /var/log/journal/<machine-id>/
. Оскільки ідентифікатори машин у резервній та несправній системах відрізнятимуться, ви повинні використати такий параметр:
-D </path/to/dir>
,--directory=</path/to/dir>
-
За допомогою цього параметра ми вказуємо шлях до каталогу, де
journalctl
шукатиме файли журналу замість типових місць виконання та системних розташувань.
Таким чином, вам необхідно змонтувати rootfs
несправної системи (/dev/sda1
) у файловій резервній системі та продовжити читання файлів журналу таким чином:
root@debian:~# journalctl -D /media/carol/faulty.system/var/log/journal/ -- Logs begin at Sun 2019-10-20 12:30:45 CEST, end at Sun 2019-10-20 12:32:57 CEST. -- oct 20 12:30:45 suse-server kernel: Linux version 4.12.14-lp151.28.16-default (geeko@buildhost) (...) oct 20 12:30:45 suse-server kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.12.14-lp151.28.16-default root=UUID=7570f67f-4a08-448e-aa09-168769cb9289 splash=> oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' oct 20 12:30:45 suse-server kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' (...)
Інші параметри, які можуть бути корисними в цьому випадку:
-m
,--merge
-
Об’єднує записи з усіх доступних журналів у
/var/log/journal
, включаючи віддалені. --file
-
Покаже записи в певному файлі, наприклад:
journalctl --file /var/log/journal/64319965bda04dfa81d3bc4e7919814a/user-1000.journal
. --root
-
Шлях до каталогу, що означає, що кореневий каталог передається як аргумент.
journalctl
шукатиме там файли журналу (наприклад,journalctl --root /faulty.system/
).
Для отримання додаткової інформації перегляньте man-сторінку journalctl
.
Пересилання даних журналу до традиційного демона syslog
Дані журналу можна зробити доступними для традиційного демона syslog
:
-
Пересилання повідомлень до файлу сокета
/run/systemd/journal/syslog
для читанняsyslogd
. Цей засіб увімкнено за допомогою параметраForwardToSyslog=yes
. -
Наявність демона
syslog
, який поводиться якjournalctl
, тому читає повідомлення журналу безпосередньо з файлів журналу. У цьому випадку відповідним параметром єStorage
; він повинен мати значення, відмінне відnone
.
Note
|
Так само ви можете пересилати повідомлення журналу в інші місця призначення за допомогою таких параметрів: |
Вправи до посібника
-
Припускаючи, що ви
root
, заповніть таблицю відповідною командоюjournalctl
:Призначення Команда Друкувати записи ядра
Друкувати повідомлення з другого завантаження, починаючи з початку журналу
Друкувати повідомлення з другого завантаження, починаючи з кінця журналу
Друкувати останні повідомлення журналу та стежити за новими
Відтепер друкувати лише нові повідомлення та постійно оновлювати вивід
Друкувати повідомлення з попереднього завантаження з пріоритетом
warning
та у зворотному порядку -
Поведінка демона журналу щодо зберігання в основному контролюється значенням опції
Storage
у/etc/systemd/journald.conf
. У наведеній нижче таблиці вкажіть, яка поведінка пов’язана з яким значенням:Поведінка Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Дані журналу викидаються, але пересилання можливе.
Після завантаження системи дані журналу будуть збережені в папці
/var/log/journal
. Буде створено каталог, якщо його ще немає.Після завантаження системи дані журналу будуть збережені в папці
/var/log/journal
. Якщо його ще немає, каталог не буде створено.Дані журналу зберігатимуться в
/var/run/journal
, але не переживуть перезавантаження. -
Як ви дізналися, журнал можна очищати вручну в залежності від часу, розміру та кількості файлів. Виконайте наступні завдання за допомогою
journalctl
і відповідних параметрів:-
Перевірте, скільки місця на диску займають файли журналу:
-
Зменшить кількість місця, зарезервованого для архівних файлів журналу, і встановіть його на 200 МБ:
-
Ще раз перевірте простір на диску та поясніть результати:
-
Дослідницькі вправи
-
Які параметри слід змінити в
/etc/systemd/journald.conf
, щоб повідомлення пересилалися до/dev/tty5
? Які значення повинні мати параметри? -
Укажіть правильний фільтр
journalctl
, щоб надрукувати наступне:Призначення Фільтр + значення Друкувати повідомлення, що належать певному користувачеві
Друкувати повідомлення з хоста під назвою
debian
Друкувати повідомлення, що належать до певної групи
Друкувати повідомлення, що належать до
root
На основі шляху до виконуваного файлу вивести повідомлення
sudo
На основі назви команди вивести повідомлення
sudo
-
Під час фільтрації за пріоритетом журнали з вищим пріоритетом, ніж зазначено, також будуть включені до списку; наприклад,
journalctl -p err
виведе повідомлення error, critical, alert та emergency. Однак ви можете наказатиjournalctl
показувати лише певний діапазон. Яку команду ви використаєте, щобjournalctl
друкував лише повідомлення з рівнями пріоритету warning, error і critical? -
Рівні пріоритету також можна вказати у числовому представленні. Перепишіть команду з попередньої вправи, використовуючи числове представлення рівнів пріоритету:
Підсумки
В цьому уроці ми вивчили:
-
Переваги використання
systemd
як менеджера системи та послуг. -
Основи модулів і цілей
systemd
. -
Звідки
systemd-journald
отримує дані журналу. -
Параметри, які можна передати
systemctl
для керуванняsystemd-journald
:start
,status
,restart
іstop
. -
Де знаходиться файл конфігурації журналу
/etc/systemd/journald.conf
і його основні параметри. -
Як запитувати журнал у загальному варіанті і для конкретних даних за допомогою фільтрів.
-
Як здійснювати навігацію та пошук у журналі.
-
Як працювати зі зберіганням файлів журналу: у пам’яті чи на диску.
-
Як взагалі вимкнути ведення журналу.
-
Як перевірити дисковий простір, зайнятий журналом, застосувати обмеження на розмір збережених файлів журналу та очистити архівні файли журналу вручну (vacumming).
-
Як отримати дані журналу з резервної системи.
-
Як пересилати дані журналу до традиційного демона
syslog
.
Команди, які використовуються в цьому уроці:
systemctl
-
Керує системою та менеджером служб
systemd
. journalctl
-
Робить запит до журналу
systemd
. ls
-
Виводить вміст каталогу.
less
-
Переглядає вміст файлу.
mkdir
-
Створює каталоги.
Відповіді до вправ посібника
-
Припускаючи, що ви
root
, заповніть таблицю відповідною командоюjournalctl
:Призначення Команда Друкувати записи ядра
journalctl -k
абоjournalctl --dmesg
Друкувати повідомлення з другого завантаження, починаючи з початку журналу
journalctl -b 2
Друкувати повідомлення з другого завантаження, починаючи з кінця журналу
journalctl -b -2 -r
абоjournalctl -r -b -2
Друкувати останні повідомлення журналу та стежити за новими
journalctl -f
Відтепер друкувати лише нові повідомлення та постійно оновлювати вихід
journalctl --since "now" -f
Друкувати повідомлення з попереднього завантаження з пріоритетом
попередження
та у зворотному порядкуjournalctl -b -1 -p попередження -r
-
Поведінка демона журналу щодо зберігання в основному контролюється значенням опції
Storage
у/etc/systemd/journald.conf
. У наведеній нижче таблиці вкажіть, яка поведінка пов’язана з яким значенням:Поведінка Storage=auto
Storage=none
Storage=persistent
Storage=volatile
Дані журналу викидаються, але пересилання можливе
х
Після завантаження системи дані журналу будуть збережені в папці
/var/log/journal
. Буде створено каталог, якщо його ще немає.х
Після завантаження системи дані журналу будуть збережені в папці
/var/log/journal
. Якщо його ще немає, каталог не буде створено.х
Дані журналу зберігатимуться в
/var/run/journal
, але не переживуть перезавантаженняx
-
Як ви дізналися, журнал можна очищати вручну в залежності від часу, розміру та кількості файлів. Виконайте наступні завдання за допомогою
journalctl
і відповідних параметрів:-
Перевірте, скільки місця на диску займають файли журналу:
journalctl --disk-usage
-
Зменшить кількість місця, зарезервованого для архівних файлів журналу, і встановіть його на 200 МБ:
journalctl --vacuum-size=200M
-
Ще раз перевірте простір на диску та поясніть результати:
journalctl --disk-usage
Кореляції немає, оскільки
--disk-usage
показує простір, зайнятий як активними, так і архівними файлами журналу, тоді як--vacuum-size
стосується лише архівних файлів.
-
Відповіді до дослідницьких вправ
-
Які параметри слід змінити в
/etc/systemd/journald.conf
, щоб повідомлення пересилалися до/dev/tty5
? Які значення повинні мати параметри?ForwardToConsole=yes TTYPath=/dev/tty5
-
Укажіть правильний фільтр
journalctl
, щоб надрукувати наступне:Призначення Фільтр + значення Друкувати повідомлення, що належать певному користувачеві
_ID=<id-користувача>
Друкувати повідомлення з хоста під назвою
debian
_HOSTNAME=debian
Друкувати повідомлення, що належать до певної групи
_GID=<ідентифікатор групи>
Друкувати повідомлення, що належать до
root
_UID=0
На основі шляху до виконуваного файлу вивести повідомлення
sudo
_EXE=/usr/bin/sudo
На основі назви команди вивести повідомлення
sudo
_COMM=sudo
-
Під час фільтрації за пріоритетом журнали з вищим пріоритетом, ніж зазначено, також будуть включені до списку; наприклад,
journalctl -p err
виведе повідомлення error, critical, alert та emergency. Однак ви можете наказатиjournalctl
показувати лише певний діапазон. Яку команду ви використаєте, щобjournalctl
друкував лише повідомлення з рівнями пріоритету warning, error і critical?journalctl -p warning..crit
-
Рівні пріоритету також можна вказати у числовому представленні. Перепишіть команду з попередньої вправи, використовуючи числове представлення рівнів пріоритету:
journalctl -p 4..2