Системное время
Системное время использует системные часы и используется в Unix системах для слежения за временем. Его можно установить с помощью аппаратных часов или с помощью внешнего сервера времени.
Предисловие
Программные или аппаратные часы
Системные часы, предоставляемые ядром, реализуются простым подсчетом числа секунд, прошедших с 1 января 1970 года 00:00:00 UTC по настоящее время. Это число называется Unix-время.
Аппаратные часы, также известные как часы реального времени (real-time clock или RTC), обычно представляют из себя элемент материнской платы — даже когда внешнее питание отключено.
UTC или местное время
Системное время всегда устанавливается как местное, определяемое временной зоной пользователя (с учётом перехода на летнее время и обратно).
Настройка времени аппаратных часов может быть осуществлена исходя из отображения локального времени или [[Wikipedia:ru:Всемирное координированное время |Всемирного координированного времени]] (UTC). Рекомендуется использовать UTC, так как оно не зависит от часового пояса и переходов на летнее время. Исключение может быть сделано при использовании систем с двойной загрузкой — когда другая операционная система не настроена для использования аппаратных часов c UTC, например, как в случае с Windows (это можно исправить — см. раздел Двойная загрузка с 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.
Смотрите также
- Network Time Protocol — is used to synchronize the system time with other devices over the network.
- Ntp — is a suite of tools utilizing Network Time Protocol. Their purpose is to keep the system clock in time.
- Chrony — a versatile implementation of the Network Time Protocol (NTP).
- OpenNTPD — a lightweight NTP server ported from OpenBSD.
Внешние ресурсы
- https://lifehacker.com/5742148/fix-windows-clock-issues-when-dual-booting-with-os-x — двойная загрузка с MS Windows, установка RealTimeIsUniversal. Также работает с Windows 10.
- http://tldp.org/HOWTO/Clock-2.html — The Clock Mini-HOWTO.
Ссылки
- ↑ chrony. сравнение NTP реализаций, chrony, March 1st, 2017. Retrieved on July 11th, 2017.
- ↑ OpenNTPD. OpenNTPD 5.9p1, OpenNTPD, March 29th, 2016. Retrieved on July 11th, 2017.