Кто автоматически устанавливает дату/время с аппаратных часов при загрузке?

Вопрос или проблема

Когда загружается Linux, текущее время должно быть извлечено из RTC-чипа и затем установлено в системные дату/время Linux. Я могу сделать это вручную, выполнив hwclock --hctosys. Но где именно это происходит автоматически при загрузке? Есть ли процесс, который обрабатывает это? Делает ли это ядро?

Метод 1: Ядро Linux загружает время из RTC-чипа

Можно установить CONFIG_RTC_HCTOSYS в конфигурации ядра, чтобы включить эту функцию. Когда она включена, ядро Linux позаботится о считывании сохраненного времени в rtc0 и установке его в системное время. С CONFIG_RTC_HCTOSYS_DEVICE="rtc0" устройство может быть изменено.

Для этой работы соответствующий драйвер RTC должен быть скомпилирован как встроенный модуль. Это можно определить следующим образом:

$ cat /boot/config-$(uname -r) | grep -i RTC_HCTOSYS

Метод 2: udev вызывает hwclock, как только создается /dev/rtcX

Пакет util-linux предоставляет файл правила udev в /usr/lib/udev/rules.d/85-hwclock.rules, который можно скопировать в /etc/udev/rules.d/ (как показано ниже). Демон udev тогда автоматически вызовет /usr/lib/udev/hwclock-set, как только будет создан /dev/rtc0. Вы можете изменить rtc0 в 85-hwclock.rules при необходимости.

$ sudo cp /usr/lib/udev/rules.d/85-hwclock.rules /etc/udev/rules.d/85-hwclock.rules

Примечание: Оба метода учитывают предупреждения в man hwclock против использования опции --hctosys с hwclock на работающей системе. Метод 2, вероятно, самый простой для большинства.

Ответ или решение

В процессе загрузки Linux необходимо инициализировать системное время, используя показания аппаратного часового чипа, известного как RTC (Real Time Clock). Вручную эту процедуру можно выполнить с помощью команды hwclock --hctosys. Однако в современной конфигурации операционная система автоматизирует этот процесс, обеспечивая корректное системное время без вмешательства пользователя. Вопрос о том, кто именно отвечает за автоматическую настройку даты и времени при загрузке, можно рассматривать через два подхода: использование конфигурации ядра и применение системы udev.

Теория: Как Linux решает задачу синхронизации времени

В системе Linux актуальное системное время должно устанавливаться на основании показаний RTC, который является аппаратным устройством, функционирующим даже при отключенном питании, что обеспечивает сохранение времени и даты. Наиболее распространены две стратегии для автоматизации этого процесса при загрузке: использование возможностей ядра Linux и механизмов udev – динамической системы управления устройствами в Unix-подобных операционных системах.

Метод 1: Настройка ядра Linux

Первый метод управления временной синхронизацией касается конфигурации ядра. Параметр CONFIG_RTC_HCTOSYS в конфигурации ядра активирует функциональность, при которой ядро само извлекает время из RTC и устанавливает его как системное время. Это позволяет получать актуальное системное время сразу после загрузки системы, до загрузки других служб и демонов.

Специфическая опция CONFIG_RTC_HCTOSYS_DEVICE="rtc0" позволяет указать, с какого устройства будет считано время. Это особенно важно для систем с несколькими RTC устрствами или в случае, если необходимо использовать определенное аппаратное обеспечение.

Для этого необходимо, чтобы соответствующий драйвер RTC был встроен в ядро в качестве модуля. Проверку того, включен ли данный параметр, можно выполнить с помощью команды:

$ cat /boot/config-$(uname -r) | grep -i RTC_HCTOSYS

Метод 2: Использование udev

Второй метод заключается в использовании системы udev, которая обеспечивает динамическое создание устройств и позволяет выполнять скрипты при подключении новых устройств. Пакет util-linux предоставляет правила для udev в файле /usr/lib/udev/rules.d/85-hwclock.rules. Этот скрипт вызывается автоматически, как только создается устройство /dev/rtc0.

Пользователь может скопировать этот файл правил в пользовательский каталог /etc/udev/rules.d/, чтобы изменить параметры и адаптировать их под свои нужды. Скрипт /usr/lib/udev/hwclock-set будет запущен автоматически, выполняя команду hwclock --hctosys, когда будет определено новое устройство RTC, обеспечивая таким образом корректное системное время.

Для получения эффекта от udev необходимо:

$ sudo cp /usr/lib/udev/rules.d/85-hwclock.rules /etc/udev/rules.d/85-hwclock.rules

Применение: Как выбрать правильный метод

Для внедрения автоматической инициализации системного времени при загрузке Linux, администратору системы необходимо выбрать один из вышеописанных методов. Каждый подход имеет свои преимущества и ограничения.

  1. Метод ядра: Этот подход более интегрирован с самой системой и сводит к минимуму вмешательство извне, так как все происходит на уровне ядра. Это решение более оптимально для систем, где стабильность и скорость загрузки имеют критическое значение.

  2. Метод udev: Этот метод может быть более гибким для пользователей, которым требуются доработки и настройка специфичной логики синхронизации времени. Он также более просто настраивается и позволяет явно управлять процессом через конфигурационные файлы udev.

Необходимо также учесть, что обе эти методики учитывают предостережения из описания команды man hwclock относительно использования опции --hctosys на уже запущенной системе.

В конечном итоге, выбор метода будет зависеть от специфики среды использования и предпочтений системного администратора. Это позволяет поддерживать точное системное время, что, в свою очередь, критично для синхронных процессов и правильной работы множества системных и сетевых приложений. Таким образом, эти механизмы, начиная от встроенной поддержки в ядре до flexuuser-friendly решения на основе udev, прекрасно решают задачу управления системным временем в Linux, что критично для поддержания надежной и стабильной работы как десктопных, так и серверных решений.

Оцените материал
Добавить комментарий

Капча загружается...