После "мучений" с пониманием вопроса о синхронизации времени в 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 "прикончить сразу", но для решения частного вопроса пришлось, всё-таки, помучиться.
Сразу отмечу, что только в одном месте получить интересующую информацию было тяжело. Зачастую найденные публикации содержали либо избыточные для меня сведения, либо были устаревшие, либо относились к дистрибутивам других пакетных баз. Ниже кратко изложу то, что будет в дальнейшем являться в некотором роде "шпаргалкой" по объявленному в качестве темы публикации вопросу. Необязательная поясняющая информация даётся курсивом.
Итак, 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 "прикончить сразу", но для решения частного вопроса пришлось, всё-таки, помучиться.
Комментариев нет:
Отправить комментарий