Làm thế nào để buộc cập nhật đồng hồ bằng ntp?


377

Tôi đang chạy Ubuntu trên một hệ thống nhúng dựa trên ARM thiếu RTC hỗ trợ pin. Thời gian thức dậy ở đâu đó trong năm 1970. Vì vậy, tôi sử dụng dịch vụ NTP để cập nhật thời gian đến thời điểm hiện tại.

Tôi đã thêm dòng sau vào /etc/rc.localtập tin:

sudo ntpdate -s time.nist.gov

Tuy nhiên, sau khi khởi động, vẫn mất vài phút cho đến khi thời gian được cập nhật, trong khoảng thời gian đó tôi không thể làm việc hiệu quả với tarmake.

Làm thế nào tôi có thể buộc cập nhật đồng hồ tại bất kỳ thời điểm nào?


CẬP NHẬT 1: Phần sau (nhờ Eric và Stephan) hoạt động tốt từ dòng lệnh, nhưng không cập nhật đồng hồ khi đưa vào /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

Tôi đang làm gì sai?


CẬP NHẬT 2: Tôi đã thử làm theo một vài gợi ý đáp ứng với bản cập nhật đầu tiên, nhưng dường như không có gì thực sự làm công việc theo yêu cầu. Đây là những gì tôi đã thử:

  1. Thay thế máy chủ thành us.pool.ntp.org
  2. Sử dụng đường dẫn rõ ràng đến các chương trình
  3. Hủy bỏ ntpdịch vụ hoàn toàn và chỉ để lại sudo ntpdate ...trongrc.local
  4. Loại bỏ các sudolệnh trên trongrc.local

Sử dụng ở trên, máy vẫn bắt đầu từ năm 1970. Tuy nhiên, khi thực hiện việc này từ dòng lệnh một khi đã đăng nhập (thông qua ssh), đồng hồ sẽ được cập nhật ngay khi tôi gọi ntpdate.

Điều cuối cùng tôi đã làm là loại bỏ nó khỏi rc.localvà thực hiện một cuộc gọi đến ntpdatetrong .bashrctập tin của tôi . Điều này không cập nhật đồng hồ như mong đợi và tôi nhận được thời gian hiện tại thực sự một khi dấu nhắc lệnh có sẵn.

Tuy nhiên , điều này có nghĩa là nếu máy được bật và không có người dùng nào đăng nhập, thì thời gian không bao giờ được cập nhật. Tất nhiên, tôi có thể cài đặt lại ntpdịch vụ để ít nhất đồng hồ được cập nhật trong vòng vài phút kể từ khi khởi động, nhưng sau đó chúng tôi quay lại quảng trường 1.

Vì vậy, có một lý do tại sao đặt ntpdatelệnh vào rc.localkhông thực hiện các nhiệm vụ cần thiết, trong khi làm như vậy trong .bashrchoạt động tốt?


2
từ [tại đây] [1]: ntpdate -s ntp.ubuntu.com [1]: Askubfox.com/a/81602/130162
18446744073709551615

4
chú ý cờ '-b' trên ntpdate. Từ trang man của ntpdate: "Buộc thời gian được thực hiện bằng cách sử dụng lệnh gọi hệ thống giải quyết (), thay vì quay vòng (mặc định) bằng cách sử dụng lệnh gọi hệ thống adjtime (). Tùy chọn này nên được sử dụng khi được gọi từ tệp khởi động khi khởi động." Nhiều câu trả lời dưới đây không bao gồm nó, và đó có thể là một phần của vấn đề trong việc khiến mọi thứ hoạt động. Hãy xem xét rằng cờ '-B' mà nó đề cập đến việc bù đắp trên 128 ms có thể mất hàng giờ để đồng bộ hóa bằng cơ chế 'xoay' mặc định
Matt S.

Không cần sử dụng sudotrong các tập tin /etc/rc.locale .. tất cả đều được chạy dưới dạng root.
Soren A

Câu trả lời:


325

Có lẽ ntpdịch vụ đang chạy, đó là lý do tại sao ntpdatekhông thể mở ổ cắm (cổng 123 UDP) và kết nối với máy chủ ntp.

Thử từ dòng lệnh:

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

Nếu bạn muốn đưa cái này vào /etc/rc.localsử dụng như sau:

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

Cảm ơn. Bạn có thể vui lòng giải thích tại sao bạn cần các đường dẫn rõ ràng?
ysap

1
Tôi thực sự không biết. :-) Tôi đã gặp sự cố một lần khi cố gắng chạy servicetừ RC.local và cron nhưng tôi đã cố gắng khắc phục bằng cách sử dụng /etc/init.d/xxx. Trên thực tế tôi nghĩ rằng bạn không cần phải cung cấp đường dẫn đầy đủ ntpdate, tôi muốn sử dụng các đường dẫn đầy đủ trong các tập lệnh chỉ để đảm bảo tìm đúng tệp wiill.
Eric Carvalho

2
OK, đây rõ ràng là vấn đề. Bây giờ đồng hồ đang được cập nhật ngay khi kết nối mạng được thiết lập. Cảm ơn.
ysap

3
Tôi đã phát hiện ra rằng nó us.pool.ntp.orglà phản ứng nhanh hơn.
ysap

7
Với -utùy chọn, bạn không cần phải dừng dịch vụ ntp:sudo ntpdate -u time.nist.gov
Edward Anderson

486

Thay vì ntpdate ( không dùng nữa ), hãy sử dụng

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

Trình báo -gqcho ntp daemon sửa thời gian bất kể offset ( g) và thoát ngay lập tức ( q) sau khi đặt thời gian.


3
Cảm ơn. Vẫn hiển thị 1970 sau lệnh này (w / sudo). Đọc ntpdmanpage, tôi không chắc làm thế nào điều này buộc một bản cập nhật?
ysap

12
Tùy chọn "-q" báo cho trình nền NTP khởi động, đặt thời gian và thoát ngay lập tức. Tùy chọn "-g" cho phép nó sửa cho chênh lệch thời gian lớn hơn 1000 giây. Về lâu dài, bạn chỉ cần cấu hình trình nền NTP để luôn chạy.
tgharold

35
Câu trả lời này nên được đặt lên hàng đầu, bởi vì nó là chính xác: ntpdate bị phản đối và cài đặt nó là một ý tưởng tồi, bởi vì nó mâu thuẫn với ntp. Nếu đồng hồ tắt, bạn cần thực hiện bước thủ công này vì nếu không ntp sẽ không thay đổi đồng hồ của bạn và sẽ không cho bạn biết lý do.
Liam

31
Đối với tôi, sudo ntpd -gqkhông thoát! Tôi vào ngày 14.10 và tôi phải CTRL + C để tiếp tục ... hoặc phải mất bao lâu?
Yanick Rochon

5
FYI, trên hệ thống của tôi (CentOS 6.6), tôi cần thay đổi hai trường hợp sudo service ntp...thành sudo service ntpd....
rinogo

63

Sử dụng sntp để đặt thời gian ngay lập tức. Ví dụ:

sudo sntp -s 24.56.178.140

Các số sau -s có thể là bất kỳ máy chủ thời gian ntp nào, số đó là NIST ở Ft. Collins, Colorado.


1
Điều đó đã làm việc! +1
CappY

7
Điều này hoạt động khi "sudo ntpd -gq" không.
Matt White

Tôi không biết bao nhiêu lần tôi đã tìm kiếm câu trả lời này. Hoạt động mọi lúc.
Hỗn loạn

1
không thể xác định vị trí gói sntp?
chùa

1
apt-get install sntp / yum install sntp (vâng, nó hoạt động trên CentOS, RedHat, fedore nữa)
ndemou

40

Như những người khác đã chỉ ra giải pháp tốt nhất là hướng dẫn ntpd bỏ qua ngưỡng hoảng loạn, mặc định là 1000 giây. Bạn có thể định cấu hình ngưỡng hoảng loạn theo một trong hai cách:

  • chỉnh sửa /etc/default/ntpvà đảm bảo rằng tùy chọn -g có mặt.
  • chỉnh sửa /etc/ntp.conf và đặt tinker panic 0ở trên cùng

Cho đến nay, đây thực chất là những gì người khác đã khuyến nghị tuy nhiên còn một bước nữa tôi nghĩ bạn nên thực hiện. Cài đặt chương trình 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.

Với cài đặt giả mạo, máy của bạn sẽ không khởi động khi nghĩ rằng đó là năm 1970 một lần nữa. Khi máy của bạn khởi động, nó sẽ đặt đồng hồ của nó thành dấu thời gian giả được ghi trong lần khởi động lại / tắt máy cuối cùng. Điều này có nghĩa là bạn có thể có một đồng hồ hơi chính xác trong trường hợp có vấn đề về mạng khi bạn khởi động.


1
-gdường như không làm gì cho tôi (ở dòng lệnh, tôi không có /etc/default/ntp), nhưng thêm vào tinker panic 0để ntp.conflàm việc
Dave Cousineau

@Sahuagin Tôi không biết phải nói gì với bạn ngoài việc bạn có gói ntp không chuẩn. / etc / default / NTP là một phần của gói từ Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist và -g đã được một lựa chọn cho miễn là tôi có thể nhớ.
dfc

xin lỗi, tôi đoán tôi không thực sự sử dụng Ubuntu và nên suy nghĩ thêm một chút trước khi bình luận. tinker panic 0chắc chắn dường như đã làm việc mặc dù.
Dave Cousineau

13

ntpdate là một chương trình khác với dameon net. NTPDate có thể bị lỗi khi khởi động vì ntpd đang chạy trên ổ cắm đó.

Từ dòng lệnh, chạy

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

Bạn cũng có thể gỡ cài đặt ntpd tất cả cùng nhau (apt-get remove ntp) và thêm tập lệnh cron để sử dụng ntpdate mỗi giờ hoặc lâu hơn.

CẬP NHẬT

Dịch vụ ntp có thể sẽ không có giá trị có ý nghĩa đối với bạn trên hệ thống này, vì vậy hãy xóa nó trước.

# sudo apt-get remove ntp

Bây giờ thêm lệnh:

ntpdate -sb time.nist.gov

đến /etc/rclocal

Khởi động lại. Nên giỏi ở điểm đó.


Trả lời cập nhật.
Stephan

1
Không phải là không được loại bỏ hay sao? Ngoài ra, nếu tôi hiểu chính xác điều này, dịch vụ sẽ chạy và duy trì đồng bộ hóa đồng hồ cục bộ với đồng hồ của máy chủ - vì vậy độ trôi bị ràng buộc. Nếu bạn xóa ntp và chạy ntpdate một lần, nó sẽ không bị ảnh hưởng bởi sự trôi đồng hồ khi máy bật trong thời gian dài?
ysap

Stephan, vui lòng xem cập nhật # 2 cho câu hỏi.
ysap

3
Vâng, ntpdate đang được loại bỏ. Việc sử dụng "ntpd -q" được ưu tiên (cả hai biến thể yêu cầu ntpd phải được dừng lại trước tiên).
tgharold

11

Sử dụng timedatectl(đơn vị dịch vụ systemd) để đặt thời gian. ntpbị phản đối

sudo systemctl restart systemd-timesyncd.service

Bạn có thể kiểm tra thời gian được cập nhật bằng cách đọc nhật ký với journalctl -xe | tail

Tài liệu tham khảo


Điều này đã làm việc trên Ubuntu 19.04. Cảm ơn!
krubo

10
rdate -s tick.greyware.com

Nếu tất cả những gì bạn muốn làm là đặt đồng hồ một lần, đơn giản


Cảm ơn. Tôi hiện không có hệ thống để kiểm tra lệnh này, nhưng nếu bạn theo dõi cuộc thảo luận trong câu hỏi và câu trả lời được chấp nhận, bạn sẽ thấy rằng vấn đề thực sự là không có mạng tại thời điểm chạy lệnh cập nhật đồng hồ.
ysap

Điều này đã khắc phục sự cố đồng bộ hóa thời gian trên Raspberry Pi của tôi. Cảm ơn bạn.
Oliver Spryn

7

Cách chính xác để thực hiện việc này trên hệ thống Debian / Mint / Ubuntu (hoặc dẫn xuất Debian khác) là có dòng

NTPD_OPTS="-g"

Trong tập tin

/etc/default/ntp

Điều này đảm bảo rằng khi ntpd được khởi động từ tập lệnh /etc/init.d/ntp, nó sẽ chạy với tùy chọn "-g", viz

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

để cho phép ntpd sửa thời gian hệ thống khi hết hơn 1000 giây, ví dụ khi thời gian hệ thống là ngày 1 tháng 1 năm 1970 khi khởi động vì không có RTC phần cứng.


Tôi đã có cái đó rồi, nhưng nó vẫn báo 3 giờ sáng ở NY, khi đó là 11 giờ tối.
chovy

Tôi cũng đã có chính xác dòng đó /etc/default/ntp, nhưng thời gian không được đồng bộ hóa.
Dawid Ferenczy Rogožan

5

tlsdateđặt đồng hồ cục bộ bằng cách kết nối an toàn với TLS đến các máy chủ từ xa và rút thời gian từ xa ra khỏi bắt tay an toàn. Không giống như ntpdate, tlsdatesử dụng TCP, ví dụ như kết nối với dịch vụ hỗ trợ HTTPS hoặc TLS từ xa và cung cấp một số bảo vệ chống lại các đối thủ cố gắng cung cấp cho bạn thông tin về thời gian độc hại.

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

5

Lưu ý rằng một số hệ thống dựa trên Ubuntu hiện tại thậm chí không sử dụng dịch vụ NTP theo mặc định. Trên máy Linux Mint 19 (Ubuntu 18.04) của tôi, thời gian được giữ nguyên systemd-timesyncd.

Vì vậy, để có được thời gian cập nhật sau khi mất đồng bộ hóa, tôi chỉ cần chạy

sudo systemctl restart systemd-timesyncd

Kể từ 15.04 Ubuntu sử dụng systemd theo mặc định. Do đó, các hệ thống quan trọng như thời gian được quản lý thông qua systemd. Để tìm dịch vụ nào hệ thống của bạn đang sử dụng chạy một cái gì đó như

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

Đối với TechJS vào ngày 16.04, dịch vụ này là ntp. Đối với bản thân tôi trên Ubuntu 18.04 (Mint 19), dịch vụ này là systemd-timesyncd. Thật thú vị, tôi đã đăng nhập vào một máy chủ 16.04 mà tôi có và nó cũng sử dụng systemd-timesyncd.


Cảm ơn. Đã lâu rồi kể từ khi đăng câu hỏi và tôi không có sẵn hệ thống để kiểm tra, nhưng bạn có thể giải thích cách trả lời của bạn khác với @TechJS, đặc biệt là lệnh bạn đề xuất hơi khác.
ysap

Hà cảm ơn. Đó là một phản hồi cho bạn nhưng cũng cho bất kỳ ai trong tương lai thấy mình ở đây mà không có thêm thông tin cập nhật (như bản thân tôi). Tôi đã cập nhật câu trả lời của mình để cụ thể hơn về cách tôi đạt được câu trả lời của mình.
Aaron Chamberlain

4

Hãy thử sử dụng -btùy chọn để bước thời gian.


2
Khi thử từ dòng lệnh, tôi nhận được phản hồi sau : 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Tuy nhiên, tôi nghĩ rằng tôi đã thử điều này trước đây rc.localnhưng nó không giúp được gì.
ysap

3
Bạn cần dừng dịch vụ ntp trước khi có thể chạyntpdate -b <ipaddress>
Wim Deblauwe

2

Tốt,

Tôi đang chạy một raspbian (debian wheezy) trên pi mâm xôi của tôi, mà không có giờ. Tôi thấy thật tiện lợi khi viết một đoạn script nhỏ và chạy nó sau khi giao diện internet của tôi hoạt động, để tôi chắc chắn rằng thời điểm mạng trở nên khả dụng, đồng hồ sẽ được cập nhật.

Trước tiên hãy kiểm tra xem bạn có ntpdategói bằng cách chạy không

sudo apt-get update
sudo apt-get install ntpdate

Bạn cần thêm những điều sau vào /etc/network/interfaces(chắc chắn eth0đây chỉ là một ví dụ):

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

Và tạo tập lệnh sau trong /usr/local/sbin/update-time.sh(đừng quên làm cho tập lệnh thực thi bằng 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

Các thuật toán ntpd loại bỏ các độ lệch mẫu vượt quá 128 ms, trừ khi khoảng thời gian không có giá trị [giá trị tuyệt đối của] mẫu nhỏ hơn 128 ms vượt quá 900 giây. Mẫu đầu tiên sau đó, bất kể giá trị bù là bao nhiêu, bước đồng hồ đến thời gian đã định. Trong thực tế, điều này làm giảm tốc độ báo động sai trong đó đồng hồ bị lỗi ở mức thấp đến mức thấp.

Thông thường, ntpd sẽ thoát nếu độ lệch vượt quá giới hạn độ tỉnh, là 1000 giây theo mặc định. Điều này có thể được tắt với tùy chọn -g:

-g Thông thường, ntpd sẽ thoát nếu độ lệch vượt quá giới hạn độ tỉnh, là 1000 s theo mặc định. Nếu giới hạn độ sạch được đặt thành 0, không có kiểm tra độ tỉnh nào được thực hiện và bất kỳ độ lệch nào đều được chấp nhận. Tùy chọn này ghi đè giới hạn và cho phép thời gian được đặt thành bất kỳ giá trị nào mà không hạn chế; tuy nhiên, điều này chỉ có thể xảy ra một lần. Sau đó, ntpd sẽ thoát nếu vượt quá giới hạn. Tùy chọn này có thể được sử dụng với tùy chọn -q.

cả hai từ http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale


1

Nếu bạn có thể dành thời gian để chờ đợi bất cứ lúc nào trước khi hệ thống của bạn được đồng bộ hóa, bạn có thể sử dụng ntp-waitlệnh:

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

Nếu bạn đang sử dụng systemd, bạn có thể sử dụng lệnh này:

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

Và sau đó thời gian được cập nhật trong vòng gần 10 - 15 giây.
Đã thử nghiệm trên Ubuntu mate 16.04


0

ntpdntpdatechạy theo mặc định bằng cổng hạn chế (UDP 123). Nếu bạn đứng sau tường lửa, ntpdsẽ không bao giờ hoạt động, nhưng ntpdatecó thể hoạt động với -utùy chọn. Ví dụ: ntpdate -u 0.ubuntu.pool.ntp.org hoặc ntpdate -u time.nist.govcả hai nên hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.