Ntp kullanarak bir saat güncellemesi nasıl yapılır?


377

Batarya destekli RTC'ye sahip olmayan ARM tabanlı bir gömülü sistemde Ubuntu kullanıyorum. Uyanma süresi 1970 yılında bir yerlerdedir. Bu yüzden, saati şimdiki zamana güncellemek için NTP servisini kullanıyorum.

Aşağıdaki satırı /etc/rc.localdosyaya ekledim :

sudo ntpdate -s time.nist.gov

Ancak, başlangıçtan sonra, süre güncellenene kadar birkaç dakika sürüyor, bu süre zarfında etkin bir şekilde çalışamıyorum tarve make.

Herhangi bir zamanda bir saat güncellemesini nasıl zorlayabilirim?


GÜNCELLEME 1: Aşağıdaki (Eric ve Stephan sayesinde) komut satırında iyi çalışıyor, ancak kullanıldığında saati güncelleyemiyor /etc/rc.local:

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; date
Thu Jan  1 00:00:58 UTC 1970
 * Stopping NTP server ntpd     [ OK ] 
 * Starting NTP server          [ OK ] 
Thu Feb 14 18:52:21 UTC 2013

Neyi yanlış yapıyorum?


GÜNCELLEME 2: İlk güncellemeye cevap olarak gelen birkaç öneriyi izlemeye çalıştım, ancak hiçbir şey aslında işi gerektiği gibi yapmıyor gibi görünüyor. İşte denedim:

  1. Sunucuyu yerine us.pool.ntp.org
  2. Programlara açık yollar kullan
  3. Kaldır ntphizmeti tamamıyla ve sadece ayrılmak sudo ntpdate ...içinderc.local
  4. sudoYukarıdaki komuttan şunu kaldırın .rc.local

Yukarıdakileri kullanarak, makine 1970'de başlar. Ancak, bunu bir kez giriş yaptıktan sonra komut satırından (via ssh) yaparken, çağırdığım anda saat güncellenir ntpdate.

Yaptığım son şey o kaldırmak oldu rc.localbir çağrı ve koyun ntpdatebenim de .bashrcdosyaya. Bu, saati beklendiği gibi günceller ve komut istemi kullanılabilir olduğunda gerçek zamanı bulurum.

Ancak , bu, makine açıksa ve hiçbir kullanıcı giriş yapmadıysa, zamanın hiçbir zaman güncelleme almadığı anlamına gelir. Tabii ki, ntpservisi yeniden yükleyebilirim, böylece en azından saat başlangıçtan birkaç dakika sonra güncellenir, ancak daha sonra tekrar 1. kareye döndük.

Öyleyse, ntpdatekomutu rc.localyerine getirmenin gerekli işi yapmamasının bir nedeni var .bashrcmı?


2
[burada] [1] 'den: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615

4
ntpdate üzerindeki '-b' bayrağına dikkat edin. Ntpdate's man sayfasından: "adjtime () sistem çağrısını kullanarak çevrilmiş (varsayılan) yerine settimeofday () sistem çağrısını kullanarak adım atmaya zorlayın. Önyükleme sırasında bir başlangıç ​​dosyasından çağrıldığında bu seçenek kullanılmalıdır." Aşağıdaki cevapların birçoğu bunu içermez ve belki de işleri işe almadaki sorunun bir parçası olabilir. '-B' işaretinin, 128 ms'den büyük uzaklıktaki ofsetlerin varsayılan 'dönüş' mekanizmasını kullanarak saatlerce zaman harcayabileceğinden bahsettiğini düşünün
Matt S.

sudo/Etc/rc.locale dosyalarında kullanmaya gerek yoktur .. hepsi zaten root olarak çalıştırılır.
1

Yanıtlar:


325

Muhtemelen ntphizmet çalışıyor, bu yüzden ntpdatesoketi açamıyor (port 123 UDP) ve ntp sunucusuna bağlanamıyor.

Komut satırından deneyin:

sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start

Bunu koymak istiyorsanız /etc/rc.localaşağıdakileri kullanın:

( /etc/init.d/ntp stop
until ping -nq -c3 8.8.8.8; do
   echo "Waiting for network..."
done
ntpdate -s time.nist.gov
/etc/init.d/ntp start )&

Teşekkürler. Açık yollara neden ihtiyaç duyduğunuzu açıklayabilir misiniz?
00’de

1
Gerçekten bilmiyorum :-) servicerc.local ve cron'dan çalıştırmaya çalışırken bir kez sorun yaşadım ancak bunun yerine /etc/init.d/xxx kullanarak düzeltmeyi başardım. Aslında tam yolunu vermek zorunda olmadığınızı düşünüyorum ntpdate, doğru dosyanın bulunacağından emin olmak için komut dosyalarında tam yolları kullanmayı seviyorum.
Eric Carvalho

2
Tamam, görünüşe göre sorun buydu. Şimdi ağ bağlantısı kurulur kurulmaz saat güncelleniyor. Teşekkürler.
13'de

3
us.pool.ntp.orgDaha duyarlı olduğunu öğrendim .
01

7
Bu -useçenekle, ntp servisini durdurmanıza gerek yoktur:sudo ntpdate -u time.nist.gov
Edward Anderson

486

Ntpdate ( kullanımdan kaldırılmış ) yerine,

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

-gqBakılmaksızın ofset (saatini düzeltmek için NTP söyler g(hemen) ve çıkış qzamanını ayarladıktan sonra).


3
Teşekkürler. Hala bu komuttan sonra 1970 gösteriyor (s / sudo). ntpdManpage okurken , bunun bir güncellemeyi nasıl zorladığından emin değilim?
18'de

12
"-Q" seçeneği NTP arka planına başlatılmasını, saati ayarlamasını ve hemen çıkmasını söyler. "-G" seçeneği 1000 saniyeden daha büyük zaman farklarını düzeltmeyi sağlar. Uzun vadede, NTP arka planını her zaman çalışacak şekilde yapılandırmanız gerekir.
tgharold

35
Bu cevap en tepeye gitmeli, çünkü doğru: ntpdate kullanımdan kaldırılmış ve kurulumu kötü bir fikir çünkü ntp ile çakışıyor. Saat kapalıysa, bu manuel adımı yapmanız gerekir, aksi takdirde ntp saatinizi değiştirmez ve nedenini size söylemez.
Liam,

31
Benim sudo ntpd -gqiçin çıkış yok! 14.10 yaşıyorum ve devam etmek için CTRL + C tuşlarına basmam gerekiyor ... veya ne kadar sürmesi gerekiyor?
Yanick Rochon

5
Bilginize, sistemimde (CentOS 6.6), iki örneğini değiştirmem sudo service ntp...gerekiyordu sudo service ntpd....
rinogo

63

Hemen saati ayarlamak için sntp kullanın. Örneğin:

sudo sntp -s 24.56.178.140

-S sonrası sayılar herhangi bir ntp zaman sunucusu olabilir, biri Ft. Collins, Colorado.


1
İşe yaradı! +1
CappY

7
Bu, "sudo ntpd -gq" olmadığında işe yaradı.
Matt White

Kaç kez bu cevabı aramaya geldiğimi bilmiyorum. Her zaman işe yarar.
Kaos,

1
sntp paketi bulunamıyor mu?
Tapınak

1
apt-get install sntp / yum install sntp (evet, CentOS, RedHat, fedore'da da çalışır)
ndemou

40

Diğerlerinin de belirttiği gibi, en iyi çözüm ntpd'ye varsayılan olarak 1000 saniye olan panik eşiğini yoksayması talimatını vermektir. Panik eşiğini iki yoldan biriyle yapılandırabilirsiniz:

  • /etc/default/ntp-g seçeneğinin mevcut olduğundan emin olun ve düzenleyin .
  • /etc/ntp.conf dosyasını düzenleyin ve tinker panic 0en üste yerleştirin

Şimdiye kadar bu aslında başkalarının önerdiği şeydi ancak atmanız gereken bir adım daha var. Sahte-hwclock programını kurun:

# apt-get install fake-hwclock


fake-hwclock: Save/restore system clock on machines without working RTC hardware

 Some machines don't have a working realtime clock (RTC) unit, or no
 driver for the hardware that does exist. fake-hwclock is a simple set
 of scripts to save the kernel's current clock periodically (including
 at shutdown) and restore it at boot so that the system clock keeps at
 least close to realtime. This will stop some of the problems that may
 be caused by a system believing it has travelled in time back to
 1970, such as needing to perform filesystem checks at every boot.

 On top of this, use of NTP is still recommended to deal with the fake
 clock "drifting" while the hardware is halted or rebooting.

Sahte hwclock takılıyken, makineniz 1970 olduğunu düşünerek çalışmaya başlamaz. Makineniz çalışmaya başladığında saatini son yeniden başlatma / kapatma sırasında yazılan sahte-saat yönünde ayarlayacaktır. Bu, önyükleme yaparken ağ sorunları olması durumunda bir miktar doğru saatin olabileceği anlamına gelir.


1
-g(komut satırı, ben yok benim için hiçbir şey yapmak gibiydi /etc/default/ntp), ama eklemeden tinker panic 0için ntp.confçalıştı
Dave Cousineau

@Sahuagin Size standart dışı bir ntp paketinden başka ne diyeceğimi bilemiyorum. / etc / default / ntp, Ubuntu'dan gelen paketin bir parçasıdır: Packages.ubuntu.com/xenial/amd64/ntp/filelist ve -g hatırlayabildiğim kadar uzun bir seçenek oldu.
dfc

üzgünüm sanırım Ubuntu'da değilim ve yorum yapmadan önce biraz daha düşünmeliydim. tinker panic 0kesinlikle olsa çalışmış gibi görünüyor.
Dave Cousineau,

13

ntpdate, ağdaki lanetten farklı bir programdır. NTPDate, ntpd bu sokette çalıştığı için önyüklemede muhtemelen hata veriyordur.

Komut satırından çalıştır

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

Ayrıca ntpd'yi hep birlikte kaldırabilir (apt-get remove ntp) ve her saat başı ntpdate kullanmak için bir cron komut dosyası ekleyebilirsiniz.

GÜNCELLEME

Ntp servisi bu sistemde muhtemelen sizin için anlamlı bir değere sahip olmayacağından, önce bunu kaldırın.

# sudo apt-get remove ntp

Şimdi komutu ekleyin:

ntpdate -sb time.nist.gov

için /etc/rclocal

Yeniden Başlatma. Bu noktada iyi olmalı.


Cevap güncellendi.
Stephan,

1
Ntpdate aşamalı değil mi? Ayrıca, bunu doğru anlarsam, hizmet yerel saatin sunucunun saatiyle eşitlenmesini çalıştırır ve korur - böylece kayma sınırlanır. Ntp'yi çıkarırsanız ve ntpdate'i bir kez çalıştırırsanız, makine uzun süre açık kaldığında saatin sürüklenmesinden etkilenmez mi?
07'de

Stephan, lütfen sorunun 2 numaralı güncellemesine bakınız.
00’de

3
Evet, ntpdate aşamalı değil. "Ntpd -q" kullanımı tercih edilir (her iki değişken de ntpd'nin önce durdurulmasını gerektirir).
tgharold

11

Kullanım timedatectlsüresini ayarlamak için (systemd hizmet birimi). ntpkullanımdan kaldırıldı.

sudo systemctl restart systemd-timesyncd.service

Günlükleri okurken güncellendiğin zamanını kontrol edebilirsiniz. journalctl -xe | tail

Referans


Bu 19.04 Ubuntu'da çalıştı. Teşekkürler!
krubo

10
rdate -s tick.greyware.com

Yapmak istediğiniz tek şey saati bir kez ayarlamak ise, basit


Teşekkürler. Şu anda bu komutu kontrol etmek için sistemim yok, ancak sorudaki tartışmayı ve kabul edilen cevabı izlerseniz, sorunun saat güncelleme komutunu çalıştırırken ağın kullanılamaması olduğunu göreceksiniz.
Şubat'ta

Bu Ahududu Pi'mde zaman senkronizasyonu sorununu çözdü. Teşekkür ederim.
Oliver Spryn

7

Bunu bir Debian / Nane / Ubuntu (veya diğer Debian türevi) sisteminde yapmanın doğru yolu, hattın bulunmasıdır.

NTPD_OPTS="-g"

dosyanın içinde

/etc/default/ntp

Bu, ntpd /etc/init.d/ntp betiğinden başlatıldığında, "-g" seçeneğiyle, viz ile çalışmasını sağlar.

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

ntpd'nin 1000 s'den fazla olduğunda sistem saatini düzeltmesine izin vermek, örneğin sistem RTC olmadığı için sistem zamanı 1 Ocak 1970 iken.


Ben zaten var, ama yine de saat 11: 00'de olması gereken NY'de sabah 3'ü yazıyor.
chovy

Ayrıca zaten tam olarak bu çizgiyi girdim /etc/default/ntp, fakat zaman senkronize edilmedi.
Dawid Ferenczy Rogožan 10:14

5

tlsdateyerel saati TLS ile uzak sunuculara güvenli bir şekilde bağlanarak ve uzaktaki zamanı güvenli el sıkışmadan çıkararak ayarlar. Aksine ntpdate, tlsdateörneğin uzak bir HTTPS veya TLS özellikli bir servise bağlanmak için TCP kullanır ve size kötü niyetli zaman bilgisi beslemeye çalışan rakiplere karşı bir miktar koruma sağlar.

$ tlsdate -V -n -H encrypted.google.com

5

Bazı geçerli Ubuntu tabanlı sistemlerin, varsayılan olarak NTP servisini bile kullanmadığını unutmayın. Linux Mint 19 (Ubuntu 18.04) makinemde zaman tuttu systemd-timesyncd.

Böylece senkronizasyonu kaybettikten sonra güncel bir zaman elde etmek için sadece koşuyorum

sudo systemctl restart systemd-timesyncd

15.04'ten beri Ubuntu varsayılan olarak systemd kullanır. Bu nedenle zaman gibi kritik sistemler sistemd üzerinden yönetilir. Sisteminizin hangi hizmeti kullandığını bulmak için

systemctl list-unit-files | grep -E 'ntp|timesyncd'

16.04 tarihinde TechJS için servis yapıldı ntp. Ubuntu 18.04'te (Nane 19) kendim için hizmettir systemd-timesyncd. İlginç bir şekilde, sahip olduğum bir 16.04 sunucusuna giriş yaptım ve kullandı systemd-timesyncd.


Teşekkürler. Soruyu göndermekten bu yana uzun zaman geçti ve test için kullanılabilecek bir sistemim yok, ancak cevabınızın @TechJS'den ne kadar farklı olduğunu, özellikle önerdiğiniz komutun biraz farklı olduğu konusunda ayrıntılı bilgi verebilir misiniz?
17'de

Ha teşekkürler. Size bir cevaptı, aynı zamanda gelecekte kendimi burada daha fazla bilgi olmadan (kendim gibi) bulan kişi için buluyordu. Cevabımı nasıl elde ettiğim konusunda daha spesifik olması için cevabımı güncelledim.
Aaron Chamberlain

4

-bSüreyi hızlandırmak için seçeneği kullanmayı deneyin .


2
Komut satırından çalışırken, şu yanıtı alıyorum: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Ancak, bunu daha önce de denediğimi düşünüyorum rc.localama yardımcı olmadı.
00’de

3
ntpdate -b <ipaddress>
Koşmadan

2

İyi,

Ahududu pi'mde bir ahududu (debian wheezy) kullanıyorum. Küçük bir senaryo yazmayı ve internet arayüzüm açıldıktan sonra çalıştırmayı kullanışlı buldum, böylece ağın kullanıma girdiği anda saat güncellenir.

İlk önce ntpdatepaketin çalıştığını kontrol edin.

sudo apt-get update
sudo apt-get install ntpdate

Şunlara aşağıdakileri eklemeniz gerekir /etc/network/interfaces(elbette eth0burada sadece bir örnek):

auto eth0
    iface eth0 inet dhcp
    post-up /usr/local/sbin/update-time.sh

Ve aşağıdaki betiği de oluşturun /usr/local/sbin/update-time.sh(tarafından çalıştırılabilir hale getirmeyi unutmayın chmod):

#!/bin/bash
# This script checks if the ntp process is running, stops it, updates the system time, starts it again

ps cax | grep -c ntpd > /dev/null
onoff=$?
if [ "$onoff" -gt 0 ]; then
    echo "stopping ntpd..."
    service ntp stop
    echo "ntpd stopped"
else
    echo "ntpd not running, ready to update the date"
fi


isinstalled=$(dpkg-query -l | grep -c ntpdate)
if [ "$isinstalled" -gt 0 ]; then
    ntpdate -t 3 -s ntp4.stratum2.ru
    echo "date and time update executed"
else
    echo "ntpdate package not installed, can't update using ntp"
fi

echo "restarting ntpd..."
service ntp start 
echo "ntpd running"
echo "printing current date and time:"
date

exit

1

Ntpd algoritmaları, [of] mutlak değerinin hiçbir değeri 128 ms'den az olmadığı zaman aralığının 900 saniyeyi geçmediği sürece, 128 ms'yi geçen örnek ofsetleri atar. Bundan sonraki ilk örnek, ofset ne olursa olsun, saati belirtilen zamana kadar ayarlar. Uygulamada bu, saatin hatalı bir şekilde düşük bir insidansa adım attığı yanlış alarm oranını azaltır.

Normalde, ofset, varsayılan olarak 1000 s olan akıl sağlığı sınırını aşarsa ntpd çıkar. Bu, -g seçeneğiyle kapatılabilir:

-g Normalde eğer ofset varsayılan olarak 1000 s olan akıl sınırını aşıyorsa ntpd çıkar. Akıl sağlığı sınırı sıfıra ayarlanırsa, akıl kontrolü yapılmaz ve herhangi bir ofset kabul edilebilir. Bu seçenek sınırı geçersiz kılar ve sürenin kısıtlama olmadan herhangi bir değere ayarlanmasına izin verir; Ancak, bu sadece bir kez olabilir. Bundan sonra, sınır aşıldığında ntpd çıkacaktır. Bu seçenek -q seçeneğiyle birlikte kullanılabilir.

her ikisi de http://doc.ntp.org/4.1.0/ntpd.htm adresinden

-Jonathan Natale


1

Sisteminiz senkronize edilmeden önce ne kadar zaman alacağını beklemeye zaman ayıramazsanız, şu ntp-waitkomutu kullanabilirsiniz :

ntp-wait || exit -1 
# i believe this would exit the script if it fails, but not sure of ntp-wait return codes, learn this first.

echo Time is synced, go ahead with backup
tar
rsync etc.

1

Eğer sistemdeyseniz bu komutu kullanabilirsiniz:

sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service

Ve sonra zaman 10-15 saniye içinde güncellenir.
Ubuntu arkadaşı üzerinde test edildi 16.04


0

ntpdve ntpdatesınırlı bir bağlantı noktası kullanarak varsayılan olarak çalıştırın (UDP 123). Bir güvenlik duvarının arkasındaysanız ntpdasla çalışmayacak, ancak seçenekle ntpdateçalışabilir -u. Örneğin: ntpdate -u 0.ubuntu.pool.ntp.org veya ntpdate -u time.nist.govher ikisi de iyi çalışmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.