Bagaimana cara memaksa pembaruan jam menggunakan ntp?

Saya menjalankan Ubuntu pada sistem embedded berbasis ARM yang tidak memiliki RTC yang didukung baterai. Waktu bangun adalah suatu tempat selama tahun 1970. Jadi, saya menggunakan layanan NTP untuk memperbarui waktu ke waktu saat ini.

Saya menambahkan baris berikut ke /etc/rc.local berkas:

sudo ntpdate -s time.nist.gov

Namun, setelah startup, masih membutuhkan beberapa menit hingga waktu diperbarui, selama periode itu saya tidak dapat bekerja secara efektif tar dan make.

Bagaimana Saya bisa memaksa pembaruan jam pada waktu tertentu?


Pembaruan 1: Berikut ini (terima kasih kepada Eric dan Stephan) berfungsi dengan baik dari baris perintah, tetapi gagal memperbarui jam saat dimasukkan /etc/rc.local:

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

Apa yang saya lakukan salah?


Pembaruan 2: Saya mencoba mengikuti beberapa saran yang datang sebagai tanggapan atas Pembaruan 1, tetapi sepertinya tidak ada yang benar-benar melakukan pekerjaan sesuai kebutuhan. Inilah yang saya coba:

  1. Ganti server untuk us.pool.ntp.org
  2. Gunakan jalur eksplisit ke program
  3. Menghapus ntp layanan sama sekali dan meninggalkan hanya sudo ntpdate ... di rc.local
  4. Menghapus sudo dari perintah di atas dalam rc.local

Menggunakan di atas, mesin masih dimulai pada 1970. Namun, ketika melakukan ini dari baris perintah setelah masuk (melalui ssh), jam diperbarui segera setelah saya memanggil ntpdate.

Hal terakhir yang saya lakukan adalah untuk menghapus bahwa dari rc.local dan menempatkan panggilan untuk ntpdate dalam saya .bashrc file. Ini memperbarui jam seperti yang diharapkan, dan saya mendapatkan waktu saat ini yang sebenarnya setelah command prompt tersedia.

Namun, ini berarti bahwa jika mesin dihidupkan dan tidak ada pengguna yang masuk, maka waktu tidak pernah mendapat pembaruan. Aku bisa, tentu saja, menginstal ulang ntp layanan jadi setidaknya jam diperbarui dalam beberapa menit dari startup, tapi kemudian kita kembali di square 1.

Jadi, apakah ada alasan mengapa menempatkan ntpdate perintah dalam rc.local tidak melakukan tugas yang diperlukan, saat melakukannya di .bashrc bekerja dengan baik?

Alih-alih ntpdate (yang deprecated), gunakan ntpd:

sudo service ntp stopsudo ntpd -gqsudo service ntp start

The -gq NTP daemon untuk memperbaiki waktu terlepas dari offset (g) dan keluar segera (q) setelah mengatur waktu.

Mungkin ntp layanan sedang berjalan, itu sebabnya ntpdate tidak dapat membuka soket (port 123 UDP) dan terhubung ke server ntp.

Coba dari baris perintah:

sudo service ntp stopsudo ntpdate -s time.nist.govsudo service ntp start

Jika Anda ingin menempatkan ini di /etc/rc.local gunakan yang berikut ini:

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

Gunakan sntp untuk mengatur waktu segera. Beberapa contoh dari halaman manualnya:

USAGE     sntp ntpserver.somewhere             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.     sntp -Ss -M 128 ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is             synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will             be stepped.     sntp -S ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐             recated) ntpdate(8), or rdate(8) commands.

Ini bekerja dengan server waktu ntp. Daftar server yang nyaman dapat ditemukan di ntppool.org.

Anda membutuhkan sudo hak istimewa, misalnya:

sudo sntp -Ss -M 128 0.de.pool.ntp.org

Gunakan timedatectl (systemd service unit) untuk mengatur waktu. ntp sudah usang.

sudo systemctl restart systemd-timesyncd.service

Anda dapat memeriksa waktu diperbarui membaca log dengan journalctl -xe | tail.

Status dengan timedatectl status dan konfigurasi dalam /etc/systemd/timesyncd.conf.

Referensi

Seperti yang telah ditunjukkan orang lain, solusi terbaik adalah menginstruksikan ntpd untuk mengabaikan ambang panik, yaitu 1000 detik secara default. Anda dapat mengonfigurasi ambang panik dengan salah satu dari dua cara:

  • edit /etc/default/ntp dan pastikan bahwa opsi-g hadir.
  • mengedit / etc / ntp.conf dan tempat tinker panic 0 di bagian atas

Sejauh ini pada dasarnya apa yang direkomendasikan orang lain namun ada satu langkah lagi yang saya pikir harus Anda ambil. Instal program hwclock palsu:

# apt-get install fake-hwclockfake-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.

Dengan palsu-hwclock diinstal mesin Anda tidak akan memulai berpikir itu adalah 1970 lagi. Ketika mesin Anda boot up itu akan mengatur jam untuk timestamp palsu-hwclock menulis selama reboot terakhir / shutdown. Ini berarti Anda dapat memiliki jam yang agak benar jika ada masalah jaringan saat Anda boot.

ntpdate adalah program yang berbeda dari dameon net. NTPDate mungkin melakukan kesalahan saat boot karena ntpd berjalan di soket itu.

Dari baris perintah, Jalankan

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

Anda juga dapat menghapus instalan ntpd secara bersamaan (apt-get remove ntp) dan menambahkan skrip cron untuk menggunakan ntpdate setiap jam atau lebih.

Pembaruan

layanan ntp mungkin tidak akan memiliki nilai yang berarti bagi anda di sistem ini, jadi hapus itu terlebih dahulu.

# sudo apt-get remove ntp

Sekarang tambahkan perintah:

ntpdate -sb time.nist.gov

untuk /etc/rclocal

Reboot. Harus bagus pada saat itu.

rdate -s tick.greyware.com

jika semua yang ingin Anda lakukan adalah mengatur jam sekali, sederhana

Perhatikan bahwa beberapa sistem berbasis Ubuntu saat ini bahkan tidak menggunakan layanan NTP secara default sekarang. Pada mesin Linux Mint 19 (Ubuntu 18.04) saya, waktu disimpan oleh systemd-timesyncd.

Jadi untuk mendapatkan waktu yang up to date setelah kehilangan sinkronisasi, saya hanya menjalankan

sudo systemctl restart systemd-timesyncd

Sejak 15.04 Ubuntu menggunakan systemd secara default. Oleh karena itu sistem kritis seperti waktu dikelola melalui systemd. Untuk menemukan layanan apa yang digunakan sistem Anda, jalankan sesuatu seperti

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

Untuk TechJS pada 16.04 layanan ini ntp. Bagi saya sendiri di Ubuntu 18.04 (Mint 19) layanannya adalah systemd-timesyncd. Menariknya, saya masuk ke server 16.04 yang saya miliki dan menggunakan systemd-timesyncd juga.

Cara yang benar untuk melakukan ini pada sistem Debian / Mint / Ubuntu (atau turunan Debian lainnya) adalah dengan memiliki baris

NTPD_OPTS="-g"

dalam berkas

/etc/default/ntp

Hal ini memastikan bahwa ketika ntpd dimulai dari /etc/init.d / NTP script, berjalan dengan" - g " pilihan, yaitu

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

untuk memungkinkan ntpd untuk memperbaiki waktu sistem ketika lebih dari 1000 s keluar, misalnya ketika waktu sistem adalah 1 Januari 1970 pada startup karena tidak ada RTC hardware.

tlsdate mengatur jam lokal dengan aman menghubungkan dengan TLS ke server remote dan penggalian waktu remote dari jabat tangan aman. Tidak sepertintpdate, tlsdate menggunakan TCP, misalnya menghubungkan ke HTTPS remote atau layanan TLS diaktifkan, dan memberikan beberapa perlindungan terhadap musuh yang mencoba untuk memberi Anda informasi waktu berbahaya.

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

dari [sini] 1:
'ntpdate-s ntp.ubuntu.com`

perhatikan bendera '- b ’ pada ntpdate. Dari halaman manual ntpdate: "paksa waktu untuk melangkah menggunakan panggilan sistem settimeofday (), daripada slewed (default) menggunakan panggilan sistem adjtime (). Opsi ini harus digunakan saat dipanggil dari file startup saat boot."Banyak jawaban di bawah ini tidak termasuk, dan itu mungkin bagian dari masalah dalam mendapatkan sesuatu untuk bekerja. Pertimbangkan bahwa bendera '- B 'yang disebutkan bahwa offset lebih dari 128 ms dapat memakan waktu berjam-jam untuk disinkronkan menggunakan mekanisme ‘membunuh’ default

‘timedatectl’, tapi How to update system time behind a proxy? - Ask Ubuntu

Tidak perlu menggunakan `sudo ’ di / etc / rc.berkas lokal … mereka allready dijalankan sebagai root.