Da ich chrony
anstelle des alten laufe ntpd
, hatte ich keine automatisierte Methode, um den Kernel-Parameter richtig zu machen, und suchte nach einer Alternative.
Da der Versatz zwischen TAI und UTC relativ konstant ist (Änderungen <einmal pro Jahr), kann der Kernel-Parameter statisch festgelegt werden, und die Verwendung der CLOCK_TAI-Uhr in einer Anwendung liefert den korrekten Wert.
Es gibt eine Testanwendung zum Einstellen des Kernel-Offsets in den Kernel-Quellen, in tools/testing/selftests/timers/set-tai.c
. Und wenn Sie das tzdata
Paket installiert haben, gibt es eine Datei mit dem Offset zwischen UTC und TAI in /usr/share/zoneinfo/leap-seconds.list
.
Ich habe die Kernel-Testanwendung heruntergefahren, sodass die Hauptanwendung wie folgt aussah:
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;
}
In meinem Anwendungsfall ging es nur darum, den richtigen Wert aus der leap-seconds.list
Datei zu extrahieren und set-tai
mit diesem Parameter auszuführen ( /etc/rc.local
damit dies beim Booten geschieht). Ein Beispiel dafür ist:
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
Hoffe das ist nützlich für jemand anderen!