Прошивки машин не сохраняются отслеживать, в каком часовом поясе они находятся, поэтому если вы хотите, чтобы они отслеживали абсолютное текущее время, вы должны выбрать какой-то стандарт, и на самом деле нет другого очевидного выбора для этого, кроме UTC. Если разные люди выберут разные стандарты, то либо микропрограмма машины должна будет предоставлять интерфейс, чтобы сообщить ОС, какая из них используется, либо обеспечить интерфейс для времени в «стандартном» часовом поясе - и мы вернемся к UTC.
Что еще хуже, многие часовые пояса в мире не имеют фиксированного смещения от UTC: у них есть два разных фиксированных смещения от UTC в зависимости от того, какое время года это. Прошивка машины должна знать эти правила и применять их. Для любого часового пояса, который вы могли бы захотеть использовать! И эти правила время от времени меняются! Если микропрограмма машины не отслеживает и не применяет эти правила, но вы все же хотите сохранить время микропрограммы в локальном часовом поясе (с переменным смещением), ОС должна компенсировать это путем применения взлома, но тогда невозможно надежно определить, или нет хак в настоящее время применяется. Это просто несостоятельно.
Итак ... UTC FTW. Прошивка машины низкого уровня. Есть ли у него какая-то причина знать местное время в том месте, где он работает?
Используйте мою программу Python 3 copy_journal.py для файлов журнала в /var/log/journal
, из которых вы хотите удалить записи.
Например, чтобы сделать копию system.journal
без записей журнала для NetworkManager.service
:
$ journalctl --file=system.journal | wc
167 1934 18825
$ journalctl --file=system.journal | grep -v NetworkManager | wc
77 881 8421
$ python3 copy_journal.py --remove-unit=NetworkManager.service system.journal system-without-nm.journal
$ journalctl --file=system-without-nm.journal | wc
77 881 8421
Я искал способ удалить конкретное сообщение из журнала systemd. Это не казалось необычным сценарием (, например. случайное выполнение неправильной команды или наличие большого количества спама ).
Представляется невозможным отредактировать определенные записи, изменив существующий файл, потому что формат журнала systemd в первую очередь предназначен для поддержки добавления, которое включает в себя необязательное сжатие, хеширование, обновление счетчиков, индексирование ссылок на смещения. и хеши. Я попробовал это сначала, но никому не рекомендовал бы делать это.
Я обнаружил, что для удаления определенных записей лучше всего создать новый файл журнала на основе существующего файла журнала (, например. скрипт Python из другой ответ делает это ). Systemd фактически поставляет необходимые инструменты для простого изменения записей журнала , используя этот принцип.
По сути, экспортировать журнал в текстовый формат, а затем преобразовать его обратно в журнал:
journalctl --file=system.journal -o export | /lib/systemd/systemd-journal-remote --output=result.journal
Этот механизм можно легко расширить, направив первоначальный вывод в программу/скрипт (, например awk, sed и т. д. )для выполнения автоматической фильтрации перед его передачей в systemd-journal-remote
.
Более ручной подход заключается в записи текста в файл, изменении файла вручную с помощью текстового редактора и последующем преобразовании его обратно в .journal
файл. Это объясняется более подробно ниже.
Вот более длинная версия,пошаговое -за -пошаговое руководство по изменению существующего журнала (, протестированного в ArchLinux, с использованием Ubuntu live USB, systemd 246 ).
Во-первых, убедитесь, что журнал закрыт. Например, выключив компьютер.
Загрузите другое устройство (через загрузочный live USB, например ). Это делается для того, чтобы можно было вносить изменения, не оказывая непреднамеренного влияния на журнал.
Чтобы свести к минимуму случайные побочные эффекты, монтируйте исходный диск только для чтения -. Например:
$ sudo mount -o ro /dev/sda1 /mnt
другой пример, если вы используете LUKS для шифрования устройства:
$ sudo cryptsetup luksOpen /dev/sda1 whateverName
$ sudo mount -o ro /dev/mapper/whateverName /mnt
Если на вашем текущем устройстве нет systemd / journalctl, используйте chroot, чтобы иметь возможность использовать двоичные файлы с вашего -диска только для чтения. Минимум, чтобы заставить это работать, выглядит следующим образом:
$ sudo mount --bind /tmp /mnt/tmp
$ sudo mount --bind /tmp /mnt/var/tmp
$ sudo mount -t proc /proc /mnt/proc
$ sudo chroot /mnt
Когда будете готовы, экспортируйте журнал.
$ journalctl --file=system.journal -o export > /tmp/export.txt
Отредактируйте экспорт, чтобы отредактировать, добавить, изменить или удалить записи. Вы можете сделать это вне chroot, если хотите, например. с vi -b /tmp/export.txt
.
Пример вывода:https://www.freedesktop.org/wiki/Software/systemd/export/
После внесения необходимых изменений преобразуйте его обратно в журнал с помощью systemd-journal-remote
. Этого бинарника нет в bin/$PATH
, поэтому нужно использовать абсолютный путь к местоположению программы:
$ /lib/systemd/systemd-journal-remote --output=/tmp/result.journal /tmp/export.txt
Убедитесь, что в журнале есть нужный вывод, например. листая журнал с помощью:
$ journalctl --file=/tmp/result.journal
Если вы удовлетворены, переходите к следующему шагу. В противном случае повторите с шага 6.
Выйдите из chroot(CtrlD или простоexit
)и при необходимости отмените шаг 4:
$ sudo umount /mnt/proc
$ sudo umount /mnt/tmp
$ sudo umount /mnt/var/tmp
Теперь мы собираемся перезаписать исходный журнал.
Если вы смонтировали том как для чтения -, только (, шаг 3 ), перемонтируйте как доступный для записи.
$ sudo mount -o remount,rw /mnt
Чтобы избежать нежелательных изменений атрибутов файла или владельца, просто замените содержимое, а не копируйте файл.
# cat /tmp/result.journal > /mnt/var/log/journal/MACHINE_ID_HERE/system.journal
или, если вы не работаете в корневой оболочке, используйте sudo tee outfile >/dev/null
, например:
$ </tmp/result.journal sudo tee /mnt/var/log/journal/MACHINE_ID_HERE/system.journal >/dev/null
При необходимости размонтируйте диск (из шага 3/шага 10 ).
$ sudo umount /mnt
Если вы открыли зашифрованный том (на шаге 3 ), снова заблокируйте его:
$ sudo cryptsetup luksClose whateverName