GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna forma de obtener CLOCK_TAI correcto en Linux?

Creo que quieres clock_gettime con CLOCK_TAI para funcionar correctamente. Yo también.

La oración crítica en la respuesta a la que se hace referencia es:"Tenga en cuenta que el desplazamiento de CLOCK_REALTIME se inicializa en el arranque a cero y ni ntpd ni chronyd lo establecen de forma predeterminada en el valor correcto (actualmente 35)."

Esto aún puede ser cierto, además de que el desplazamiento ahora es 37, pero al menos se puede configurar un ntpd reciente para establecer el desplazamiento. Hice lo siguiente en una máquina 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

Entonces clock_gettime(CLOCK_TAI, &res) parecía funcionar correctamente.

Creo que ntp establece el desplazamiento usando ntp_adjtime con MOD_TAI . Buscando la fuente crony con grep -P '(ADJ|MOD)_TAI' no encuentra coincidencias, por lo que parece que chrony aún no tiene esta capacidad.


Puedes usar libtai de djb:https://cr.yp.to/libtai.html

¿Qué es?

libtai es una biblioteca para almacenar y manipular fechas y horas.

libtai admite dos escalas de tiempo:(1) TAI64, que abarca unos cientos de miles de millones de años con una precisión de 1 segundo; (2) TAI64NA, que cubre el mismo período con una precisión de 1 attosegundo. Ambas escalas se definen en términos de TAI, el actual estándar internacional de tiempo real.

libtai proporciona un formato interno para TAI64, struct tai, diseñado para manipulaciones de tiempo rápidas. Las rutinas tai_pack() y tai_unpack() convierten entre struct tai y un formato de almacenamiento portátil TAI64 de 8 bytes. libtai proporciona formatos internos y externos similares para TAI64NA.

libtai proporciona struct caldate para almacenar fechas en formato año-mes-día. Puede convertir struct caldate, según el calendario gregoriano, en un número de día juliano modificado para facilitar la aritmética de fechas.

libtai proporciona struct caltime para almacenar fechas y horas del calendario junto con compensaciones UTC. Puede convertir de struct tai a struct caltime en UTC, teniendo en cuenta los segundos intercalares, para una visualización precisa de la fecha y la hora. También puede volver a convertir de struct caltime a struct tai para la entrada del usuario. Su velocidad general de conversión de UTC a TAI es 100 veces mejor que la implementación habitual de UNIX mktime().

Esta versión de libtai requiere un sistema UNIX con gettimeofday(). Será fácil migrar a otros sistemas operativos con compiladores compatibles con aritmética de 64 bits.

El código fuente de libtai es de dominio público.


Como estoy ejecutando chrony en lugar del antiguo ntpd , no tenía una forma automatizada de obtener el parámetro del núcleo correctamente, así que busqué una alternativa.

Como el desplazamiento entre TAI y UTC es relativamente constante (cambia

Hay una aplicación de prueba para configurar el desplazamiento del kernel en las fuentes del kernel, en tools/testing/selftests/timers/set-tai.c . Y, asumiendo que tienes el tzdata paquete instalado, hay un archivo con el desplazamiento entre UTC y TAI en /usr/share/zoneinfo/leap-seconds.list .

Corté la aplicación de prueba del kernel para que la principal se convirtiera en:

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;
}

Entonces, para mi caso de uso, solo era cuestión de extraer el valor correcto del leap-seconds.list archivo y ejecutando set-tai con esto como parámetro (en /etc/rc.local para que suceda en el momento del arranque). Una forma de ejemplo de hacer esto es:

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

¡Espero que esto sea útil para alguien más!


Linux
  1. ¿Hay alguna forma de que los procesos no raíz se vinculen a puertos privilegiados en Linux?

  2. ¿Hay STDCALL en Linux?

  3. ¿Hay alguna forma de obtener time_t de 64 bits en programas de 32 bits en Linux?

  4. ¿Cuál es la forma correcta de instalar jdk en Linux?

  5. ¿Hay alguna forma de alterar los colores utilizados en las consolas TTY en Linux?

Primeros pasos con Etcher.io

¿Cuál es la forma correcta de iniciar un servicio mongod en linux/OS X?

¿Hay alguna manera de mejorar el rendimiento de las tuberías de Linux?

¿Hay alguna manera de obtener emoji de colores en cualquier emulador de terminal en Linux?

¿Hay alguna manera de escuchar el proceso?

¿Hay alguna manera de obtener la versión del BIOS desde el interior de Linux?