Постоянные журналы systemd-journald не работают с bind mount /var/log

Другое решение безbc

1. Преобразование дат во время Unix (, также известное как время POSIX или время эпохи UNIX )

.
$ date1=$(date -d "Feb 12 10:02:10" +%s)
$ date2=$(date -d "Feb 12 10:53:15" +%s)

$ printf '%s\n' "$date1" "$date2"
1518447730
1518450795
$ 

2. Вычислите разницу между двумя датами

$ datediff="$((date2-date1))"

3. Вы получите ответ в секундах

$ echo "$datediff"
3065
$

4. Преобразование в формат часов, минут и секунд

$ printf '%02dh:%02dm:%02ds\n' $(($datediff/3600)) $(($datediff%3600/60)) $(($datediff%60))
00h:51m:05s

или

$ TZ=UTC date '+%H:%M:%S' -d"@$datediff"
00:51:05

Будьте готовы к тому, что результат может быть ≥86400 (, т. е. 24 часа ). и измените формат соответствующим образом.

5
21.06.2020, 16:42
2 ответа

Я уже давно борюсь с той же проблемой. У меня есть дистрибутив на основе Yocto -, в котором у меня есть rootfs -только для чтения, а папка /var/log смонтирована в другом разделе с использованием привязки volatile -. Как только я получил journald для входа в новый раздел, я заметил то же самое: journalctl --list-bootsбудет показывать только текущую загрузку, а не более старые. После множества проб и ошибок я в конце концов понял, почему.

Как вы заметили, /var/log/journalпоказывает 3 папки:

root@mir-edb-intel-gen1:~# ls -lrt /var/log/journal/
total 24
drwxr-sr-x+ 2 root systemd-journal 4096 Mar  5 09:24 7f7f3d516b554d718d688a0b0fa9648e
drwxr-sr-x+ 2 root systemd-journal 4096 Mar  5 09:25 93eb74229e9244a4b7f60c90acacc12f
drwxr-sr-x+ 2 root systemd-journal 4096 Mar  5 10:57 4a9652b4b33a4a099bdc6be8c6fb2b1a

И journalctl --list-bootsпоказывает только 1 запись:

 0 6cb4f9f236954f69937be217f36c1ce2 Fri 2021-03-05 10:57:48 UTC—Fri 2021-03-05 11:01:22 UTC

Однако, если вы запустите journalctl -D /var/log/journal --list-boots, все 3 бутса появятся как положено:

root@mir-edb-intel-gen1:~# journalctl -D /var/log/journal --list-boots
-2 9ab6d00dea9d41da9c76bf2a3f64895c Fri 2021-03-05 09:24:20 UTC—Fri 2021-03-05 09:25:03 UTC
-1 00509584245d44d599d88db8dccd4177 Fri 2021-03-05 09:25:37 UTC—Fri 2021-03-05 10:14:42 UTC
 0 6cb4f9f236954f69937be217f36c1ce2 Fri 2021-03-05 10:57:48 UTC—Fri 2021-03-05 11:01:22 UTC

Хотя я не очень разбираюсь в systemd, я считаю, что проблема связана с тем, что мы сбрасываем журнал с /run/log/journal на /var/log /journal каждый раз, когда мы загружаемся вместо того, чтобы писать больше в существующий журнал /var/log/journal . Затем, когда вы вызываете journalctl, он просматривает только самую новую папку, поэтому не может найти предыдущие загрузки, если вы специально не укажете ему просмотреть весь /var/log/journal .

Редактировать:@Jaap Joris Vens кажется, есть хорошее объяснение поведения в этом ответе

Редактировать 2:В нашем случае файл /etc/machine-idявляется пустым файлом, как описано в разделе poky/meta/classes/rootfs-postcommands.bbclass:

.
#
# A hook function to support read-only-rootfs IMAGE_FEATURES
#
read_only_rootfs_hook () {

    [...]

    if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}; then
    # Create machine-id
    # 20:12 < mezcalero> koen: you have three options: a) run systemd-machine-id-setup at install time, b) have / read-only and an empty file there (for stateless) and c) boot with / writable
        touch ${IMAGE_ROOTFS}${sysconfdir}/machine-id
    fi
}
0
18.03.2021, 23:29

Возможным обходным решением может быть символическая ссылка из /var/log/journal на другой раздел.

В моей системе Yocto rootfs только для чтения --я устанавливаю эту символическую ссылку в одной из моих системных служб, которая запускает приложение. Пока символическая ссылка не установлена, весь журнал помещается в ОЗУ, а затем сбрасывается в раздел с символической ссылкой.

mkdir -p /data/log/journal
systemd-tmpfiles --create --prefix /data/log/journal
ln -s /data/log/journal /var/log/journal
journalctl --flush
0
18.03.2021, 23:29

Теги

Похожие вопросы