Câu hỏi Làm thế nào để buộc một bản cập nhật đồng hồ bằng cách sử dụng ntp?


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

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

sudo ntpdate -s time.nist.gov

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

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


CẬP NHẬT 1: Sau đây (nhờ Eric và Stephan) hoạt động tốt từ dòng lệnh, nhưng không cập nhật được đồ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 số gợi ý đến để đá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ự thực hiện 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 cho các chương trình
  3. Gỡ bỏ ntp dịch vụ hoàn toàn và để lại sudo ntpdate ... trong rc.local
  4. Gỡ bỏ sudo từ lệnh trên trong rc.local

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

Điều cuối cùng tôi làm là xóa nó khỏi rc.local và gọi điện đến ntpdate trong tôi .bashrc tập tin. Đ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 được đăng nhập, thì thời gian sẽ không bao giờ được cập nhật. Tôi có thể, tất nhiên, cài đặt lại ntp dịch vụ vì vậy í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 trở lại hình vuông 1.

Vì vậy, có một lý do tại sao đặt ntpdate lệnh trong rc.local không thực hiện tác vụ được yêu cầu, trong khi làm như vậy .bashrc hoạt động tốt?


325
2018-02-13 21:58


gốc


từ [đây] [1]: ntpdate -s ntp.ubuntu.com     [1]: askubuntu.com/a/81301/130162 - 18446744073709551615
chú ý cờ '-b' trên ntpdate. Từ trang người dùng của ntpdate: "Buộc thời gian được bước bằng cách sử dụng cuộc gọi hệ thống settimeofday (), chứ không phải xoay (mặc định) bằng cách sử dụng cuộc gọi hệ thống adjtime (). Tùy chọn này nên được sử dụng khi được gọi từ một tệp khởi động lúc 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 làm việc. Hãy xem xét cờ '-B', nó đề cập rằng bù đắp trên 128 ms có thể mất hàng giờ để đồng bộ hóa bằng cách sử dụng cơ chế 'xoay' mặc định - Matt S.
Không cần sử dụng sudo trong tập tin /etc/rc.locale .. chúng được allready chạy dưới dạng root. - Soren A


Các câu trả lời:


Có lẽ là ntp dịch vụ đang chạy, đó là lý do ntpdate khô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 đặt nó vào /etc/rc.local sử 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 )&

285
2018-02-13 23:13



Cảm ơn. Bạn có thể giải thích tại sao bạn cần các đường dẫn rõ ràng không? - ysap
Tôi thực sự không biết. :-) Tôi gặp rắc rối khi cố gắng chạy service từ rc.local và cron nhưng thay vào đó, tôi đã sửa lỗi bằng cách sử dụng /etc/init.d/xxx. Thực ra tôi nghĩ bạn không phải đưa ra đường dẫn đầy đủ đến ntpdate, Tôi thích sử dụng đường dẫn đầy đủ trong các tập lệnh chỉ để đảm bảo tìm thấy đúng tệp. - Eric Carvalho
OK, đây rõ ràng là vấn đề. Bây giờ đồng hồ đang được cập nhật ngay sau khi kết nối mạng được thiết lập. Cảm ơn. - ysap
Tôi đã phát hiện ra rằng us.pool.ntp.org phản ứng nhanh hơn. - ysap
Với -u tù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


Thay vì ntpdate (đó là không dùng nữa), sử dụng

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

Các -gq nói với daemon ntp để 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.


429
2018-02-14 12:32



Cảm ơn. Vẫn hiển thị 1970 sau lệnh này (w / sudo). đọc hiểu ntpd manpage, 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
Tùy chọn "-q" yêu cầu 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 chỉnh sửa cho các chênh lệch thời gian lớn hơn 1000 giây. Đối với thuật ngữ dài hơn, bạn chỉ cần cấu hình NTP daemon để chạy luôn. - tgharold
Câu trả lời này nên đi lên đầu, bởi vì nó là chính xác: ntpdate không được chấp nhận và cài đặt nó là một ý tưởng tồi, bởi vì nó xung đột với ntp. Nếu đồng hồ bị 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
Cho tôi, sudo ntpd -gq không thoát! Tôi đang trên 14,10 và tôi phải CTRL + C để tiếp tục ... hoặc phải mất bao lâu? - Yanick Rochon
FYI, trên hệ thống của tôi (CentOS 6.6), tôi cần phải thay đổi hai trường hợp sudo service ntp... đến sudo service ntpd.... - rinogo


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, đó là NIST ở Ft. Collins, Colorado.


50
2017-11-08 01:00



Điều đó đã hiệu quả! +1 - CappY
Điều này làm việc 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. - Chaos
không thể xác định vị trí gói sntp? - temple
apt-get cài đặt sntp / yum install sntp (có nó hoạt động trên CentOS, RedHat, fedore) - ndemou


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, là 1000 giây theo mặc định. 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/ntp và đả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 ở đầu

Cho đến nay đây là cơ bản những gì người khác đã đề nghị tuy nhiên có một bước nữa tôi nghĩ rằng bạn nên dùng. Cài đặt chương trình hwclock giả:

# 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 giả-hwclock cài đặt máy tính của bạn sẽ không bắt đầu nghĩ rằng nó là 1970 tất cả hơn 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ả-hwclock đã viết 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 đúng trong trường hợp có sự cố mạng khi bạn khởi động.


37
2018-04-03 22:11



-g dườ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 tinker panic 0 đến ntp.conf đã là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 là một lựa chọn miễn là tôi có thể nhớ. - dfc
xin lỗi, tôi đoán tôi không thực sự trên Ubuntu và nên suy nghĩ nhiều hơn một chút trước khi bình luận. tinker panic 0 chắc chắn dường như đã làm việc mặc dù. - Dave Cousineau


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

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ỡ bỏ ntpd tất cả cùng nhau (apt-get remove ntp) và thêm một script 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 cho bạn trên hệ thống này, vì vậy hãy xóa nó trước tiên.

# 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 tốt vào thời điểm đó.


12
2018-02-13 23:07



đã cập nhật câu trả lời. - Stephan
Không phải là ntpdate bị loại bỏ hay gì đó sao? Ngoài ra, nếu tôi hiểu điều này một cách chính xác, 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ủ - do đó sự trôi dạt bị ràng buộc. Nếu bạn loại bỏ ntp và chạy ntpdate một lần, nó sẽ không bị ảnh hưởng bởi đồng hồ trôi khi máy đang bật trong thời gian dài? - ysap
Stephan, xin vui lòng xem cập nhật # 2 cho câu hỏi. - ysap
Có, ntpdate đang được loại bỏ. Sử dụng "ntpd -q" được ưa thích (cả hai biến thể yêu cầu ntpd được dừng trước). - tgharold


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


8
2018-02-26 22:57



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 làm theo các 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 cố định một vấn đề đồng bộ thời gian trên Raspberry Pi của tôi. Cảm ơn bạn. - Oliver Spryn


Cách chính xác để thực hiện điều này trên hệ thống Debian / Mint / Ubuntu (hoặc hệ 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 bắt đầu từ tập lệnh /etc/init.d/ntp, nó 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 chữa thời gian hệ thống khi nó lớn hơn 1000 giây, ví dụ: khi hệ thống thời gian là ngày 1 tháng 1 năm 1970 khi khởi động vì không có RTC phần cứng.


7
2018-04-03 11:20



Tôi đã có, nhưng nó vẫn nói 3AM ở NY, khi nó nên là 11 giờ tối. - chovy
Tôi cũng đã có chính xác dòng đó trong /etc/default/ntpnhưng thời gian không đồng bộ. - Dawid Ferenczy