Saya pikir kamu mau clock_gettime
dengan CLOCK_TAI
untuk bekerja dengan baik. Begitu juga aku.
Kalimat kritis dalam jawaban yang direferensikan adalah: "Harap dicatat bahwa offset dari CLOCK_REALTIME diinisialisasi pada boot ke nol dan baik ntpd maupun chronyd tidak menetapkannya secara default ke nilai yang benar (saat ini 35)."
Ini mungkin masih benar, terlepas dari offset yang sekarang menjadi 37, tetapi ntpd baru-baru ini setidaknya dapat dikonfigurasi untuk mengatur offset. Saya melakukan hal berikut pada mesin openSUSE:
vi /etc/ntp.conf # Add the line: leapfile /var/lib/ntp/etc/ntp.leapseconds
update-leap
service ntpd restart
less /var/log/ntp # Check for errors
Kemudian clock_gettime(CLOCK_TAI, &res)
sepertinya bekerja dengan benar.
Saya berpikir bahwa ntp mengatur offset menggunakan ntp_adjtime
dengan MOD_TAI
. Mencari sumber kroni dengan grep -P '(ADJ|MOD)_TAI'
tidak menemukan kecocokan, jadi sepertinya chrony belum memiliki kemampuan ini.
Edmund Grimley Evans
sumber
CLOCK_TAI
.Saat saya berlari
chrony
bukannya yang lamantpd
, Saya tidak memiliki cara otomatis untuk mendapatkan parameter kernel dengan benar, jadi saya mencari alternatif.Karena offset antara TAI dan UTC relatif konstan (perubahan & lt; sekali per tahun), dimungkinkan untuk menetapkan parameter kernel secara statis, dan kemudian menggunakan jam CLOCK_TAI dalam aplikasi akan memberikan nilai yang benar.
Ada aplikasi uji untuk mengatur offset kernel di sumber kernel, di
tools/testing/selftests/timers/set-tai.c
. Dan, anggap Anda memilikitzdata
paket terpasang, ada file dengan offset antara UTC dan TAI di/usr/share/zoneinfo/leap-seconds.list
.Saya memotong aplikasi uji kernel sehingga yang utama menjadi:
Kemudian, untuk kasus penggunaan saya, itu hanya masalah mengekstraksi nilai yang benar dari
leap-seconds.list
file dan berjalanset-tai
dengan ini sebagai parameter (dalam/etc/rc.local
untuk mewujudkannya pada saat boot). Contoh cara melakukan ini adalah:Semoga ini bermanfaat bagi orang lain!
sumber