Linux. Дата, время и часовой пояс
21.10.2023
Теги: CLI • Linux • Клиент • Конфигурация • Сервер
Настройка часового пояса
Управление часовым поясом в 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-сервера.
- Dante. Установка и настройка прокси-сервера
- Ubuntu. Установка и настройка supervisor
- GitHub Actions. Начало работы, часть 1 из 2
- Установка WireGuard на Ubuntu 20.04 LTS. Часть вторая из двух
- Установка WireGuard на Ubuntu 20.04 LTS. Часть первая из двух
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
Поиск: CLI • Linux • Клиент • Конфигурация • Сервер • Служба • timedatectl • Часовой пояс • Дата • Время