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!