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


377

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

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

sudo ntpdate -s time.nist.gov

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

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


更新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

私は何を間違えていますか?


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

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

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

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

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

だから、ntpdateコマンドを配置してrc.localも必要なタスクが実行されないのに、それが.bashrcうまく機能する理由はありますか?


2
[こちら] [1]から: ntpdate -s ntp.ubuntu.com [1]:askubuntu.com/a/81301/130162
18446744073709551615

4
ntpdateの「-b」フラグに注意してください。ntpdateのマニュアルページから:「adjtime()システムコールを使用してスルー(デフォルト)するのではなく、settimeofday()システムコールを使用して時間をステップします。このオプションは、起動時に起動ファイルから呼び出されるときに使用する必要があります」以下の回答の多くにはそれが含まれておらず、おそらくそれは物事を機能させる際の問題の一部です。「-B」フラグは、それが128ミリ秒を超えるオフセットはデフォルトの「スルー」メカニズムを使用して同期する時間を取ることができることを言及することを考えてみましょう
マット・S.

sudo/etc/rc.localeファイルで使用する必要はありません。これらは既にrootとして実行されています。
ソレン

timedatectlしかし、askubuntu.com/questions/832646/...
nobar

回答:


325

おそらく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 )&

ありがとう。明示的なパスが必要な理由を説明してください。
ysap

1
よくわかりません。:-) servicerc.localとcronから実行しようとしたときに問題がありましたが、代わりに/etc/init.d/xxxを使用して修正できました。実際、に完全なパスを指定する必要はないと思いますntpdate。正しいファイルが見つかるようにするために、スクリプトで完全なパスを使用するのが好きです。
エリック

2
OK、これは明らかに問題でした。これで、ネットワーク接続が確立されるとすぐにクロックが更新されます。ありがとう。
ysap

3
us.pool.ntp.org応答性が高いことがわかりました。
ysap

7
では-uオプションで、あなたはNTPサービスを停止する必要はありません:sudo ntpdate -u time.nist.gov
エドワード・アンダーソン

486

ntpdate(廃止予定)の代わりに、

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

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


3
ありがとう。このコマンドの後でもまだ1970が表示されています(sudo付き)。ntpdマンページを読んで、これが更新を強制する方法がわかりませんか?
ysap

12
「-q」オプションは、NTPデーモンに起動、時間の設定、および即時終了を指示します。「-g」オプションを使用すると、1000秒を超える時間差を修正できます。長期的には、NTPデーモンが常に実行されるように設定する必要があります。
tgharold

35
この答えは正しいため、先頭に移動する必要があります。ntpdateは非推奨であり、ntpと競合するため、インストールすることはお勧めできません。時計がずれている場合は、この手動ステップを実行する必要があります。そうしないと、ntpは時計を変更せず、理由を通知しません。
リアム14

31
私にとっては、sudo ntpd -gq終了しません!14.10を使用していますが、続行するにはCTRL + Cを押す必要があります...または、どれくらい時間がかかりますか?
ヤニックロション

5
参考までに、私のシステム(CentOS 6.6)では、の2つのインスタンスを変更する必要がありsudo service ntp...ましたsudo service ntpd...
rinogo

63

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

sudo sntp -s 24.56.178.140

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


1
うまくいきました!+1
CappY

7
これは、「sudo ntpd -gq」が機能しなかったときに機能しました。
マットホワイト

何回この答えを探しに来たのかわかりません。毎回動作します。
カオス

1
パッケージsntpが見つかりませんか?
寺院

1
apt-getをインストールSNTP / yumをインストールSNTP(はい、それはあまりにもCentOSの、RedHatの、fedore上で動作)
ndemou

40

他の人が指摘しているように、最良の解決策は、デフォルトで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が書き込んだタイムスタンプにクロックが設定されます。これは、起動時にネットワークの問題が発生した場合に、ある程度正しいクロックを使用できることを意味します。


1
-g(コマンドラインでは、私は持っていない/etc/default/ntp)私には何もしないように見えたが、仕事に加えtinker panic 0ntp.conf
デイブCousineau

@Sahuagin私はあなたが非標準のntpパッケージを持っている以外に何を伝えるべきかわかりません。/ etc / default / NTPのUbuntuからパッケージの一部です:packages.ubuntu.com/xenial/amd64/ntp/filelistと-gは限り私が覚えているとしてのオプションとなっています。
dfc

申し訳ありませんが、私は実際にはUbuntuではないので、コメントする前にもう少し考えるべきだったと思います。tinker panic 0間違いなく働いたようです。
デイブCousineau

13

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

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


回答が更新されました。
ステファン

1
ntpdateは段階的に廃止されていませんか?また、これを正しく理解していれば、サービスが実行され、ローカルクロックとサーバーのクロックの同期が維持されます。したがって、ドリフトは抑制されます。ntpを削除してntpdateを1回実行すると、マシンが長時間オンになっているときにクロックドリフトの影響を受けませんか?
ysap

ステファン、質問の更新#2をご覧ください。
ysap

3
はい、ntpdateは段階的に廃止されます。「ntpd -q」を使用することをお勧めします(両方のバリアントでは、最初にntpdを停止する必要があります)。
tgharold


10
rdate -s tick.greyware.com

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


ありがとう。現在、このコマンドを確認するシステムはありませんが、質問の議論と受け入れられた回答に従うと、問題は実際にクロック更新コマンドを実行した時点でネットワークが利用できなかったことがわかります。
ysap

これにより、Raspberry Piの時刻同期の問題が修正されました。ありがとうございました。
オリバースプリン

7

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日である場合など、ntpdが1000秒を超える場合にシステム時間を修正できるようにします。


私はすでにそれを持っていますが、それはまだ午後11時でなければならないNYで午前3時と言います。
チョビー14

私も既にその行を正確に持っていました/etc/default/ntpが、時間は同期していませんでした。
ダウィドフェレンツィーロゴザン14年

5

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

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

5

現在、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ています。


ありがとう。質問を投稿してから長い時間が経ちました。テスト用のシステムはありませんが、@TechJSとの回答の違い、特に提案したコマンドがわずかに異なることについて詳しく説明していただけますか。
ysap

ハありがとう。それはあなたへの応答でしたが、将来、自分自身のように最新の情報なしで自分自身をここで見つけた人への応答でもありました。回答を更新して、回答に到達する方法をより具体的にしました。
アーロンチェンバレン

4

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


2
コマンドラインから試行すると、次の応答が返されます1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting 。しかし、私は前にこれを試したrc.localが、助けにはならなかったと思う。
ysap

3
実行する前にまずntpサービスを停止する必要がありますntpdate -b <ipaddress>
Wim Deblauwe 14年

2

まあ、

raspberry piでraspbian(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

1

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

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

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

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

-ジョナサン・ナターレ


1

システムが同期するまでにかかる時間を待つ余裕がある場合は、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

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

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

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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.