Показаны сообщения с ярлыком systemd-timesyncd. Показать все сообщения
Показаны сообщения с ярлыком systemd-timesyncd. Показать все сообщения

пятница, 15 декабря 2023 г.

Исправление в Linux Mint 21 (Ubuntu 22.04) – systemd timesync не понимает серверы NTP от DHCP

В различных материалах, посвящённых синхронизации времени через systemd, можно найти утверждение, что если сервер DHCP выдаёт адрес сервера NTP, то время будет синхронизироваться именно по этому источнику, так как имеет приоритет над настройками в строках NTP= и FallbackNTP= конфигурационного файла /etc/systemd/timesyncd.conf  Это было отмечено как примечание в публикации "Переключение синхронизации времени в Linux Mint xfce на systemd" и это же утверждает русскоязычный источник interface31.ru 

К сожалению, лично у меня реальное состояние дел опровергло данное утверждение. Несмотря на то что сервер DHCP выдавал 2 адреса серверов NTP, синхронизация времени велась либо от серверов NTP в настройках файла  timesyncd.conf, либо от сервера ntp.ubuntu.com, когда данный файл был приведен в "исходное" состояние, которое он имеет после установки системы:

[Time]
#NTP=
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Имеется два варианта "заставить" компьютер синхронизировать своё время от серверов NTP, адреса которых предоставляет сервер DHCP:

1) перевести синхронизацию времени с systemd на ntp (подробности);

2) использовать корректирующий скрипт. 

Корректирующий скрипт был найден на этом ресурсе.

Под правами root создаётся файл 10-update-timesyncd

sudo xed /etc/NetworkManager/dispatcher.d/10-update-timesyncd

с содержанием:

#! /usr/bin/bash
[ -n "$CONNECTION_UUID" ] || exit
INTERFACE=$1
ACTION=$2
case $ACTION in
    up | dhcp4-change | dhcp6-change)
        [ -n "$DHCP4_NTP_SERVERS" ] || exit
        mkdir -p /etc/systemd/timesyncd.conf.d/
        cat<<EOF > /etc/systemd/timesyncd.conf.d/$CONNECTION_UUID.conf
[Time]
NTP=$DHCP4_NTP_SERVERS
RootDistanceMaxSec=15
EOF
        systemctl restart systemd-timesyncd
       ;;
    down)
        rm -f /etc/systemd/timesyncd.conf.d/$CONNECTION_UUID.conf
        systemctl restart systemd-timesyncd
        ;;
esac

и установленным правом на выполнение (как программы).

После создания указанного файла в целях чистоты эксперимента перезагрузите систему.

При проведении проверки мой DHCP сервер (в локальной сети) предоставлял серверы NTP 194.158.196.171 и 194.158.196.172  При запросе состояния синхронизации времени  timedatectl timesync-status  был получен ответ:


Информацию о серверах NTP от DHCP systemd-timesync берёт из созданного файла /etc/systemd/timesyncd.conf.d/$CONNECTION_UUID.conf  
В моём случае это был файл  61ba6df5-3c5b-3075-8e05-993158de5fb4.conf с содержанием:

[Time]
NTP=194.158.196.171 194.158.196.172
RootDistanceMaxSec=15

Если необходимость в дальнейшей реализации такого решения отпала и нужно всё вернуть в исходное состояние, просто под правами root удалите как этот файл, так и созданный вами скрипт (см. выше).

Если у вас имеется свой локальный сервер NTP, то можно либо настроить перенаправление на него всех запросов по udp порт 123 (пример для MikroTik), либо в DNS создать псевдонимы для нужных серверов NTP. Если в DNS создать псевдоним для ntp.ubuntu.com, то даже при всех закомментированных строках файла timesyncd.conf своё время компьютер будет синхронизировать с локальным сервером NTP. Пример:

      Server: 192.168.224.81 (ntp.ubuntu.com)
Poll interval: 17min 4s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 3
    Reference: 1F82C802
    Precision: 123us (-13)
Root distance: 24.932ms (max: 5s)
       Offset: -13.038ms
        Delay: 412us
       Jitter: 5.028ms
 Packet count: 5
    Frequency: -45,227ppm

пятница, 30 июня 2023 г.

Переключение синхронизации времени с systemd на ntp

При необходимости отказа от синхронизации с серверами времени через systemd выполните в терминале команды (даются в одну строку, чтобы выполнялись пакетным образом).

sudo apt install -y ntp && sudo systemctl restart ntp

В процессе выполнения указанной выше составной команды пакет systemd-timesyncd удаляется автоматически.

Проверить автоматический запуск службы ntp можно командой

  systemctl is-enabled ntp  

Ответ enabled является положительным. 

Указания серверов времени для синхронизации задаются в файле  /etc/ntp.conf  
В Linux Mint по умолчанию указаны следующие:

pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
pool ntp.ubuntu.com

Первые 4 строки указывают на пул серверов времени ubuntu.pool.ntp.org. При невозможности синхронизировать время ни с одним из указанных адресов синхронизация будет осуществлена с пулом серверов pool ntp.ubuntu.com

Эти значения можно изменить, указав предпочитаемые вами пулы адресов или конкретные серверы времени. Вы можете воспользоваться информацией с этого ресурса.
 
Бывает, что провайдер Интернет (как в моём случае) автоматически перенаправляет запросы с пулу ubuntu.pool.ntp.org на региональные серверы точного времени. В таком случае производить изменения в файле  /etc/ntp.conf  нет необходимости. Сведения об этом можно получить по запросу в терминале

  ntpq -p , например:


В пользу того, что провайдер перенаправляет запросы к пулу ubuntu.pool.ntp.org на региональные серверы точного времени говорят малые значения в столбце delay (время ответа). Либо информацию об этом можно получить по наименованию серверов времени в столбце remote.

Пояснения по приведенному выше рисунку:

remote – имя удаленного NTP-сервера. Если дать запрос ntpq -p -n , то вместо имён серверов будут отображены их IP-адреса.

refid – указывает, откуда каждый сервер получает время в данный момент. Это может быть имя хоста или что-то вроде .GPS., указывающее на источник глобальной системы позиционирования (Global Positioning System).

st – Stratum (уровень) это число от 1 до 16, указывающее на точность сервера. Единица означает максимальную точность, 16 означает, что сервер недоступен. 

poll – интервал между опросами (в секундах). Значение будет изменяться между минимальной и максимальной частотой опросов. В начале интервал будет маленьким, чтобы синхронизация происходила быстро. После того как часы синхронизируются, интервал начинает увеличиваться, чтобы уменьшить трафик и нагрузку на популярные сервера времени.

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

delay – количество времени (в секундах) необходимого для получения ответа на запрос "который час? ".

offset – наиболее важное поле. Разница между временем локального и удаленного серверов. В ходе синхронизации это значение должно понижаться (приближаться к нулю), указывая на то, что часы локальной машины идут все точнее.

jitter – дисперсия, то есть мера статистических отклонений от значения смещения (поле offset) по нескольким успешным парам запрос-ответ. Меньшее значение дисперсии предпочтительнее, поскольку позволяет точнее синхронизировать время.

Значение знаков перед именами серверов:

x – фальшивый источник по алгоритму пересечения;
. – исключён из списка кандидатов из-за большого расстояния;
- – удалено из списка кандидатов алгоритмом кластеризации;
+ – входит в конечный список кандидатов;
# – выбран для синхронизации, но есть 6 лучших кандидатов;
* – выбран для синхронизации;
o – выбран для синхронизации, но используется PPS;
пробел – слишком большой уровень, цикл или явная ошибка.

Служба ntpd сама отсеивает источники времени слишком выбивающиеся "за рамки разумного". Через некоторое время после запуска ntpd выберет наиболее достоверные источники данных и будет синхронизироваться с ними. Список эталонных NTP серверов регулярно пересматривается службой. Например, по этой ссылке указаны сведения по непонятному узлу hbars.site (см. рисунок).

Своего рода платой за переход синхронизации времени c systemd на ntp будет являться некоторый рост (до нескольких секунд) времени загрузки вашей системы. Лично у меня он составил порядка 3 секунд. Увидеть конкретное значение можно при выводе результата запроса в терминале

  systemd-analyze blame  (смотрите строку, содержащую ntp).

В связи с этим возникает вопрос: а зачем может возникнуть необходимость переключения с systemd-timesync на ntp?

Как указано в комментариях 31 и 33 на unix.stackexchange.com, далее – цитирование:

Systemd-timesyncd – это клиент SNTP, который менее точен, чем NTP. Читатели не должны вводить себя в заблуждение, думая, что systemd-timesyncd – это легковесный NTP-клиент.

systemd-timesyncd не дисциплинирует часы: часы не обучаются и не компенсируются, а внутренний дрейф часов с течением времени не уменьшается. У него есть рудиментарная логика для настройки интервала опроса, но без дисциплинирования хост навсегда останется с неравномерным временем, поскольку systemd-timesyncd подталкивает или тянет с любым интервалом, который, по его мнению, требуется для краткосрочного дрейфа. Он также не может оценить качество удаленного источника времени. Вы вряд ли получите точность намного выше 100 мс. Этого достаточно для простых устройств конечного пользователя, таких как ноутбуки, но это определенно может вызвать проблемы для распределенных систем, которым нужна более высокая точность времени.

Соответственно, если в Cinnamon вы делали лаунчер (кнопку запуска) для проверки состояния синхронизации времени (подробности), то строку

Exec=sh -c 'timedatectl timesync-status | cat - /dev/tty'

необходимо изменить на

Exec=sh -c 'ntpq -p | cat - /dev/tty'

✔   Примечание. При создании лаунчера необходимо отметить, чтобы он запускался в терминале.


Если вы это не сделали, то откройте свой лаунчер, расположенный по пути
/home/ваш_домашний_каталог/local/applications
в текстовом редакторе и внесите в него строку Terminal=true

Если нужно, чтобы у вас отобразилось окно терминала на определённое количество секунд, например, 25, то сделайте следующее:

1) создайте исполняемый файл timesync.sh с содержанием:

#!/bin/bash
sh -c 'ntpq -p | cat - /dev/tty' &
sleep 25
exit

2) в созданном лаунчере (см. выше) измените

Exec=sh -c 'timedatectl timesync-status | cat - /dev/tty'

на Exec=полный_путь_к_timesync.sh

суббота, 20 мая 2023 г.

Переключение синхронизации времени в Linux Mint xfce на systemd

При использовании на своих компьютерах Linux с графическими окружениями Cimmanon и xfce замечено, что в них используются разные способы синхронизации времени: через systemd в Cinnamon и через службу ntp в xfce. Поэтому с целью некого подобия стандартизации было принято решение переключить синхронизацию времени в Linux Mint xfce на systemd.

Отсутствие синхронизации времени через systemd в Linux Mint xfce можно проверить через команду  systemctl status systemd-timesyncd.service 

systemd-timesyncd.service
     Loaded: masked (Reason: Unit systemd-timesyncd.service is masked.)
     Active: inactive (dead)

Состояние синхронизации в Linux Mint xfce отображается через  ntpq -p 

Звёздочкой будет показан используемый сервер времени на момент запроса. Подробнее о синхронизации времени в xfce можно прочитать здесь.

Сначала настроим файл конфигурации службы:  sudo xed /etc/systemd/timesyncd.conf

[Time]
NTP=
FallbackNTP=ntp.ubuntu.com
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

NTP – один или несколько ntp серверов через пробелы;

FallbackNTP – один или несколько резервных ntp серверов;

RootDistanceMaxSec – максимальное время в секундах, за которое пакет от сервера эталонного времени должен доходить до сервера к которому вы подключены;

PollIntervalMinSec и PollIntervalMaxSec – минимальный и максимальный интервалы синхронизаций времени. Вначале используется минимальный интервал, а затем он увеличивается если система видит что локальное время со временем ntp-сервера не расходится. По умолчанию минимальный интервал устанавливается в 32 секунды, а максимальный в 32 минуты 8 секунд (2048 с). Минимальный интервал не может быть менее 16 секунд. Максимальное значение не ограничивается. 

В строке NTP= можно вписать 0.ubuntu.pool.ntp.org 1.ubuntu.pool.ntp.org 2.ubuntu.pool.ntp.org 3.ubuntu.pool.ntp.org, либо 0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org, 3.pool.ntp.org, либо сервер(ы) времени, предоставляемые вашим провайдером Интернет, либо указать выбранные вами из личных предпочтений. Можно попробовать автоматический выбор из пула, например, NTP=by.pool.ntp.org  

Server: 194.158.196.172 (by.pool.ntp.org)
Poll interval: 17min 4s (min: 32s; max 34min 8s)
Leap: normal
Version: 4
Stratum: 2
Reference: 596DFB18
Precision: 1us (-23)
Root distance: 64.040ms (max: 5s)
Offset: +145us
Delay: 3.899ms
Jitter: 112us
Packet count: 5
Frequency: -6,452ppm

В строке FallbackNTP можно указать ntp.ubuntu.com либо другой сервер, который вам известен, например, time.google.com. На мой взгляд, предпочтительнее указать time.cloudflare.com, до которого "достучаться" можно минимум в 3 раза быстрее, чем до time.google.com и раз в 10 быстрее, чем до ntp.ubuntu.com (утверждение основано на моих результатах команды ping). Если имеется возможность настройки своего сервера DNS (например, на маршрутизаторе), то можно сделать запись типа CHAME, которая укажет, что узлу ntp.ubuntu.com соответствует узел time.cloudflare.com

Кроме указанных строк может ещё присутствовать строка ConnectionRetrySec= (отсутствует по умолчанию). Она отвечает за интервал между последующими попытками синхронизации с другими серверами времени, если первый сервер в списке не ответил. По умолчанию принимается значение 30 секунд и не может быть менее 1 секунды (подбробности). 

Примечание. Если сервер DHCP выдаёт адреса серверов времени, то поле NTP можно не заполнять, так как эти значения будут иметь наивысший приоритет и использоваться для синхронизации в первую очередь. В случае недоступности таких серверов будет выполняться синхронизация с серверами, указанными в поле NTP, а если недоступны и они, тогда синхронизация времени будет произведена в сервером, указанным в FallbackNTP. Пример выдачи сервером DHCP MikroTik адресов серверов точного времени:


[Time]
NTP=
FallbackNTP=time.google.com

Результат при запросе состояния синхронизации: Server: 31.130.200.2 (31.130.200.2)

Дополнительно. Пишут, что при использовании systemd-timesync служба не может осуществлять выборы между узлами пула серверов NTP на предмет определения наиболее лучшего из них, как это реализовано в службе NTP. Однако для домашних компьютеров использование systemd для синхронизации времени компьютера с серверами точного времени является вполне приемлемым. Но в Linux Mint (Ubuntu) это может не работать. Как заставить systemd-timesync понимать адреса серверов NTP, которые предоставляет DHCP, читайте здесь.

Далее выполняется команда: 

sudo apt purge -y ntp && sudo apt install -y systemd-timesyncd

Включаем использование  systemd-timesyncd  для синхронизации времени:

sudo timedatectl set-ntp true

Включаем и перезапускаем службу  systemd-timesyncd:

sudo systemctl enable --now systemd-timesyncd.service && sudo systemctl restart systemd-timesyncd.service

Всё можно сделать одной командой:

sudo apt purge -y ntp && sudo apt install -y systemd-timesyncd && sudo timedatectl set-ntp true && sudo systemctl enable --now systemd-timesyncd.service && sudo systemctl restart systemd-timesyncd.service

Проверяем состояние службы:  systemctl status systemd-timesyncd.service

...
Status: "Initial synchronization to time server 31.130.200.2:123 (ns1.datahata.by)."
...

Через 1-2 минуты можно проверить состояние синхронизации времени компьютера:  timedatectl status

...
Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: yes
              NTP service: active

Детальную информацию о состоянии синхронизации времени можно посмотреть командой  timedatectl timesync-status

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

После старта системы более часа назад расхождение по времени в момент запроса на моё восприятие оказалось неожиданно минимальным:

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

Для получения информации о состоянии синхронизации можно на рабочем столе создать значок запуска с именем NTP status, указав команду 

 xfce4-terminal -H -x sh -c "timedatectl timesync-status; exec bash"


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

 /home/ваш_каталог/.local/share/applications

В нём появится файл  NTP status.desktop  с содержанием

[Desktop Entry]
Version=1.0
Type=Application
Name=NTP status
Comment=
Exec=xfce4-terminal -H -x sh -c 'timedatectl timesync-status; exec bash'
Icon=dcc_nav_datetime
Path=
Terminal=false
StartupNotify=false

Если необходимо, добавьте пояснение в поле Comment=

По умолчанию этот значок (кнопка) запуска будет расположен в категории "Прочее". Если нужно, чтобы он отображался, например, в категории "Система", то добавьте строку (открыть в текстовом редакторе) 

Categories=Network;System;

Содержание файла NTP status.desktop  может быть и немного другим, если при создании значка запуска была установлена галочка в поле "Запускать в терминале (актуально для Cinnamon), а команда указана как

sh -c 'timedatectl timesync-status | cat - /dev/tty'

[Desktop Entry]
Version=1.0
Type=Application
Name=NTP status
Comment=
Exec=sh -c 'timedatectl timesync-status | cat - /dev/tty'
Icon=dcc_nav_datetime
Path=
Terminal=true
StartupNotify=false

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

Пример вывода:

Server: 31.130.200.2 (31.130.200.2)
Poll interval: 17min 4s (min: 32s; max 34min 8s)
Leap: normal
Version: 4
Stratum: 2
Reference: 596DFB18
Precision: 1us (-23)
Root distance: 16.868ms (max: 5s)
Offset: -420us
Delay: 2.028ms
Jitter: 390us
Packet count: 6
Frequency: -1,643ppm

Интерес могут представлять следующие сведения:

Server:  IP-адрес сервера, с которым было синхронизировано время;

Poll interval:  время, прошедшее с последней синхронизации с сервером времени. Также будет указаны значения минимального и максимального промежутков между запросами синхронизации времени (min: 32s; max 34min 8s). Эти значения считываются из файла настройки /etc/systemd/timesyncd.conf (строки PollIntervalMin и PollIntervalMax);

Stratum:  класс точности сервера времени, с которым была произведена синхронизация;

Offset:  расхождение ваших часов и сервера времени, с которым была произведена синхронизация;

Delay:  время задержки на запрос о синхронизации времени;

Jitter:  мера статистических отклонений от значения смещения по нескольким успешным парам запрос-ответ. Чем это значение меньше, тем время синхронизируется точнее.

Packet count:  количество отправленных запросов с момента старта службы синхронизации времени. 

Значение ms соответствует миллисекунд, а значение us соответствует микросекунд (хвостик буквы "мю" вниз не отобразился).

🔰   Дополнение. 

Если нужно, чтобы у вас отобразилось окно терминала на определённое количество секунд, например, 25, то сделайте следующее:

1) создайте исполняемый файл timesync.sh с содержанием:

#!/bin/bash
sh -c '
'timedatectl timesync-status | cat - /dev/tty' &
sleep 25
exit

2) в созданном лаунчере (см. выше) измените

Exec=sh -c 'timedatectl timesync-status | cat - /dev/tty'

на Exec=полный_путь_к_timesync.sh


При написании были использованы материалы этого источника