Khi tôi đang chạy chrony
thay vì cũ ntpd
, tôi không có cách tự động để có được tham số kernel đúng, vì vậy tôi đã xem xét một giải pháp thay thế.
Vì độ lệch giữa TAI và UTC tương đối ổn định (thay đổi <một lần mỗi năm), có thể đặt tĩnh tham số kernel, sau đó sử dụng đồng hồ CLOCK_TAI trong một ứng dụng sẽ cho giá trị chính xác.
Có một ứng dụng thử nghiệm để thiết lập bù kernel trong các nguồn kernel, trong tools/testing/selftests/timers/set-tai.c
. Và, giả sử bạn đã tzdata
cài đặt gói, có một tệp có phần bù giữa UTC và TAI /usr/share/zoneinfo/leap-seconds.list
.
Tôi đã cắt nhỏ ứng dụng kiểm tra kernel để chính trở thành:
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;
}
Sau đó, đối với trường hợp sử dụng của tôi, đó chỉ là vấn đề trích xuất giá trị chính xác từ leap-seconds.list
tệp và chạy set-tai
với giá trị này như một tham số ( /etc/rc.local
để làm cho nó xảy ra khi khởi động). Một ví dụ về cách làm này là:
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
Hy vọng điều này hữu ích cho người khác!