Системное время

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page System time and the translation is 100% complete.


Системное время использует системные часы и используется в Unix системах для слежения за временем. Его можно установить с помощью аппаратных часов или с помощью внешнего сервера времени.

Предисловие

Программные или аппаратные часы

Системные часы, предоставляемые ядром, реализуются простым подсчетом числа секунд, прошедших с 1 января 1970 года 00:00:00 UTC по настоящее время. Это число называется Unix-время.

Аппаратные часы, также известные как часы реального времени (real-time clock или RTC), обычно представляют из себя элемент материнской платы. Они работают все время, независимо от состояния операционной системы, даже когда компьютер выключен.

UTC или местное время

Настройка времени аппаратных часов может быть осуществлена исходя из двух стандартов: локальное время или время UTC. Локальное время — это реальное время часового пояса, учитывающее переход на DST. Предпочтительно использовать UTC, поскольку системное время вычисляется посредством прибавления к нему разницы времени часового пояса с учётом летнего времени. Благодаря этому перевод часов на летнее время учитывается автоматически, а изменение часового пояса возможно без изменения значения аппаратных часов. Исключение может быть сделано при использовании систем с двойной загрузкой, когда одна операционная система не поддерживает или не настроена для аппаратных часов с UTC (по умолчанию Windows настроена на использование локального времени).

Конфигурация

Часовой пояс

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

OpenRC

Смотрите часовой пояс (Руководство AMD64).

systemd

В systemd существует команда timedatectl для настройки часового пояса:

Проверка текущего часового пояса:

user $timedatectl

Вывод доступных часовых поясов:

user $timedatectl list-timezones

Чтобы изменить часовой пояс, пример для Германии:

root #timedatectl set-timezone Europe/Berlin

LC_TIME

Эта переменная окружения определяет форматирование даты и времени. Для более детальной информации смотрите The GNU C Library

Системные часы

Обычно время системных часов устанавливается аппаратными часами во время загрузки системы. Также системные часы возможно установить вручную либо с помощью сервера сетевого времени.

Для изменения системного времени можно воспользоваться командой date:

Вывод текущего времени программных часов:

user $date

Установка нового системного времени, например на 6 мая 2016 года в 12:34:

root #date 050612342016

Сервер времени

Смотрите статьи NTP или Chrony, чтобы получить информацию по использованию сервера времени.

systemd

systemd существует команда timedatectl для управления системным временем:

Вывод текущего времени программных часов:

user $timedatectl

Установка системного времени:

root #timedatectl set-time "2012-12-17 12:30:59"

Аппаратные часы

Чтобы получить доступ к аппаратным часам, нужно собрать ядро со следующими включенными параметрами:

ЯДРО Необходимые параметры ядра для аппаратных часов
    Device Drivers --->
      [*] Real Time Clock --->
            [ ]   Set system time from RTC on startup and resume
            [ ]   Set the RTC time based on NTP synchronization
            [*]   /sys/class/rtc/rtcN (sysfs)
            [*]   /proc/driver/rtc (procfs for rtc0)
            [*]   /dev/rtcN (character devices)
            <*>   PC-style 'CMOS'

Следующая команда выводит текущее на данный момент время аппаратных часов:

root #hwclock --show

Следующая команда устанавливает время аппаратных часов в соответствии с системным временем:

root #hwclock --systohc

Синхронизация аппаратных часов и системного времени

Обычно аппаратные часы используются при загрузке для установки системного времени. Это может быть осуществлено ядром самостоятельно, либо с помощью загрузочного сервиса init-скрипта при загрузке. Завершение работы ядра или сервиса также может вызвать сохранение времени системных часов в аппаратные часы. Благодаря этому у системы будет правильное время при следующей загрузке.

Синхронизация с помощью ядра

В свежих версиях (3.9 и выше) ядро Linux можно сконфигурировать таким образом, чтобы оно устанавливало системное время автоматически. Чтобы добиться этого, необходимо включить в ядре параметры Set system time from RTC on startup and resume (CONFIG_RTC_HCTOSYS) и Set the RTC time based on NTP synchronization (CONFIG_RTC_SYSTOHC):

ЯДРО Синхронизация системного времени с помощью ядра
    Device Drivers --->
      [*] Real Time Clock --->
            [*]   Set system time from RTC on startup and resume
            (rtc0)  RTC used to set the system time
            [*]   Set the RTC time based on NTP synchronization
            (rtc0)  RTC used to synchronize NTP adjustment
            [*]   /sys/class/rtc/rtcN (sysfs)
            [*]   /proc/driver/rtc (procfs for rtc0)
            [*]   /dev/rtcN (character devices)
            <*>   PC-style 'CMOS'

Параметр ядра Set the RTC time based on NTP synchronization на данный момент поддерживается chrony[1], NTP и OpenNTPD начиная с версии 5.9p1[2].

Чтобы убедиться, что время аппаратных часов обновилось, установите пакет net-misc/adjtimex и запустите следующую команду:

root #adjtimex --print | grep status

Бит 6 выведенного числа не должен быть установлен (0). Более подробная информация в man-странице hwclock (ищите '11 minute mode').

OpenRC

При использовании OpenRC для установки системного времени во время загрузки и синхронизации аппаратных часов во время завершения работы можно воспользоваться init-скриптом hwclock. Данная сервис включен по умолчанию и должен быть отключен при использовании вышеуказанного способа синхронизации ядром. Скрипт hwclock не следует запускать при использовании часов реального времени ядра.

root #rc-update delete hwclock boot
Заметка
Может так случится, что hwclock будет запущен как зависимость от другого rc-сервиса, например sysklogd. В этом случае rc-сервис osclock необходимо добавить на тот же уровень, что и зависимый сервис.

Однако, если необходимо синхронизировать время с помощью OpenRC, в файле /etc/conf.d/hwclock для <va>clock_hctosys и clock_systohc следует установить значение в YES. По умолчанию сервис настроена на стандарт UTC. Чтобы изменить это на использование стандарта местного времени (localtime) необходимо добавить clock="local".

ФАЙЛ /etc/conf.d/hwclockСинхронизация аппаратных часов
clock_hctosys="YES" 
clock_systohc="YES"
# clock="local"

Перезапустите сервис hwclock и добавьте его init-скрипт в уровень запуска boot:

root #rc-service hwclock restart
root #rc-update add hwclock boot

systemd

Для установки системного времени во время загрузки можно использовать systemd. Для управления аппаратными часами используйте команду timedatectl:

Вывод текущего времени аппаратных часов:

user $timedatectl | grep "RTC time"

Следующая команда устанавливает аппаратные часы в соответствии с системным временем (в стандарте времени UTC):

root #timedatectl set-local-rtc 0

Следующая команда устанавливает аппаратные часы в соответствии с системным временем в стандарте времени localtime (местное время):

root #timedatectl set-local-rtc 1

Устранение проблем

Двойная загрузка с Windows

Системы с возможностью загрузки другой операционной системы, например Windows, обычно будут испытывать проблемы с переназначением аппаратных часов. Чтобы сделать так, чтобы Windows не меняла аппаратные часы назад в локальное время, добавьте в реестр следующую запись.

В 64-битной версии Windows откройте regedit и перейдите в раздел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation. Создайте запись RealTimeIsUniversal с типом QWORD и установить её значение в 1. После этого перезагрузите систему. Теперь системные часы будут в формате UTC. Для 32-битной Windows замените тип с QWORD на DWORD.

Смотрите также

Внешние ресурсы

Ссылки

  1. chrony. сравнение NTP реализаций, chrony, March 1st, 2017. Retrieved on July 11th, 2017.
  2. OpenNTPD. OpenNTPD 5.9p1, OpenNTPD, March 29th, 2016. Retrieved on July 11th, 2017.