Вопрос или проблема
Рассматривая last reboot | head -3
, я получаю следующий результат:
reboot system boot 5.7.10-201.fc32. Fri Jul 31 11:29 still running
reboot system boot 5.7.10-201.fc32. Fri Jul 31 11:22 - 09:29 (-1:53)
reboot system boot 5.7.10-201.fc32. Tue Jul 28 23:14 - 09:21 (2+10:07)
Сначала я подумал, что время и даты показаны как “запуск – завершение работы”, но это не имеет смысла, учитывая вторую строку, где показывается отрицательная разница во времени.
procinfo
возвращает корректное время запуска:
$ procinfo | grep Bootup
Bootup: Fri Jul 31 09:29:39 2020 Load average: 0.01 0.06 0.06 1/1071 28719
Аппаратные часы показывают правильное время:
$ date; sudo hwclock --show
Fri 31 Jul 2020 11:55:17 AM CEST
2020-07-31 11:55:17.436472+02:00
Проблема, похоже, заключается в last reboot
и who -b
:
$ date; uptime; who -b
Fri 31 Jul 2020 11:55:43 AM CEST
11:55:43 up 2:26, 2 users, load average: 0.00, 0.04, 0.05
system boot 2020-07-31 11:29
/var/run/utmp
, читаемый по умолчанию who -b
, не существует в моей системе, и /var/log/wtmp
, читаемый last reboot
, имеет следующие разрешения:
$ ll /var/log/wtmp
-rw-rw-r--. 1 root utmp 39K Jul 31 11:23 /var/log/wtmp
Что может быть причиной этих расхождений?
ИЗМЕНЕНИЕ
Корректное время завершения — 09:29 UTC+2. Времена 11:29 и 11:22 из last reboot
должны быть 09:29 и 09:22 соответственно. Как заметил @telcoM, можно подумать, что ранний запуск может использовать часовой пояс UTC, но тогда 11:29 должно быть 07:29…
Еще одна деталь: я использую простую физическую машину Fedora 32.
Ваш часовой пояс — CEST, поэтому ваше текущее смещение от UTC должно быть 2 часа в плюс.
Соответствовали бы временные метки, если предположить, что 09:21 на самом деле означает 11:21, а 09:29 — 11:29 соответственно?
Если да, то ваш ранний запуск может изначально использовать часовой пояс UTC, но исправлять его на CEST в какой-то момент после того, как будет определено время запуска.
Использует ли Fedora по-прежнему классический стиль RedHat /etc/sysconfig/clock
? Если это так, возможно, в нем есть установка, указывающая, используется ли аппаратные часы UTC или нет. Существует также другое место для той же информации: третья строка /etc/adjtime
будет указывать либо UTC
, либо LOCAL
для указания, какое время хранится в аппаратных часах. Если эти два положения не согласуются друг с другом, я видел такое поведение. Если вы обнаружили ошибку здесь, пересоберите ваш initramfs, чтобы исправление было включено в него.
Является ли ваш /etc/localtime
символической ссылкой на /usr/share/zoneinfo/your/timezone
или фактической копией этого файла? Это может иметь значение для генератора initramfs. Если генератор initramfs просто копирует символическую ссылку в initramfs без копирования фактического файла, симлинк будет поврежден на этапе загрузки initramfs, и система может по умолчанию использовать UTC до монтирования реальной корневой файловой системы.
(И если вы не нашли ошибку, но временная метка модификации /etc/localtime, /etc/adjtime или /etc/sysconfig/clock более свежая, чем у вашего initramfs, пересоберите initramfs в любом случае, так как кто-то мог забыть сделать это при изменении настроек часов/часового пояса.)
Кроме того, если это виртуальная машина или физическая машина на аппаратном обеспечении blade, возможен механизм синхронизации времени VM/blade с часами hypervisor/blade chassis при загрузке. Часто такой механизм будет поставлять местное время для удобства Windows-систем. Если вы используете синхронизацию NTP, система может загружаться с использованием местного времени как UTC или наоборот, но как только сетевые интерфейсы начнут работать, она может получить действительное UTC время от сервера NTP, снова вызывая скачок времени на 2 часа.
Это происходит, когда система настроена читать время RTC в местном часовом поясе. И как упомянул @telcoM, ранняя загрузка читает время RTC как UTC. Попробуйте команду timedatectl
, чтобы показать/изменить конфигурацию RTC.
.
Ответ или решение
Вопрос, поднятый о негативных временных разностях при использовании команды last reboot
, может вызывать значительное замешательство, особенно когда реальная временная шкала кажется нарушенной. Давайте разберём теоретические основы, приведём конкретные примеры и предложим практические решения этой проблемы.
Теория
Когда система записывает время последней перезагрузки или выключения, она полагается на несколько компонентов:
-
Часы реального времени (RTC) — физическое устройство, которое продолжает отсчет времени даже при выключенной машине. RTC может быть настроен для отображения местного времени или времени UTC.
-
Часовой пояс системы — настройка операционной системы, которая определяет, как локальное время преобразуется в время UTC и наоборот.
-
Логи системы — такие как
/var/log/wtmp
, которые записывают временные метки событий, включая перезагрузки и выключение.
Система может столкнуться с проблемами, когда часы RTC настроены на местное время, но в момент ранней загрузки прочитаны как время UTC. Это может привести к проблемам в логах, так как начальным временным меткам будет присвоено неправильное значение.
Пример
Рассмотрим пример посекундного вывода last reboot
и данных из команды procinfo
:
reboot system boot 5.7.10-201.fc32. Fri Jul 31 11:29 still running
reboot system boot 5.7.10-201.fc32. Fri Jul 31 11:22 - 09:29 (-1:53)
reboot system boot 5.7.10-201.fc32. Tue Jul 28 23:14 - 09:21 (2+10:07)
В этом примере одно из времени — 11:29
— воспринимается как противоречие, так как фактически должно быть 09:29
, если учитывать переход на местное время. Это может происходить из-за того, что система изначально использует для чтения время UTC в момент загрузки, а переключение на местное время происходит позже.
Применение
Чтобы устранить эту проблему, необходимо предпринять следующие шаги:
-
Используйте команду
timedatectl
для проверки текущих настроек времени, часовой зоны и RTC.$ timedatectl
Проверьте, что
RTC in local TZ
установлен вno
, что означает использование времени UTC на уровне железа. -
Настройте RTC на использование UTC. Это можно сделать через
timedatectl
:$ timedatectl set-local-rtc 0
Это позволит убедиться, что RTC сохраняет время в UTC, что уменьшает вероятность ошибок при обработке времени.
-
Проверьте символическую ссылку
/etc/localtime
. Убедитесь, что она указывает на правильное местоположение в/usr/share/zoneinfo
. Если это не так, создайте правильную ссылку:$ ln -sf /usr/share/zoneinfo/Your/Timezone /etc/localtime
-
Проверьте и синхронизируйте initramfs. После изменения временных настроек, соберите initramfs заново:
$ dracut -f
Это обеспечит, чтобы текущие временные настройки были включены в начальную файловую систему, используемую при загрузке.
-
Если ваша конфигурация учётного времени нарушена, проверьте
/etc/adjtime
. Важна третья строка файла, которая должна соответствоватьUTC
, если вы хотите хранить время RTC в UTC. -
Использование NTP-синхронизации может гарантировать точное время после старта сети. Убедитесь, что она настроена и активна.
-
На виртуальных машинах или компьютерах с продвинутым аппаратным обеспечением может быть механизм синхронизации времени с гипервизором или шасси лезвийного сервера, который потенциально может вводить более сложное управление временем.
Следуя этим шагам, вы сможете устранить несоответствия во временных разностях, возникающие при использовании last reboot
, и обеспечить согласованность временных меток в вашей системе.