Прыжок системного времени сбивает таймеры и сертификаты
Резкий сдвиг системного времени влияет на всё, что от него зависит: календарные таймеры пересчитывают срабатывания, проверка сертификатов отказывает, журнал получает записи «из будущего». Особенно часто это бывает на виртуальных машинах после запуска из снимка.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Время было неверным при загрузке
До синхронизации машина живёт со временем, взятым из аппаратных часов или из снимка. Службы, запущенные в этот момент, видят неверное время.
-
Проверка сертификатов отказывает из-за времени
Сертификат «ещё не действителен» или «уже истёк» с точки зрения неверных часов. Ошибка выглядит как проблема с сертификатом, хотя дело во времени.
-
Календарные таймеры пересчитались
При сдвиге времени вперёд таймер может сработать сразу или пропустить период. Монотонные таймеры от этого не страдают.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Время, часовой пояс и состояние синхронизации.
timedatectl statusЗаписи о сдвиге времени.
journalctl -b --no-pager | grep -iE "time has been changed|system clock" | headКак пересчитались срабатывания таймеров.
systemctl list-timers --all --no-pager | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- До синхронизации машина живёт со временем, взятым из аппаратных часов или из снимка. Службы, запущенные в этот момент, видят неверное время.
- Как проверить
-
Посмотрите состояние синхронизации и время первых записей журнала.
timedatectl status journalctl -b --no-pager | head -5
- Как исправить
-
Добавьте службам, чувствительным ко времени, зависимость от готовности времени:
After=time-sync.targetвместе сWants=.
- Почему происходит
- Сертификат «ещё не действителен» или «уже истёк» с точки зрения неверных часов. Ошибка выглядит как проблема с сертификатом, хотя дело во времени.
- Как проверить
-
Сравните время машины и срок сертификата.
date echo | openssl s_client -connect узел:443 2>/dev/null | openssl x509 -noout -dates
- Как исправить
- Синхронизируйте время и перезапустите службу. Настройте службу синхронизации так, чтобы время было верным до запуска остальных.
- Почему происходит
- При сдвиге времени вперёд таймер может сработать сразу или пропустить период. Монотонные таймеры от этого не страдают.
- Как проверить
-
Посмотрите следующие срабатывания.
systemctl list-timers --all --no-pager | head
- Как исправить
-
Для задач, которым важен интервал, а не точное время, используйте монотонные таймеры (
OnUnitActiveSec=).
Пример вывода
Время сдвинулось после синхронизации. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd-timesyncd[600]: Initial clock synchronization to Mon 2026-09-15 21:12:41 MSK.
systemd[1]: Time has been changed
myapp[1200]: tls: failed to verify certificate: x509: certificate has expired or is not yet valid
Связанные ошибки
- Время не синхронизируется: chronyd или systemd-timesyncd Служба синхронизации времени работает, а время расходится: закрыт порт, конфликт двух служб, недоступны серверы.
- certificate verify failed в журнале службы Проверка сертификата не прошла: истёк срок, неполная цепочка, неверное имя, нет доверенных корневых сертификатов.
- Таймер активен, но не срабатывает Таймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- clocksource: Marking clocksource unstable Ядро переключило источник времени. Службы видят скачки времени, таймеры срабатывают не тогда, когда ожидалось.
- Сертификат продлён, а службы его не подхватили Продление прошло, клиенты видят старый сертификат: действие после продления не выполнилось.
- Служба синхронизации перевела часы скачком Время изменилось резко: расхождение было слишком велико для плавной подстройки. Последствия для таймеров и журнала.
- Таймер срабатывает позже указанного времени Задание запускается на минуту позже: по умолчанию таймеры группируются для экономии пробуждений.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
Источники
-
systemd.special(7)
Цель time-sync.target и порядок относительно синхронизации. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено запуском тестовой машины из снимка с устаревшими часами.