понедельник, 3 апреля 2017 г.

О синхронизации времени в Linux Mint 18

После "мучений" с пониманием вопроса о синхронизации времени в Windows 7 меня заинтересовал вопрос о реализации синхронизации времени в моей системе Linux Mint.

Сразу отмечу, что только в одном месте получить интересующую информацию было тяжело. Зачастую найденные публикации содержали либо избыточные для меня сведения, либо были устаревшие, либо относились к дистрибутивам других пакетных баз. Ниже кратко изложу то, что будет в дальнейшем являться в некотором роде "шпаргалкой" по объявленному в качестве темы публикации вопросу. Необязательная поясняющая информация даётся курсивом.

Итак, Linux Mint, основанный на Ubuntu, использует ntpdate и ntpd.

ntpdate запускается при каждой загрузке системы 1 раз для установки времени по NTP серверу Ubuntu.

ntpd вычисляет "уход" системных часов и постоянно подправляет их, благодаря чему не происходит сильных изменений, что может приводить к непоследовательности в журналах. Ценой этому небольшое расходование мощности процессора и оперативной памяти, но для современного сервера это несущественно (источник).

Ядро Linux'а всегда хранит и вычисляет время, как число секунд прошедших с полночи 1-го января 1970 года, в независимости от того, установлены ваши часы на локальное или всемирное время. Преобразование в локальное время производится в процессе запроса.

Поскольку количество секунд с 1-го января 1970 года всемирного времени сохраняется как знаковое 32-битное целое (это справедливо для Linux/Intel систем), ваши часы перестанут работать где-то в 2038 году. Linux не имеет проблемы 2000-го года, но имеет проблему 2038 года. К счастью, к тому времени все linux'ы будут запущены на 64-х разрядных системах. 64-х битное целое будет содержать наши часы приблизительно до 292271-миллионного года (источник).


Настройки ntdate содержатся в файле /etc/default/ntpdate.  Для быстрого просмотра запустите терминал и введите команду cat /etc/default/ntpdate


Для редактирования указанного в файле сервера точного времени запустите sudo xed /etc/default/ntpdate и в строке NTPSERVERS="" укажите другой сервер точного времени.

Настройки ntpd содержатся в файле /etc/ntp.conf. Для быстрого просмотра запустите терминал и введите команду cat /etc/ntp.conf


В данном файле редактированию могут подвергаться список серверов NTP, перечень которых смотрите в секции, начинающейся с # Use servers from the NTP Pool Project, и ntp-сервер Ubuntu в качестве запасного варианта, который указан ниже записи # Use Ubuntu's ntp server as a fallback.

В самом начале файла имеется непонятная запись
driftfile /var/lib/ntp/ntp.drift>

driftfile задает файл, который используется для хранения смещения частоты системных часов относительно UTC. Это значение формируется на основании анализа прошедших корректировок времени и если внешние источники времени становятся недоступны, то корректировка времени происходит по значению из файла drift. Он не должен изменяться никакими другими процессами. Если этот файл задан, то демон ntpd использует в качестве начальной частоты коррекции значение из файла, иначе используется 0.

С помощью директивы "driftfile" вы можете задать файл, в котором будет сохранятся частотная коррекция, принятая для синхронизации системных часов с UTC. Это ускорит процесс синхронизации после перезапуска демона ntpd. Если этот файл задан, то демон ntpd использует в качестве начальной частоты коррекции значение из файла, иначе используется 0. 


Например, любопытства ради моё значение было 11.336:

~ $ cat /var/lib/ntp/ntp.drift
11.336


При последовавшем позднее запросе это значение уже составило 11.890

На самом деле узел ntp.ubuntu.com представляет собой не отдельный сервер, а запись в DNS, перенаправляющую запрос к другим узлам, например:

~ $ ping ntp.ubuntu.com
PING ntp.ubuntu.com (91.189.94.4) 56(84) bytes of data.
64 bytes from juniperberry.canonical.com (91.189.94.4): icmp_seq=1 ttl=46 time=110 ms

В результате указанного выше запроса ping было осуществлено обращение к узлу juniperberry.canonical.com, расположенному в Великобритании:


Поэтому, если Вы желаете обращаться к серверу точного времени, расположенному поближе, то измените в файлах /etc/default/ntpdate и /etc/ntp.conf запись ntp.ubuntu.com на другую.

NTP будет держать время в синхронизированном состоянии. Этот процесс можно наблюдать при помощи команды NTP Query (ntpq). Данная команда с ключом -p (ntpq -p) выводит список источников времени с их характеристиками (остальные параметры команды в man ntpq).


remote – имя удаленного NTP-сервера. Если указать ключ -n, вы получите IP-адреса серверов вместо имён.

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

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

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

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

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

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

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


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

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

В моём случае оказалось, что время синхронизируется от NTP-сервера регионального поставщика услуг Интернет.

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

Для ручной синхронизации времени используется команда sudo ntpdate с указанием узла NTP, например, sudo ntpdate time.nist.gov

Проверить доступность NTP сервера можно командой ntpdate -d

Пример. В DNS обращение к серверу time.net.org сопоставлено обращением к timeserver.ru  

ntpdate -d time.net.org
31 Mar 18:49:14 ntpdate[8816]: ntpdate 4.2.8p4@1.3265-o Wed Oct  5 12:34:47 UTC 2016 (1)
Looking for host time.net.org and service ntp
46.46.160.235 reversed to time.net.org
host found : time.net.org
transmit(46.46.160.235)
receive(46.46.160.235)
transmit(46.46.160.235)
receive(46.46.160.235)
transmit(46.46.160.235)
receive(46.46.160.235)
transmit(46.46.160.235)
receive(46.46.160.235)
server 46.46.160.235, port 123
stratum 2, precision -23, leap 00, trust 000
refid [46.46.160.235], delay 0.07254, dispersion 0.00015
transmitted 4, in filter 4
reference time:    dc88f624.b07d913b  Fri, Mar 31 2017 18:37:08.689
originate timestamp: dc88f900.f425ba7e  Fri, Mar 31 2017 18:49:20.953
transmit timestamp:  dc88f900.ef0f5101  Fri, Mar 31 2017 18:49:20.933
filter delay:  0.07271  0.07426  0.07361  0.07254
         0.00000  0.00000  0.00000  0.00000
filter offset: -0.00367 -0.00422 -0.00328 -0.00364
         0.000000 0.000000 0.000000 0.000000
delay 0.07254, dispersion 0.00015
offset -0.003641

31 Mar 18:49:20 ntpdate[8816]: adjust time server 46.46.160.235 offset -0.003641 sec


Если вдруг возникает необходимость изменения часов BIOS, то, как указано на одном из сайтов, используется команда:

sudo ntpdate pool.ntp.org && sudo hwclock --systohc && sudo hwclock --adjust

Эта команда сначала синхронизирует с ntpdate системные часы, а затем с помощью команды hwclock --systohc синхронизируются часы BIOS.

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

31 Mar 21:31:15 ntpdate[2273]: the NTP socket is in use, exiting

Если у Вас в системе работает iptables, то целесообразно внести следующие правила (источник):

iptables -A output -p udp -s 192.168.1.1 --sport 1024:65535 -d 0/0  --dport 123 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A input -p udp -s 0/0 --sport 123 -d 192.168.1.1  --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

По сравнению с реализацией синхронизации времени в Windows 7, которая включается триггером планировщика однократно и после по умолчанию запускается раз в неделю, синхронизация времени в Linux Mint реализована по принципу "установил и забыл" и вообще не требует какого-либо вмешательства в свою работу со стороны пользователя. По данному критерию сравнения мне хотелось Windows 7 "прикончить сразу", но для решения частного вопроса пришлось, всё-таки, помучиться.


Комментариев нет:

Отправить комментарий