Вопрос или проблема
Как настроить синхронизацию системных часов с RTC (аппаратные часы / BIOS). Я пишу скрипт, который использует системные часы для запуска системы по сигналу будильника.
Для этого единственным требованием является наличие правильных часов RTC. На моей тестовой системе (SLES 10 SP4) я использую NTP-сервер для управления системными часами. Но часы RTC всегда идут вперед.
Например, в данный момент системные часы показывают 14:00 26.05.2016
, а RTC показывает 16:00
. Я прочитал страницы руководства hwclock
, и там указано, что следующая команда
hwclock --systohc --localtime
синхронизирует часы RTC с системными часами, что и произошло.
Но после перезагрузки/выключения системы, когда она снова загружается, часы RTC снова неправильно настроены. Значит, есть что-то еще, что управляет RTC при перезагрузке системы.
Может кто-нибудь указать в нужном направлении? Заранее спасибо.
Вы можете использовать команду hwclock
для настройки аппаратных часов.
Из man страница hwclock
:
--set Установите аппаратные часы на время, заданное параметром --date.
Вы можете применить текущее системное время к аппаратным часам с помощью:
hwclock -w
или даже вручную с помощью:
hwclock --set --date "$(date)"
После того как вы добавили детали в ваш вопрос, мой ответ недостаточен, поэтому вот дополнительные подробности ниже.
Вы можете проверить часовой пояс с помощью команды timedatectl status
.
Список часовых поясов можно получить с помощью timedatectl list-timezones
.
Вы можете установить свой часовой пояс на UTC, например, с помощью timedatectl set-timezone UTC
.
Вы найдете больше деталей о настройках часового пояса здесь.
На системах, использующих systemd
, выполнение timedatectl
выдаст предупреждение, если ваши часы настроены не оптимально:
Warning: The system is configured to read the RTC time in the local time zone.
This mode can not be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
Это можно исправить с помощью:
timedatectl set-local-rtc 0
Это виртуальная машина или физическая система на аппаратуре blade?
Некоторые производители аппаратуры blade имеют опцию синхронизации аппаратных часов каждого blade с часами управляющего процессора корпуса blade. По крайней мере на (некоторых моделях) аппаратуры blade Fujitsu, эта опция синхронизации включена по умолчанию. Чтобы отключить ее, необходимо зайти в настройки BIOS blade.
Виртуальные машины обычно синхронизируют свои виртуальные аппаратные часы согласно часам физической хост-системы во время инициализации ВМ, так как виртуальная машина не может иметь реальных физических аппаратных часов. Если ваш провайдер хостинга в основном использует системы Windows, синхронизация могла быть настроена на использование местного времени вместо UTC.
И есть один нюанс, который может затронуть как физические, так и виртуальные системы, особенно если они работают на корпоративных дистрибутивах Linux:
До того как появился инструмент hwclock
и конвенция указывать настроенную на UTC или местное время RTC в /etc/adjtime
, существовало несколько методов, специфичных для дистрибутива, для сохранения этой настройки. Для обратной совместимости эти методы могут до сих пор существовать. И корпоративные дистрибутивы особенно заинтересованы в обратной совместимости.
Это может вызвать проблемы, когда настройки UTC/местного времени в /etc/adjtime
конфликтуют с соответствующей устаревшей настройкой в /etc/sysconfig/clock
, /etc/default/rcS
или подобном: initramfs дистрибутива может учитывать устаревший метод, в то время как команда hwclock
, выполняемая интерактивно администратором системы, следует /etc/adjtime
, если это не переопределено, и автоматически сохраняет новую настройку только в /etc/adjtime
, если используются параметры --utc
или --local
.
Чтобы исправить это:
- убедитесь, что
/etc/adjtime
и любые устаревшие настройки в/etc/sysconfig/clock
,/etc/default/rcS
или аналогичных согласованы в отношении того, работают ли аппаратные часы в UTC или местном времени, чтобы избежать различных интерпретаций - после этого обновите файл initramfs, чтобы ранние процессы загрузки использовали те же настройки, что и остальная система.
Если вы не сделаете этого, вы можете получить систему, чьи часы на каждом запуске будут сдвинуты ровно на величину текущего смещения UTC.
Если вам нужно минимизировать риск повторения этого сбоя, вы можете выяснить, поддерживает ли ваш дистрибутив установку устаревшей конфигурации UTC/местного времени в нейтральное состояние, чтобы /etc/adjtime
был единственным источником правды в этом вопросе. Поскольку скрипты запуска обычно получают доступ к аппаратным часам только через hwclock
, устаревшая конфигурация может фактически быть ненужной.
У меня была такая же проблема, и я решил ее с помощью указанной вами команды: hwclock --systohc --localtime
, просто добавив ее при запуске системы, используя crontab.
Для этого добавьте команду в файл (я использовал RTC adjust.sh)
После этого откройте терминал и запустите chmod 755
для вашего скрипта, как в этом примере:
chmod 755 /home/andavas/Scripts/RTC adjust.sh
Затем измените файл crontab для редактирования:
crontab -e
(Если вы никогда не выполняли этого, вам необходимо выбрать редактор для этой задачи. Я рекомендую nano
)
В конце файла вставьте путь к скрипту, предваряя его @reboot
:
Наконец, сохраните и перезагрузите систему.
Это зависит от того, как ваша система настроена. Обычно Unix ожидает, что RTC настроен на GMT/UTC, и система знает свое смещение/часовой пояс… Но это несовместимо со старыми системами Windows, которые ожидают, что RTC настроен на местное время, и это вызывает проблемы в многозагрузочных системах. Поэтому в /etc/default/rcS есть настройка, чтобы указать, использует ли ваша система RTC в GMT или местном времени (вам, вероятно, нужно последнее, что не является настройкой по умолчанию):
# предполагать, что часы BIOS настроены на UTC время (рекомендуется)
UTC=yes
.
Ответ или решение
Теория
Аппаратные часы реального времени (RTC) и системные часы играют важную роль в поддержании точности времени на любом компьютерном устройстве. RTC — это микросхема, встроенная в материнскую плату компьютера, которая обеспечивает хранение времени и даты даже при выключенном питании. Системные часы, в свою очередь, используются операционной системой и основными приложениями. Синхронизация между этими двумя компонентами критически важна для корректной работы программного обеспечения и выполнения задач, зависящих от времени, таких как планирование задач и сетевые соединения.
Существуют важные аспекты, которые следует учитывать при работе с RTC и системными часами, такие как время UTC и локальное время. Операционные системы на базе Unix и Linux традиционно используют UTC для хранения аппаратного часового времени, что уменьшает количество проблем с переводом времени, особенно в условиях летнего времени. Windows, напротив, обычно использует локальное время.
Пример
Давайте рассмотрим ситуацию с вашим тестовым окружением на SLES 10 SP4. Ваша задача — синхронизировать системные часы с аппаратными, так как после перезагрузки они расходятся. Это распространенная проблема, которая часто связана с неправильными настройками временного пояса или некорректными установками со стороны BIOS/прошивки.
Вы используете утилиту hwclock
для синхронизации аппаратных часов с системными с помощью команды:
hwclock --systohc --localtime
Эта команда должна синхронизировать ваши аппаратные часы с системными на основе локального времени. Однако после перезагрузки проблема повторяется. Таким образом, проблема может быть в том, что настройки времени и временного пояса либо неверно сохранены, либо не учитываются при загрузке.
Применение
Давайте разберем шаги, которые можно предпринять для решения этой проблемы:
-
Проверка и настройка временного пояса: Убедитесь, что временной пояс на вашей системе установлен правильно и соответствует требуемому. Вы можете использовать
timedatectl
для проверки и изменения временного пояса:timedatectl status timedatectl list-timezones timedatectl set-timezone Europe/Moscow
-
Синхронизация аппаратных часов через UTC: Если ваша система должна использовать UTC для аппаратных часов, измените соответствующие настройки:
hwclock --systohc --utc timedatectl set-local-rtc 0
Эти команды помогут настроить вашу систему так, чтобы она использовала время UTC для аппаратных часов, что часто рекомендуется и устраняет проблемы с переходами на летнее время.
-
Обновление конфигурации загрузки: Если ваша система использует initramfs для начальных установок, убедитесь, что он тоже обновлен, чтобы учитывать изменения:
update-initramfs -u
Это гарантирует, что правильные конфигурации будут применены при загрузке.
-
Автоматизация процедуры синхронизации: Добавьте скрипт для синхронизации аппаратных часов в автозагрузку. Это можно сделать через crontab, добавив команду в файл crontab:
crontab -e
Затем добавьте строку:
@reboot /path/to/your/script.sh
Убедитесь, что скрипт выполняется с правами суперпользователя, либо добавив в начале
sudo
, либо настроив соответствующие разрешения. -
Проверка прошлых конфликтов конфигурации: Также стоит проверить на наличие конфликта установок времени. Если файл
/etc/adjtime
и другие файлы конфигурации, такие как/etc/sysconfig/clock
, используют различные установки времени, это может вызвать путаницу. Убедитесь, что они согласованы.
Эти шаги помогут вам синхронизировать аппаратные и системные часы должным образом и уменьшить вероятность их рассогласованности после перезагрузки. Настройка правильного времени важна как для поддержания безопасности системы, так и для обеспечения корректной работы всех приложений.