Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Настройка системного времени и его синхронизация в OC GNU/Linux : ARM / x86-x64

2021-07-22

Всі статті →


Одним из важнейших пунктов в работе любой ОС является системное время и OC GNU/Linux не исключение. Это особенно актуально для серверов, ведь на нем завязаны почти все службы.

На обычных материнских платах (стандарт: PC-совместимые) установлена микросхема BIOS в которой хранятся и настраиваются параметры касающиеся аппаратной части всей системы в целом, в том числе данные о времени и дате. В качестве автономного питания для микросхемы используется батарея. Таким образом, даже при полном отсутствии основного питания все параметры остаются неизменными. Изначально при загрузке OC считывает данные даты и времени именно из BIOS, а уже после загрузки синхронизируется с серверами (если данная опция настроена).

Ситуация с одноплатными компьютерами, как правило, иная. На них отсутствует микросхема BIOS и автономное питание для нее. Поэтому в OC GNU/Linux на одноплатных компьютерах зачастую (в базовой конфигурации) за корректные параметры времени отвечает fake-hwclock. Данная программа завершает свою работу позже всех служб при отключении/перезагрузке OC и запускается раньше всех служб при ее загрузке. Последнее зарегистрированное время записывается в файл и потом из него же считывается. При таком подходе OC имеет общее представление о времени и ни о какой большой точности речь идти не может. С другой стороны это гарантия что все изменения в системе не останутся в прошедшем или будущем времени.

Всю конфигурацию я буду производить на Orange Pi 3 и OC Armbian GNU/Linux 21.02.3 (Debian-Buster) с ядром Linux 5.4.65-sunxi64.

Примечание: Независимо от архитектуры, аппаратной платформы и версии ОС смысл всей конфигурации останется прежним.

Первоначально проверяем состояние fake-hwclock.

root@orangepi-3:~# systemctl list-units --type service | grep fake-hwclock

  • fake-hwclock.service loaded active exited Restore / save the current clock

Примечание: Приведена только нужная строка. Возможно что в ОС уже имеется какой-то сервис по синхронизации времени. Например, в OC GNU/Linux Debian 5.9.15-1-bpo10+1 aarch64 и в OC GNU/Linux на х86-х64 как правило (в базовой конфигурации) за синхронизацию времени отвечает systemd-timesyncd.service. В редких случаях возможен вариант и другого предустановленного сервиса. Поэтому, в только что установленной системе стоит проверить весь список systemctl > systemctl list-units --type service на наличие сервисов синхронизации времени. После чего решить какой сервис вы будете использовать.

Теперь проверяем текущее системное время. Данное действие можно выполнить с помощью одной из двух программ: timedatectl или date.

root@orangepi-3:~# timedatectl status

  • Local time: Mon 2021-06-21 07:21:55 UTC
  • Universal time: Mon 2021-06-21 07:21:55 UTC
  • RTC time: Mon 2021-06-21 07:21:55
  • Time zone: Etc/UTC (UTC, +0000)
  • System clock synchronized: no
  • NTP service: inactive
  • RTC in local TZ: no

или

root@orangepi-3:~# date +%B-%A-%F-%T-%p-%z

  • June-Monday-2021-06-21-07:22:01-AM-+0000

Проверка проводилась в 10:21:55 (21.06.2021) по киевскому времени. Мы видим что все три параметра времени (Local time, Universal time, RTC time) имеют одинаковое значение - 07:21:55. Единственный правильный параметр это дата.

Примечание: В строке System clock synchronized: вместо no может быть yes. Такое значение будет истинным если в системе уже имеется какой-то сервис по синхронизации времени. Если в реальности сервис отсутствует, то значение yes в данный момент рассматривается как no. Причину такого явления в данной статье я объяснять не стану, поскольку это относится уже к сборке пакетов и ОС в целом, а не к настройке синхронизации.

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

root@orangepi-3:~# timedatectl set-time "2021-06-21 10:25:00"

Повторно проверяем текущее системное время.

root@orangepi-3:~# timedatectl status

  • Local time: Mon 2021-06-21 10:25:03 UTC
  • Universal time: Mon 2021-06-21 10:25:03 UTC
  • RTC time: Mon 2021-06-21 10:25:03
  • Time zone: Etc/UTC (UTC, +0000)
  • System clock synchronized: no
  • NTP service: inactive
  • RTC in local TZ: no

или

root@orangepi-3:~# date +%B-%A-%F-%T-%p-%z

  • June-Monday-2021-06-21-10:25:03-AM-+0000

После того как время установлено корректно, приступим к инициализации часового пояса. В моем случае это Europe/Kiev. Что бы вывести полный список доступных часовых поясов используйте timedatectl list-timezones или воспользуйтесь сортировкой grep для вывода только конкретно нужного. Но прежде чем приступить к инициализации, следует обновить пакет tzdata.

root@orangepi-3:~# apt-get update

root@orangepi-3:~# apt-get upgrade tzdata

  • Reading package lists... Done
  • Building dependency tree
  • Reading state information... Done
  • tzdata is already the newest version (2021a-0+deb10u1).
  • Calculating upgrade... Done
  • The following packages will be upgraded:
  • armbian-bsp-cli-orangepi3 armbian-config armbian-firmware armbian-zsh base-files isc-dhcp-client klibc-utils libgcrypt20 libglib2.0-0 libgnutls30 libhogweed4 libklibc liblz4-1 libnettle6 libxml2 linux-libc-dev
  • 16 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
  • Need to get 14.5 MB of archives.
  • After this operation, 816 kB of additional disk space will be used.
  • Do you want to continue? [Y/n] n
  • Abort.

Примечание: после обновления пакета tzdata продолжать обновление остальных пакетов необязательно! Поэтому на вопрос Do you want to continue? [Y/n] нажмите n или y в зависимости от вашего выбора.

Проверяем версию установленного пакета.

root@orangepi-3:~# dpkg -s tzdata | grep Version:

  • Version: 2021a-0+deb10u1

Отсортировываем нужный часовой пояс из списка.

root@orangepi-3:~# timedatectl list-timezones | grep Kiev

  • Europe/Kiev

Указываем корректный часовой пояс.

root@orangepi-3:~# timedatectl set-timezone Europe/Kiev

Проверяем настройки часового пояса.

root@orangepi-3:~# timedatectl status

  • Local time: Mon 2021-06-21 10:31:27 EEST
  • Universal time: Mon 2021-06-21 07:31:27 UTC
  • RTC time: Mon 2021-06-21 07:31:27
  • Time zone: Europe/Kiev (EEST, +0300)
  • System clock synchronized: no
  • NTP service: inactive
  • RTC in local TZ: no

Теперь локальное время с датой Local time: Mon 2021-06-21 10:31:27 EEST и часовой пояс Time zone: Europe/Kiev (EEST, +0300) установлены корректно.

Основная настройка системного времени окончена, осталось только настроить службу синхронизации. В OC GNU/Linux есть два самых распространенных варианта решения данной задачи, по средствам systemd-timesyncd.service или ntp.service. Рассмотрим каждый из них по отдельности.

Вариант 1. - systemd-timesyncd.service

В основном на данный момент этот вариант для большинства OC GNU/Linux ARM имеет один неприятный нюанс.

Изначально данный пакет отсутствует в системе.

root@orangepi-3:~# dpkg -s systemd-timesyncd

  • dpkg-query: package 'systemd-timesyncd' is not installed and no information is available
  • Use dpkg --info (= dpkg-deb --info) to examine archive files.

Смотрим сведения о данном пакете.

root@orangepi-3:~# apt-cache show systemd-timesyncd

  • Package: systemd-timesyncd
  • Source: systemd
  • Version: 247.3-5~bpo10+2
  • Installed-Size: 197
  • Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
  • Architecture: arm64
  • Replaces: systemd (<< 245.4-2~), time-daemon
  • Provides: time-daemon
  • Depends: libc6 (>= 2.17), systemd (= 247.3-5~bpo10+2), adduser
  • Conflicts: time-daemon
  • Breaks: systemd (<< 245.4-2~)
  • Description: minimalistic service to synchronize local time with NTP servers
  • Description-md5: cc67d85c248836d96a6310e58a659de0
  • Multi-Arch: foreign
  • Homepage: https://www.freedesktop.org/wiki/Software/systemd
  • Section: admin
  • Priority: optional
  • Filename: pool/main/s/systemd/systemd-timesyncd_247.3-5~bpo10+2_arm64.deb
  • Size: 129424
  • SHA256: 995e7f99d3c436cf08b716a04a5026349afed5413fd674b75db12200f477f115

Нас интересует строка основных зависимостей Depends: libc6 (>= 2.17), systemd (= 247.3-5~bpo10+2), adduser, а конкретно версия systemd (=247.3-5~bpo10+2).

Проверяем текущую версию systemd.

root@orangepi-3:~# dpkg -s systemd | grep Version:

  • Version: 241-7~deb10u7

Как вы видите установленная версия далеко не самая свежая, но если попробовать обновить systemd, то окажется что это самый последний релиз в репозиториях на данный момент. Естественно без обновления systemd до требуемой версии вы не сможете установить systemd-timesyncd. Конечно вариант обойти данное недоразумение существует и заключается он в том, что потребуется работа с исходником и последующей его сборкой под данный дистрибутив. Возможно в будущем разработчики дистрибутивов в которых наблюдается данная ситуация исправят ее. Я еще не проверял насколько стабильно работает версия 247.3-5~bpo10+2 в данном дистрибутиве. По этой причине дальнейшее рассмотрение первого варианта закончим и переходим к второму. Например, в OC GNU/Linux Debian 5.9.15-1-bpo10+1 aarch64 systemd-timesyncd работает стабильно.

Вариант 2. - ntp.service

Так же как и systemd-timesyncd изначально ntp отсутствует в системе.

root@orangepi-3:~# dpkg -s ntp

  • dpkg-query: package 'ntp' is not installed and no information is available
  • Use dpkg --info (= dpkg-deb --info) to examine archive files.

Устанавливаем ntp после чего запускаем и добавляем в автозагрузку.

root@orangepi-3:~# apt-get install ntp

root@orangepi-3:~# systemctl start ntp

root@orangepi-3:~# systemctl enable ntp

  • Synchronizing state of ntp.service with SysV service script with /lib/systemd/systemd-sysv-install.
  • Executing: /lib/systemd/systemd-sysv-install enable ntp

Сразу же после запуска должна произойти синхронизация, но для уверенности перезагружаем систему.

root@orangepi-3:~# reboot

После перезагрузки проверяем статус синхронизации и самой службы ntp в целом..

root@orangepi-3:~# timedatectl status

  • Local time: Mon 2021-06-21 10:54:48 EEST
  • Universal time: Mon 2021-06-21 07:54:48 UTC
  • RTC time: Mon 2021-06-21 07:54:48
  • Time zone: Europe/Kiev (EEST, +0300)
  • System clock synchronized: yes
  • NTP service: inactive
  • RTC in local TZ: no

Синхронизация активна (System clock synchronized: yes).

Примечание: после выполнения всех вышеперечисленных настроек значение yes строки System clock synchronized: соответствует действительности.

root@orangepi-3:~# systemctl status ntp

- ntp.service - Network Time Service
Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-06-21 XX:XX:XX EEST; Xmin Xs ago
Docs: man:ntpd(8)
Process: 1403 ExecStart=/usr/lib/ntp/ntp-systemd-wrapper (code=exited, status=0/SUCCESS)
Main PID: 1437 (ntpd)
Tasks: 2 (limit: 2219)
Memory: 1.7M
CGroup: /system.slice/ntp.service
              --1437 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 109:117

Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 72.30.35.89
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 91.236.251.129
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 193.106.144.7
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 193.106.144.6
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 162.159.200.1
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 91.236.251.13
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 162.159.200.123
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 93.126.115.182
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 2606:4700:f1::123
Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: Soliciting pool server 94.158.46.150

Как вы можете видеть ntp загружено (Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)) и активно указанное время (Active: active (running) since Mon 2021-06-21 XX:XX:XX EEST; Xmin Xs ago).

Примечание: возможно что лог ntp может вывести следующие строки:

  • Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: receive: Unexpected origin timestamp
  • 0xe481929c.9fd65bb2 does not match aorg 0000000000.00000000 from server@91.236.251.5
  • xmt 0xec.9fd65bb2 does not match aorg 0000000000.00000000 from server@91.236.251.5
  • xmt 0xe481929b.58c3a1c5
  • Jun 21 XX:XX:XX XXXXXXXX ntpd[1437]: 94.158.46.150 local addr XXX.XXX.XXX.XXX ->

На это можно не обращать внимание. Данные ошибки вызваны изменениями, внесенными в обнаружение фиктивных пакетов NTP. Они по-прежнему регистрируются даже с использованием последней версии NTP, но связь больше не теряется, и сообщения можно игнорировать.

Для наглядности выводим мониторинг ntp.

На этом настройка системного времени и его синхронизации завершена.

P.S. Сервис ntp не только синхронизирует время, но и может быть настроен как сервер времени. Но рассмотрение данного вопроса выходит за рамки этой статьи. :)

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Поки немає відгуків на цю статтю.
оплата картами Visa і MasterCard