LINUX.ORG.RU

управление временем

 , , , ,


0

1

Есть железяка, у нее 3 источника времени:

1. Внутренние часы RTC 2. NTP 3. GPS-модуль.

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

Есть ntpd, который в состоянии это все обеспечить, но современному ntpd для адекватной работы необходимо чтобы достаточно точное время было изначально выставлено. Ситуацию усугубляет то, что на RTC может отсутствовать батарейка, а GPS может врать (выдавать неправильное время и неправильные данные, рапортуя, что все в порядке).

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

Запуск ntpd завязан на запуск pppd и запуск gpsd.

Хотелось бы найти красивое, не слишком костыльное решение по изначальной установке времени. По тому, что выдает GPS, можно очень точно диагностировать, прав он или нет, и он работает сразу, а шанс получить время по NTP будет только после поднятия pppd, и может пройти значительное время до этого факта.

Делал ли кто подобные архитектуры? Получалось ли что толковое?

★★★★★

Это именно девелопмент, не админство - тут надо писать софт какой-то... Если есть у кого решение без этого, или средствами systemd - это было бы мегакруто.

slapin ★★★★★ ()
Ответ на: комментарий от ABW

Дык стандартный ntpdate тоже лишен этого недостатка. Просто если бы только протокол NTP участвовал, и не было бы GPS, вопрос бы был кристально ясен. Но есть еще GPS. ntpd с ним хорошо работает, но не ntpdate :(

slapin ★★★★★ ()

GPS может врать (выдавать неправильное время и неправильные данные, рапортуя, что все в порядке).

не может, приемник всегда передает - он местооопределился/нашел достаточное количество спутников или нет

Хотелось бы найти красивое, не слишком костыльное решение по изначальной установке времени.

батарейку поставьте на RTC.

bakugan ()
Ответ на: комментарий от bakugan

ну, про GPS ты не прав:

1. Приемник может не выдавать фиксов. 2. Приемник может врать, что у него есть фикс, при этом выдавать левое время и левые координаты. Потому, что у него баги в прошивке. Это все воркэраундится софтом, но чтобы узнать, что данные неверные, надо знать, какие правильные.

В RTC батареек нет из-за разгильдяйства при монтаже/установке, но фиксить это, как всегда программерам, потому как гонять людей по удаленным объектам осень дорого..

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Потому, что у него баги в прошивке. Это все воркэраундится софтом, но чтобы узнать, что данные неверные, надо знать, какие правильные.

тогда проще выкинуть такой «источник» - как ему вообще можно доверять ?

В RTC батареек нет из-за разгильдяйства при монтаже/установке, но фиксить это, как всегда программерам,

у меня была похожая ситуация - я решал скриптами, сразу после поднятия ppp и перед запуском ntpd делал однократную синхронизацию с сервером времени, до тех пор пока не получал правильное время но у меня не было смысла грузить дальше систему пока нет правильного времени потому что сервисы нужно было запускать точно по времени.

bakugan ()

современному ntpd для адекватной работы необходимо чтобы достаточно точное время было изначально выставлено

вы искренне заблуждаетесь

zolden ★★★★★ ()
Ответ на: комментарий от zolden

просьба более аргументированно

про -g -q -x знаю, но это нивелирует надобность в ntpd, как в аккуратном поставщике времени - иначе ntpdate в cron'e и грубое выставление времени по gps было бы достаточным.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

тем более, требуют, чтобы время было в пределах 4 часов от валидного, что в общем делает их совсем бесполезными.

slapin ★★★★★ ()
Ответ на: комментарий от bakugan

Ага, найдите мне GPS, в котором нету багов? тут баг безобидный - лечится хард ресетом, и проявляется только если альманах забыли подпереть батарейкой, или при неправильной фазе луны. Детектится просто - дата на годы отстает от реалистичной.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Ага, найдите мне GPS, в котором нету багов?

Для этого существует сертификация - с одной стороны бред, но с другой стороны - то что он неправильное время отдает фактор меня лично мало еб.чий :) покупали его помоему ~ $1000

bakugan ()
Ответ на: комментарий от bakugan

Вы мне будете рассказывать.

GeoS I во все поля сертифицированный, а до энд оф лайф могильные баги так и не починили.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

GeoS I во все поля сертифицированный

В госррестре он есть ? если есть - ша епт, это навигационный _прибор_ и врать он не имеет права. У нас был какой-то российской разработки - специально не буду название искать чтобы не пиарить говноконторы - GPS/ГЛОНАСС.

bakugan ()
Ответ на: комментарий от bakugan

Ну, это все сказки для менеджеров. Ящик для кораблей, они возможно и неплохой разработали, только нахрен он никому не нужен.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Ну, это все сказки для менеджеров

Если вы такой умный реалист - чего же на форум пришли с вопросами которые в принципе ответа не имеют ? Правильный ответ вы и сами знаете - резервное питание на RTC, все остальное либо неоправданно дорого либо костыли.

bakugan ()
Ответ на: комментарий от true_admin

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

slapin ★★★★★ ()
Ответ на: комментарий от slapin

про -g -q -x знаю, но это нивелирует надобность в ntpd, как в аккуратном поставщике времени - иначе ntpdate в cron'e и грубое выставление времени по gps было бы достаточным.

в чём проблема при старте системы выставить время по ntpd скачком? Или сервер времени тоже сбоит и глючит и может выдавать время +- пара лет? :)

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

При старте системы gps есть, а сети нету. Сеть появляется позже. А как поднялась - можно и ntpdate дернуть. Просто алгоритм по шагам так и не родился :(

Еще как рассмотреть случаи, когда сети нету, а gps таки прочухался и стартанул нормально. Тут стейт-машина развесистая получается. Поэтому интересуют в первую очередь советы от тех, кто такое уже делал.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

копай в сторону того как понять что gps прочухался. Например, если дата далеко в будущем или наоборот в прошлом (раньше чем последня дата полученная через ntpdate) то значит фикса нет.

true_admin ★★★★★ ()
Ответ на: комментарий от zolden

Ну, /etc/init.d/ntp вряд ли интересен, запускается оно так:

/usr/bin/ntpd -p /var/run/ntp.pid -g

ntp.conf выглядит так:

# This is the most basic ntp configuration file
# The driftfile must remain in a place specific to this
# machine - it records the machine specific clock error
driftfile /etc/ntp.drift
# This obtains a random server which will be close
# (in IP terms) to the machine.  Add other servers
# as required, or change this.
server pool.ntp.org iburst dynamic
server pool.ntp.org iburst dynamic
server pool.ntp.org iburst dynamic

# Using local hardware clock as fallback
# Disable this when using ntpd -q -g -x as ntpdate or it will sync to itself
server 127.127.1.0
fudge 127.127.1.0 stratum 14
# Defining a default security setting
restrict default

server 127.127.28.0 prefer
fudge 127.127.28.0 time1 0.450 refid GPS

Но чем это поможет, я не знаю.

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Опять же, я говорю, что если время более-менее выставлено сначала, то счастье есть, ntpd работает как часы (ага).

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Ну, /etc/init.d/ntp вряд ли интересен

Там самый интересный момент, что первоначальная синхра делается через тот же ntpdate. Что кстати записано в step-tickers?
Я бы попробовал tinker panic 0 добавить в конфиг, раз у вас такая чехарда с расхождением.
Ну и внимательно раскурить документацию, у NTP она просто необъятная в плане вариативности опций, а конфиг у вас дефолтный по сути. Я бы начал с этого

zolden ★★★★★ ()
Ответ на: комментарий от zolden

tinker panic 0 конечно запустит ntpd при офигенном времени, но аджастить его он будет полгода. А иначе дисциплина ядра выключается, и вся затея теряет смысл.

А вот если его в режиме ntpdate с таким параметром запустить, было бы интересно, конечно... Попробую, спасибо за идею!

slapin ★★★★★ ()
Ответ на: комментарий от slapin

Но step-tickers же редхатоспецифичная фича.

/etc/init.d/ntp:

test -x /usr/bin/ntpd -a -r /etc/ntp.conf || exit 0
# rcS contains TICKADJ
test -r /etc/default/rcS && . /etc/default/rcS
# Functions to do individual actions
settick(){                        
# If TICKADJ is set we *must* adjust it before we start, because the
# driftfile relies on the correct setting                                                                                                           
                        test -n "$TICKADJ" -a -x /usr/bin/tickadj && {
                                echo -n "Setting tick to $TICKADJ: "
                                /usr/bin/tickadj "$TICKADJ"
                                echo "done"
                       }            
}
 startdaemon(){                             
                        # The -g option allows ntpd to step the time to correct it just
                        # once.  The daemon will exit if the clock drifts too much after
                        # this.  If ntpd seems to disappear after a while assume TICKADJ
                        # above is set to a totally incorrect value.
                        echo -n "Starting ntpd: "
                        start-stop-daemon --start -x /usr/bin/ntpd -- -p /var/run/ntp.pid "$@"
                        echo "done"           
                }                    
                stopdaemon(){                                                                                                                                               
                        echo -n "Stopping ntpd: "                                                                                                                           
                        start-stop-daemon --stop -p /var/run/ntp.pid                                                                                                        
                        echo "done"                                                                                                                                         
                }                                                                                                                                                           
                                                                                                                                                                            
                case "$1" in                                                                                                                                                
                  start)                                                                                                                                                    
                        settick                                                                                                                                             
                        startdaemon -g                                                                                                                                      
                        ;;             
                  stop)                     
                        stopdaemon                                                                                                                                          
                        ;;                                                                                                                                                  
                  force-reload)                                                                                                                                             
                        stopdaemon                                                                                                                                          
                        settick                                                                                                                                             
                        startdaemon -g                                                                                                                                      
                        ;;                                                                                                                                                  
                  restart)                                                                                                                                                  
                        # Don't reset the tick here                                                                                                                         
                        stopdaemon                                                                                                                                          
                        startdaemon -g                                                                                                                                      
                        ;;                                                                                                                                                  
                  reload)                                                                                                                                                   
                        # Must do this by hand, but don't do -g                                                                                                             
                        stopdaemon                                                                                                                                          
                        startdaemon                                                                                                                                         
                        ;;                                                                                                                                                  
                  *)                                                                                                                                                        
                        echo "Usage: ntpd { start | stop | restart | reload }" >&2                                                                                          
                        exit 1                                                                                                                                              
                        ;;                                                                                                                                                  
                esac                                                                                                                                                        
                                                                                                                                                                            
                exit 0

slapin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.