¿Cómo establece programáticamente el reloj del hardware en Linux?

Linux proporciona la llamada stime (2) para establecer la hora del sistema. Sin embargo, aunque esto actualizará la hora del sistema, no establece el reloj del hardware del BIOS para que coincida con la nueva hora del sistema.

Los sistemas Linux generalmente sincronizan el reloj del hardware con la hora del sistema al apagar y en intervalos periódicos. Sin embargo, si la máquina recibe un ciclo de encendido antes de una de estas sincronizaciones automáticas, el tiempo será incorrecto cuando la máquina se reinicie.

¿Cómo se asegura de que el reloj del hardware se actualice cuando establece la hora del sistema?

11
¿Por qué importaría el lenguaje de programación? ¿Tiene diferentes respuestas para diferentes idiomas /
agregado el autor Kristopher Johnson, fuente
Especifique un lenguaje de programación.
agregado el autor Lightness Races in Orbit, fuente
Er ................. sí.
agregado el autor Lightness Races in Orbit, fuente

5 Respuestas

Consulte la página de manual de rtc para obtener más detalles, pero si ha iniciado sesión como root, algo como esto:

    struct       rtc_time {
        int         tm_sec;      
        int         tm_min;      
        int         tm_hour;     
        int         tm_mday;     
        int         tm_mon;      
        int         tm_year;     
        int         tm_wday; /* unused */
        int         tm_yday; /* unused */
        int         tm_isdst;/* unused */
    };

struct rtc_time rt;
/* set your values here */
fd = open("/dev/rtc", O_RDONLY);
ioctl(fd, RTC_SET_TIME, &rt);
close(fd);
14
agregado
No es necesaria la raíz, solo capacidad CAP_SYS_TIME según rtc (4).
agregado el autor Erik Westrup, fuente

Después de llamar a stime (), haz esto:

system("/sbin/hwclock --systohc");

Consulte la página de comando man hwclock (8) para obtener más información.

9
agregado
Tenga en cuenta que si su rtc está configurado para usar la hora UTC, necesita agregar - utc o - localtime de lo contrario.
agregado el autor Julien Hirel, fuente

También me gustaría señalar que el reloj del hardware solo es preciso hasta cierto punto (he visto sistemas que perderán/ganarán un par de segundos al día).

¿Ha considerado configurar el daemon de tiempo de red para sincronizar su reloj con un servidor de tiempo?

Hay que admitir que esta sincronización no ocurre hasta después de que el daemon comience, por lo que mantener el reloj de hardware sincronizado también ayuda entre el encendido y el punto en que el daemon de tiempo se sincroniza con el servidor de tiempo.

2
agregado
La mayoría de esas variaciones, según mi experiencia, se deben a un bajo voltaje en la batería de motheboard. Sugiero revisarlo antes de configurar un servicio innecesario si no es una misión crítica.
agregado el autor Manuel Ferreria, fuente

Comenzaría leyendo el código fuente de hwclock.

2
agregado
¿Por qué leer el código en lugar de simplemente usarlo?
agregado el autor Kristopher Johnson, fuente
@iny, quise decir "¿Por qué leer la fuente en hwclock, cuando simplemente puedes llamar a hwclock?" Zan tuvo una buena respuesta a eso.
agregado el autor Kristopher Johnson, fuente
Es posible que esté escribiendo para un sistema integrado y no tenga espacio para otro programa. O tal vez solo quieres saber por curiosidad.
agregado el autor Zan Lynx, fuente
Ejecutar "strace hwclock" es probablemente la forma más rápida de satisfacer la curiosidad.
agregado el autor sigjuice, fuente
Esa fue una respuesta a la pregunta original. No sé por qué es necesario.
agregado el autor iny, fuente

Si el editor de texto es diferente de kubuntu (kate es el predeterminado en el editor), use el suyo con el comando sudo en el terminal.

  1. run terminal
  2. copy and paste this command sudo kate /etc/default/rcS press Enter
  3. enter user password (your login password) press Enter
  4. text editor will open on the desktop
  5. change the line UTC=yes to UTC=no
  6. and click save (at top of text editor tab bar)
  7. reboot
0
agregado