Pull to refresh

Настройка синхронизации времени по протоколу PTP (IEE 1588) на RHEL 6

Нужно было мне синхронизировать время между двух серверов и сделать это точнее, чем NTP. Погуглив немного нашел, что какое-то время назад начали разрабатывать стандарт, который позволяет синхронизировать время до наносекунд. Подробнее о том, как он это делает можно почитать на сайте IEE 1588, а в данной статье расскажу как я решил поставленную задачу.

Итак, есть два сервера c CentOS 6.2. Они соединены по интерфейсу eth1 проводом между собой.

Есть две версии пакета PTPd: версия 1 и версия 2. Как говорят люди, разобравшиеся с этим получше, вторая версия хоть и менее стабильна, но работает лучше чем первая. Eё и будем устанавливать.

Компиляция и инсталляция

Качаем последнюю стабильную версию c Sourceforge.

Распаковываем и компилируем:
tar xzfv ptpd-2.2.0.tar.gz
cd ptpd-2.2.0/src
make

Копируем получившийся бинарник в /usr/bin:
sudo cp ptpd2 /usr/bin/ptpd2


Стартап-скрипты

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

Для этого создаём в папке /etc/rc.d/init.d файл ptpd2 с содержанием:
#
# ptpd Precision Time Protocol daemon
#
# chkconfig: - 30 70
# description: ptpd implements a sub ms time coordination of LAN connected computers implementing IEEE 1588

# Source function library.
. /etc/rc.d/init.d/functions

exec="/usr/bin/ptpd2"
prog="ptpd2"

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

lockfile=/var/lock/subsys/$prog

start() {
[ -x $exec ] || exit 5
echo -n $"Starting $prog: "
# if not running, start it up here, usually something like "daemon $exec"
daemon --user root $exec $PTPDARGS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
stop
start
}

reload() {
restart
}

force_reload() {
restart
}

rh_status() {
# run checks to determine if the service is running or use generic status
status $prog
}

rh_status_q() {
rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
exit 2
esac
exit $?


и создаём второй файл, в котором будем записывать настройки для ptpd — /etc/sysconfig/ptpd2, выбирая на сервере серверные, на клиенте, соответственно, клиентские опции.

#
# PTPD Configuration
#

# PTPDARGS="-D -b eth1 -g -f /var/log/ptpd.log" #client
# PTPDARGS="-D -b eth1 -G -y 0 -f /var/log/ptpd.log" #server

В опциях для сервера используем -G если хотим синхронизировать время еще и к NTP, или -W, если не хотим.

теперь можно сделать магические движения в виде:
sudo chmod +x /usr/bin/ptpd2 /etc/rc.d/init.d/ptpd2
sudo /sbin/chkconfig --level 35 ptpd2 on


Запуск

sudo service ptpd2 start

Теперь можно посмотреть в лог-файле как же синхронизируются наши сервера.
tail -f /var/log/ptpd.log

На сервере в логе будет практически чисто, только четыре строчки:
# Timestamp, State, Clock ID, One Way Delay, Offset From Master, Slave to Master, Master to Slave, Drift, Last packet Received
2012-05-27 11:15:37.454679, init
2012-05-27 11:15:37.519523, lstn_init 1
2012-05-27 11:15:49.455987, mst 000f53fffe1603a4(unknown)/00

Собственно последняя строчка нам и сообщает, что сервер работает как мастер-часы.

На втором сервере, slave, в логах больше информации:

# Timestamp, State, Clock ID, One Way Delay, Offset From Master, Slave to Master, Master to Slave, Drift, Last packet Received
2012-05-27 11:23:09.597337, init
2012-05-27 11:23:09.662054, lstn_init 1
2012-05-27 11:23:11.457991, slv 000f53fffe1603a4(unknown)/01, 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0, I
2012-05-27 11:23:12.457958, slv 000f53fffe1603a4(unknown)/01, 0.000000000, 0.000955037, 0.000000000, 0.001910074, 955, S
...
2012-05-27 11:34:03.456034, slv 000f53fffe1603a4(unknown)/01, 0.000009500, -0.000007434, 0.000017720, 0.000001381, -20122, S
2012-05-27 11:34:03.458163, slv 000f53fffe1603a4(unknown)/01, 0.000009502, -0.000007434, 0.000017399, 0.000001381, -20122, D
...
2012-05-27 11:54:04.456009, slv 000f53fffe1603a4(unknown)/01, 0.000009031, -0.000001195, 0.000011271, 0.000007951, -19783, S
2012-05-27 11:54:05.158050, slv 000f53fffe1603a4(unknown)/01, 0.000009039, -0.000001195, 0.000011714, 0.000007951, -19783, D


Источники:
1. Bug tracker rhel — там зарождалось создание пакета ptpd для Redhat, и оттуда я вытащил init.d скрипт.
2. Мой тред на ServerFault
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.