Linux. Дата, время и часовой пояс

21.10.2023

Теги: CLILinuxКлиентКонфигурацияСервер

Настройка часового пояса

Управление часовым поясом в Linux производится тремя разными способами

  • через создание символической ссылки /etc/localtime на файл часового пояса в директории /usr/share/zoneinfo
  • через описание часового пояса в файле /etc/timezone, это актуально не во всех дистрибутивах
  • используя утилиту командной строки timedatectl — в системах, использующих Systemd

Первый способ, ссылка /etc/localtime

Файл /etc/localtime представляет собой символическую ссылку на файл часового пояса, расположенного в директории /usr/share/zoneinfo. Эти файлы имеют определенную структуру, которая позволяет описать все возможные состояния часового пояса — используется ли летнее/зимнее время в поясе, какая разница в часах относительно часового пояса UTC (универсальное время) и прочая информация.

Для смены часового пояса данным путем требуется удалить существующую символическую ссылку и создать вместо нее новую, указывающую на новую зону. К примеру, для переключения на часовой пояс Хельсинки требуется создать линк на файл /usr/share/zoneinfo/Europe/Helsinki.

Второй способ, файл /etc/timezone

Второй способ, в отличие от первого, сильно отличается от дистрибутива к дистрибутиву, из-за чего его использование нежелательно. Некоторые утилиты используют именно этот файл для определения системной timezone, но список таких утилит невелик, и в отсутствие этого файла они умеют узнавать зону из первого способа.

Третий способ, утилита timedatectl

Утилита timedatectl входит в состав Systemd, поэтому присутствует почти в каждом современном дистрибутиве и позволяет автоматизировать многие задачи, связанные с управлением временем. Можно установить часовой пояс с помощью аргумента set-timezone — при этом утилита берет на себя установку, создание символической ссылки /etc/localtime и изменение файла /etc/timezone, если он существует.

Утилита timedatectl

Текущая дата, время, часовой пояс

Для этого нужно передать аргумент status или вызвать утилиту вовсе без аргументов

$ timedatectl status
               Local time: Пн 2023-10-16 17:08:34 MSK
           Universal time: Пн 2023-10-16 14:08:34 UTC
                 RTC time: Пн 2023-10-16 14:08:30
                Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

Утилита показывает семь значений, давайте посмотрим, что они означают

  • Local time (локальное время) — это время, которое применяется в определенном регионе, со смещением относительно UTC.
  • Universal time (универсальное время, UTC) — является международным стандартом времени, не зависит от региона и не имеет смещения.
  • RTC time (Real-Time Clock time) — время в аппаратных часах компьютера. Это время используется, когда NTP-сервер недоступен.
  • Time Zone — какая временная зона или часовой пояс установлены на компьютере.
  • System clock synchronized — синхронизировано ли системное время с NTP-сервером, принимает значения yes (да) и no (нет).
  • NTP service — работает ли служба синхронизации времени с NTP-сервером, принимает значения active (да) и inactive (нет).
  • RTC in local TZ — какое время хранится в аппаратных часах — локальное (yes) или универсальное (no).

Список доступных часовых поясов

Для этого нужно передать аргумент list-timezones

$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
..........

Установка часового пояса

Посмотрим текущие дату, время и часовой пояс

$ timedatectl status
               Local time: Сб 2023-10-21 16:00:44 MSK
           Universal time: Сб 2023-10-21 13:00:44 UTC
                 RTC time: Сб 2023-10-21 13:00:44
                Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no

Установим часовой пояс Asia/Novosibirsk

$ timedatectl set-timezone Asia/Novosibirsk

Посмотрим, что получилось в итоге

$ timedatectl status
               Local time: Сб 2023-10-21 19:59:55 +07
           Universal time: Сб 2023-10-21 12:59:55 UTC
                 RTC time: Сб 2023-10-21 12:59:55
                Time zone: Asia/Novosibirsk (+07, +0700)
System clock synchronized: yes
              NTP service: inactive
          RTC in local TZ: no

Вернем часовой пояс Europe/Moscow

$ timedatectl set-timezone Europe/Moscow

Установка даты и времени

Для этого нужно передать аргумент set-time + дату и время в формате 2012-10-30 18:17:16. При этом изменяется не только системное время, но и время RTC.

$ timedatectl set-time "2012-10-30 18:17:16"
$ timedatectl status
               Local time: Вт 2012-10-30 18:17:28 MSK
           Universal time: Вт 2012-10-30 14:17:28 UTC
                 RTC time: Вт 2012-10-30 14:17:29
                Time zone: Europe/Moscow (MSK, +0400)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

Перед выполнением это команды нужно остановить службу синхронизации времени, см. подробности ниже

$ timedatectl set-ntp false

В противном случае будет ошибка Failed to set time: Automatic time synchronization is enabled. Чтобы вернуть все обратно — достаточно включить службу синхронизации времени.

$ timedatectl set-ntp true

Служба systemd-timesyncd.service

Служба systemd-timesyncd.service, входящая в состав Systemd, предназначена для синхронизации системного времени с NTP-сервером. У меня служба не запущена, так что давайте запустим и добавим в автозагрузку.

$ systemctl status systemd-timesyncd # старый статус
○ systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:systemd-timesyncd.service(8)
$ sudo systemctl start systemd-timesyncd # запускаем службу
$ sudo systemctl enable systemd-timesyncd # добавляем в автозапуск
$ systemctl status systemd-timesyncd # новый статус
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-16 17:50:39 MSK; 2s ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 2568 (systemd-timesyn)
     Status: "Initial synchronization to time server 185.125.190.56:123 (ntp.ubuntu.com)."
      Tasks: 2 (limit: 4599)
     Memory: 1.3M
        CPU: 100ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─2568 /lib/systemd/systemd-timesyncd

окт 16 17:50:38 ubuntu-rebrain systemd[1]: Starting Network Time Synchronization...
окт 16 17:50:39 ubuntu-rebrain systemd[1]: Started Network Time Synchronization.
окт 16 17:50:39 ubuntu-rebrain systemd-timesyncd[2568]: Initial synchronization to time server 185.125.190.56:123....

Служба успешно запустится, если в системе нет другого работающего NTP-клиента — например, chronyd. Файл конфигурации службы — это /etc/systemd/timesyncd.conf. Достаточно в него добавить две строки или вообще не трогать — будут использованы NTP-серверы по умолчанию. После редактирования файла конфигурации нужно перезапустить службу, чтобы изменения вступили в силу.

[Time]
NTP = 192.168.110.2 192.168.110.3
FallbackNTP = 0.ru.pool.ntp.org 1.ru.pool.ntp.org

Опция NTP содержит список серверов, с которыми следует выполнять синхронизацию, в нашем случае — два локальных сервера времени. Если указанные узлы недоступны, то служба попытается выполнить синхронизацию с серверами, перечисленными в опции FallbackNTP.

Включить или отключить службу синхронизации времени можно с помощью двух других команд

$ timedatectl set-ntp true
$ timedatectl set-ntp false

Но эти команды включают (start и enable) или выключают (stop и disable) и другие службы синхронизации времени, которые установлены в системе — например chronyd. Если одновременно установлены timesyncd и chronyd — будет запущена первая найденная.

Chronyd как NTP-сервер и NTP-клиент

Chronyd — это реализация протокола сетевого времени Network Time Protocol (NTP). Может использоваться как NTP-сервер и как NTP-клиент.

Использование Chrony в качестве NTP-сервера — когда есть необходимость создать NTP-сервер для локальной сети. Вместо подключения к общедоступному NTP-серверу в интернете, клиенты будут подключаться к локальному компьютеру, на котором работает Chrony в качестве NTP-сервера.

Использование Chrony в качестве NTP-клиента — когда нужно синхронизировать время на компьютере с общедоступным или локальным NTP-сервером.

Давайте остановим службу systemd-timesyncd.service — для дальнейшей установки chronyd.

$ timedatectl set-ntp false

Установка и настройка

Для начала нужно установить пакет chrony

$ sudo apt install chrony

Служба chronyd.service будет запущена сразу после установки

$ sudo systemctl status chronyd.service
● chrony.service - chrony, an NTP client/server
     Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-10-20 17:59:00 MSK; 45s ago
       Docs: man:chronyd(8)
             man:chronyc(1)
             man:chrony.conf(5)
    Process: 2095 ExecStart=/usr/lib/systemd/scripts/chronyd-starter.sh $DAEMON_OPTS (code=exited, status=0/SUCCESS)
   Main PID: 2104 (chronyd)
      Tasks: 2 (limit: 4599)
     Memory: 1.7M
        CPU: 77ms
     CGroup: /system.slice/chrony.service
             ├─2104 /usr/sbin/chronyd -F 1
             └─2105 /usr/sbin/chronyd -F 1

окт 20 17:59:00 ubuntu-rebrain systemd[1]: Starting chrony, an NTP client/server...
окт 20 17:59:00 ubuntu-rebrain chronyd[2104]: chronyd version 4.2 starting (+CMDMON +NTP...>
окт 20 17:59:00 ubuntu-rebrain chronyd[2104]: Using right/UTC timezone to obtain leap second data
окт 20 17:59:00 ubuntu-rebrain chronyd[2104]: Loaded seccomp filter (level 1)
окт 20 17:59:00 ubuntu-rebrain systemd[1]: Started chrony, an NTP client/server.
окт 20 17:59:07 ubuntu-rebrain chronyd[2104]: Selected source 91.209.94.10 (0.ubuntu.pool.ntp.org)
окт 20 17:59:07 ubuntu-rebrain chronyd[2104]: System clock TAI offset set to 37 seconds
окт 20 17:59:07 ubuntu-rebrain chronyd[2104]: Source 188.120.233.26 replaced with 89.221.207.113 (2.ubuntu.pool.ntp.org)

Файл конфигурации службы — это /etc/chrony/chrony.conf. Директивы server и/или pool позволяют задать сервер(ы) и/или пул(ы) серверов. Ожидается, что значение директивы pool будет разрешаться в несколько ip-адресов, которые могут меняться со временем. По умолчанию служба работает только как NTP-клиент, чтобы служба стала работать как NTP-сервер — нужно добавить директиву allow. После редактирования файла конфигурации нужно перезапустить службу, чтобы изменения вступили в силу.

# новая директива, клиенты NTP-сервера
allow 192.168.110.0/24

Теперь на всех компьютерах сети 192.168.110.0/24 можно запустить службу systemd-timesyncd.service и указать ip-адрес этого компьютера в качестве значения директивы NTP в файле конфигурации /etc/systemd/timesyncd.conf. Тогда этот компьютер будет получать точное время от внешнего сервера времени, а остальные компьютеры сети — получать точное время от локального NTP-сервера.

Ntpd как NTP-сервер и NTP-клиент

Ntpd — это еще одна реализация протокола сетевого времени Network Time Protocol (NTP). Может использоваться как NTP-сервер и как NTP-клиент. Пакет ntp устарел и его использование не рекомендуется.

Давайте остановим службу chronyd.service — для дальнейшей установки пакета ntp.

$ timedatectl set-ntp false

Установка и настройка

Для начала нужно установить пакет ntp

$ sudo apt install ntp
..........
Предлагаемые пакеты:
  ntp-doc
Следующие пакеты будут УДАЛЕНЫ:
  chrony
..........

Пакет chrony при этом был удален — это разумное действие, чтобы две одинаковые службы не мешали друг другу. Как оказалось позже, пакет systemd-timesyncd тоже был удален. Обратите внимание, что служба называется ntp.service, не ntpd.service — хотя у меня везде используется имя ntpd. Просто мне так проще не запутаться, когда речь идет о протоколе NTP, а когда мы говорим о службе ntpd.

$ systemctl status ntp.service
● ntp.service - Network Time Service
     Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-10-21 14:19:57 MSK; 5min ago
       Docs: man:ntpd(8)
    Process: 2307 ExecStart=/usr/lib/ntp/ntp-systemd-wrapper (code=exited, status=0/SUCCESS)
   Main PID: 2313 (ntpd)
      Tasks: 2 (limit: 4599)
     Memory: 1.4M
        CPU: 138ms
     CGroup: /system.slice/ntp.service
             └─2313 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 131:138

окт 21 14:20:01 ubuntu-rebrain ntpd[2313]: Soliciting pool server 195.218.227.230
окт 21 14:20:01 ubuntu-rebrain ntpd[2313]: Soliciting pool server 192.36.143.130
окт 21 14:20:01 ubuntu-rebrain ntpd[2313]: Soliciting pool server 85.159.224.52
окт 21 14:20:02 ubuntu-rebrain ntpd[2313]: Soliciting pool server 46.188.16.150
окт 21 14:20:02 ubuntu-rebrain ntpd[2313]: Soliciting pool server 195.3.254.2
окт 21 14:20:02 ubuntu-rebrain ntpd[2313]: Soliciting pool server 185.87.49.10
окт 21 14:20:02 ubuntu-rebrain ntpd[2313]: Soliciting pool server 185.125.190.58
окт 21 14:20:03 ubuntu-rebrain ntpd[2313]: Soliciting pool server 91.189.91.157
окт 21 14:20:03 ubuntu-rebrain ntpd[2313]: Soliciting pool server 2a03:aa00::136:50
окт 21 14:20:04 ubuntu-rebrain ntpd[2313]: Soliciting pool server 185.125.190.57

Файл конфигурации службы — это /etc/ntp.conf. Директивы server и/или pool позволяют задать сервер(ы) и/или пул(ы) серверов. Ожидается, что значение директивы pool будет разрешаться в несколько ip-адресов, которые могут меняться со временем. По умолчанию служба работает только как NTP-клиент, чтобы служба стала работать как NTP-сервер — нужно изменить значение директивы restrict. После редактирования файла конфигурации нужно перезапустить службу, чтобы изменения вступили в силу.

# новое значение, клиенты сервера
restrict 192.168.110.0 mask 255.255.255.0

Теперь на всех компьютерах сети 192.168.110.0/24 можно запустить службу systemd-timesyncd.service и указать ip-адрес этого компьютера в качестве значения директивы NTP в файле конфигурации /etc/systemd/timesyncd.conf. Тогда этот компьютер будет получать точное время от внешнего сервера времени, а остальные компьютеры сети — получать точное время от локального NTP-сервера.

Поиск: CLI • Linux • Клиент • Конфигурация • Сервер • Служба • timedatectl • Часовой пояс • Дата • Время

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.