web-dev-qa-db-ja.com

NTPを使用してクロックを強制的に更新する方法は?

バッテリバックアップRTCがないARMベースの組み込みシステムでUbuntuを実行しています。ウェイクアップ時間は1970年のどこかです。したがって、NTPサービスを使用して、時間を現在の時間に更新します。

/etc/rc.localファイルに次の行を追加しました。

Sudo ntpdate -s time.nist.gov

ただし、起動後、時間が更新されるまで数分かかります。その間、tarおよびmakeを効果的に操作できません。

特定の時間にクロックを強制的に更新するにはどうすればよいですか?


PDATE 1:以下は(EricとStephanに感謝)コマンドラインからは正常に動作しますが、/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

何が間違っていますか?


PDATE 2:最初の更新に応答して出されたいくつかの提案に従ってみましたが、実際に必要な仕事をするものは何もないようです。ここに私が試したものがあります:

  1. サーバーをus.pool.ntp.orgに置き換えます
  2. プログラムへの明示的なパスを使用する
  3. ntpサービスを完全に削除し、Sudo ntpdate ...rc.localだけを残します
  4. rc.localの上記のコマンドからSudoを削除します

上記を使用すると、マシンはまだ1970年に起動します。ただし、(ssh経由で)コマンドラインからこれを実行すると、ntpdateを呼び出すとすぐにクロックが更新されます。

最後にしたことは、rc.localからそれを削除し、.bashrcファイルでntpdateを呼び出すことでした。これにより、期待どおりにクロックが更新され、コマンドプロンプトが使用可能になると、実際の現在時刻が取得されます。

ただし、、これは、マシンの電源が入っていて、ユーザーがログインしていない場合、時間が更新されないことを意味します。もちろん、ntpサービスを再インストールして、少なくともクロックが起動から数分以内に更新されるようにすることはできますが、その後は1に戻ります。

rc.localntpdateコマンドを配置しても必要なタスクが実行されないのに、.bashrcで正常に機能する理由はありますか?

373
ysap

おそらくntpサービスが実行されているため、ntpdateがソケット(ポート123 UDP)を開けず、ntpサーバーに接続できません。

コマンドラインから試してください:

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

これを/etc/rc.localに配置する場合は、次を使用します。

( /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 )&
321
Eric Carvalho

Ntpdate( 非推奨 )の代わりに、

Sudo service ntp stop
Sudo ntpd -gq
Sudo service ntp start

-gqは、オフセットに関係なく時刻を修正し(g)、時刻の設定後すぐに終了する(q)ようにntpデーモンに指示します。

479

Sntpを使用して、すぐに時刻を設定します。例えば:

Sudo sntp -s 24.56.178.140

-sの後の数値は、任意のntpタイムサーバーで、FtのNISTです。コロラド州コリンズ。

62
Guest

他の人が指摘しているように、最良の解決策は、デフォルトで1000秒であるパニックしきい値を無視するようntpdに指示することです。パニックしきい値は、次の2つの方法のいずれかで構成できます。

  • /etc/default/ntpを編集し、-gオプションが存在することを確認します。
  • /etc/ntp.confを編集し、tinker panic 0を先頭に配置します

これまでのところ、これは基本的に他の人が推奨していることですが、もう1つステップを踏む必要があります。 fake-hwclockプログラムをインストールします。

# 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.

Fake-hwclockがインストールされていると、マシンは再び1970年になったとは思わなくなります。マシンが起動すると、クロックは最後のリブート/シャットダウン中にfake-hwclockが書き込んだタイムスタンプに設定されます。これは、起動時にネットワークの問題が発生した場合に、ある程度正しいクロックを使用できることを意味します。

40
dfc

ntpdateは、net dameonとは異なるプログラムです。 ntpdがそのソケットで実行されているため、NTPDateはおそらくブート時にエラーになります。

コマンドラインから、実行します

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

また、ntpdをすべて一緒にアンインストールし(apt-get remove ntp)、cronスクリプトを追加して、1時間ごとにntpdateを使用することもできます。

更新

このシステムでは、ntpサービスにはおそらく意味のある値がないため、最初に削除してください。

# Sudo apt-get remove ntp

次のコマンドを追加します。

ntpdate -sb time.nist.gov

/etc/rclocal

リブート。その時点で良いはずです。

13
Stephan
rdate -s tick.greyware.com

あなたがしたいことが時計を一度設定するだけなら、簡単です

10
batflaps

timedatectl(systemdサービスユニット)を使用して時間を設定します。 ntpは非推奨です。

Sudo systemctl restart systemd-timesyncd.service

journalctl -xe | tailでログを読んで、更新された時刻を確認できます

参照

10
xiaoyifang

Debian/Mint/Ubuntu(または他のDebian派生)システムでこれを行う正しい方法は、

NTPD_OPTS="-g"

ファイル内

/etc/default/ntp

これにより、ntpdが/etc/init.d/ntpスクリプトから起動されるときに、「-g」オプションで実行されます。

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

ハードウェアRTCがないため、起動時にシステム時間が1970年1月1日である場合など、1000秒を超えるとntpdがシステム時間を修正できるようにします。

7
J G Miller

tlsdate は、TLSを使用してリモートサーバーに安全に接続し、安全なハンドシェイクからリモート時間を抽出することにより、ローカルクロックを設定します。 ntpdateとは異なり、tlsdateは、リモートHTTPSまたはTLS対応サービスへの接続などにTCPを使用し、悪意のある時間情報を提供しようとする敵からの保護を提供します。

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

-bオプションを使用して時間をステップしてみてください。

4
Cry Havok

現在、Ubuntuベースのシステムの中には、デフォルトでNTPサービスを使用しないものがあることに注意してください。私のLinux Mint 19(Ubuntu 18.04)マシンでは、systemd-timesyncdで時間を管理しています。

同期が失われた後に最新の時刻を取得するには、実行するだけです

Sudo systemctl restart systemd-timesyncd

15.04以降、Ubuntuはデフォルトでsystemdを使用します。したがって、時間のような重要なシステムはsystemdによって管理されます。システムが使用しているサービスを見つけるには、次のように実行します

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

16.04のTechJSでは、サービスはntpでした。 Ubuntu 18.04(Mint 19)上の私にとって、サービスはsystemd-timesyncdです。興味深いことに、所有している16.04サーバーにログインし、systemd-timesyncdも使用しています。

4

まあ、

Raspberry Piでrwbian(debian wheezy)を実行していますが、これにはhwclockがありません。ちょっとしたスクリプトを書いて、インターネットインターフェースが立ち上がった後に実行するのが便利だと思いました。そのため、ネットワークが利用可能になった瞬間に時計が更新されると確信しています。

最初に、実行してntpdateパッケージがあることを確認します

Sudo apt-get update
Sudo apt-get install ntpdate

以下を/etc/network/interfacesに追加する必要があります(確かにeth0は単なる例です):

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

そして、/usr/local/sbin/update-time.shで次のスクリプトを作成します(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
2
art.shutter

Systemdを使用している場合は、次のコマンドを使用できます。

Sudo systemctl restart ntp
# or
Sudo systemctl restart ntp.service

そして、時間は約10〜15秒以内に更新されます。
ubuntu mate 16.04でテスト済み

1
AmirHossein

システムが同期するまでにかかる時間を待つ余裕がある場合は、ntp-waitコマンドを使用できます。

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
Anonymous

Ntpdアルゴリズムは、[絶対値]のサンプルオフセットが128ミリ秒未満でない間隔が900を超えない限り、128ミリ秒を超えるサンプルオフセットを破棄します。その後の最初のサンプルは、オフセットに関係なく、指定された時間にクロックをステップします。実際には、これにより、クロックが誤ってステップされた場合の誤警報率が、発生率が非常に低くなります。

通常、オフセットがサニティ制限(デフォルトでは1000秒)を超えると、ntpdは終了します。これは、-gオプションでオフにできます。

-g通常、オフセットが健全性の制限(デフォルトでは1000秒)を超えると、ntpdは終了します。健全性制限がゼロに設定されている場合、健全性チェックは実行されず、オフセットは許容されます。このオプションは制限を無効にし、制限なしで任意の値に時間を設定できます。ただし、これは一度しか発生しません。その後、制限を超えるとntpdは終了します。このオプションは、-qオプションと一緒に使用できます。

両方から http://doc.ntp.org/4.1.0/ntpd.htm

-ジョナサン・ナターレ

1
Jonathzen

ntpdおよびntpdateは、デフォルトで制限付きポート(UDP 123)を使用して実行されます。ファイアウォールの内側にいる場合、ntpdは機能しませんが、ntpdate-uオプションで機能します。たとえば、ntpdate -u 0.ubuntu.pool.ntp.orgまたはntpdate -u time.nist.govは両方とも正常に動作するはずです。

0
G. N. DeSouza