Saat saya berlari chrony bukannya yang lama ntpd, 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 memiliki tzdata 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:
int main(int argc, char **argv)
{
int i, ret;
ret = get_tai();
printf("tai offset started at %i\n", ret);
if (argc < 2)
{
printf("New offset not given, not setting\n");
}
else
{
i = strtol(argv[1],NULL,10);
printf("Attempting to set TAI offset to %d\n",i);
printf("Checking tai offsets can be properly set: ");
ret = set_tai(i);
ret = get_tai();
if (ret != i) {
printf("[FAILED] expected: %i got %i\n", i, ret);
return EXIT_FAILURE;
}
}
printf("[OK]\n");
return EXIT_SUCCESS;
}
Kemudian, untuk kasus penggunaan saya, itu hanya masalah mengekstraksi nilai yang benar dari leap-seconds.list file dan berjalan set-tai dengan ini sebagai parameter (dalam /etc/rc.local untuk mewujudkannya pada saat boot). Contoh cara melakukan ini adalah:
TAI_OFFSET=$(grep -v '^#' /usr/share/zoneinfo/leap-seconds.list | tail -1 | awk '{ print $2 }')
if [ -x /usr/local/sbin/set-tai ]; then
/usr/local/sbin/set-tai $TAI_OFFSET
fi
Semoga ini bermanfaat bagi orang lain!