Sincronizar la hora en sistemas Linux con Chrony

Chrony es una implementación del protocolo de sincronización de la hora, Network Time Protocol (NTP), siendo la versión actual de protocolo la versión 4 (NTPv4) siendo su RFC 5905

Chrony está orientado más a ordenadores personales o aquellos equipos que son reiniciados con cierta frecuencia. Por esto y otras características, que veremos a continuación, se está imponiendo en las distribuciones Linux, sustituyendo el que hasta ahora era la implementación usada por defecto ntpd.

Actualmente está disponible en muchas de las distribuciones de Linux y es la opción por defecto en distribuciones como Red Hat Enterprise Linux o SuSE Linux Enterprise Linux

Ventajas de Chrony sobre NTP

Ya se ha comentado una de las ventajas de Chrony sobre NTP, otras ventajas son la siguientes:

  • Una mejor respuesta ante los cambios rápidos en la frecuencia del reloj, lo cual es útil para máquinas virtuales que tienen relojes inestables o para cuando se usa el modo de ahorro de energía que no mantienen constante la frecuencia del reloj.
  • No hace avanzar el reloj después de la sincronización inicial.
  • Mejor comportamiento cuando la conexión está saturada por una gran descarga.
  • La sincronización es más rápida que NTP, solo requiere minutos en lugar de hasta horas, siendo una funcionalidad útil en equipos de escritorio o sistemas que no funcionan las 24 horas del día.
  • No se requiere el sondeo periódico de los servidores.

Como se ha comentado anterior, está pensado mas para ordenadores que no se mantienen a lo largo del tiempo encendidos. Para estos lo recomendado sigue siendo NTP (ntpd).

Instalación de Chrony en OpenSuSE

La instalación de Chrony en una distribución donde estén los paquetes de Chrony es ejecutar el comando que corresponda para realizar la instalación de paquetes, aunque como se ha comentado hay distribuciones que actualmente ya la tiene por defecto, en mi caso utilizo OpenSuSE, que lo tiene instalado de forma predeterminada, pero en caso de no tenerlo instalado se ejecutaría el siguiente comando:

sudo zypper -i chrony

Configuración y ejecución de Chrony

El fichero de configuración de Chrony es /etc/chrony.conf, de forma predeterminada está configurado y no haría falta cambiar nada, aunque es preferible cambiar y asignar servidores NTP que se encuentren próximos a la ubicación del equipo.

Para ese cambio, Chrony dispone 2 directivas que son:

  • server: Indica un servidor NTP que puede ser usado para sincronizar el reloj, puede existir más de una de estás directivas.
  • pool: A diferencia de la anterior indica que la dirección es un pool de servidores NTP y no un solo servidor de tiempos. También pueden asignarse más de una directiva pool

En el caso de OpenSuSE tiene configurados los siguientes pool’s:

pool 2.opensuse.pool.ntp.org iburst
pool europe.pool.ntp.org iburst
pool es.pool.ntp.org iburst
pool hora.oxixares.com iburst

Como en la configuración que hace OpenSuSE asigna servidores de europa y de españa, no he tenido que hacer ningún cambio. Para elegir servidores próximos a la ubicación se puede consultar la página web: https://www.ntppool.org/es/

Además de estás 2 directivas existen otras, algunas de ellas son:

  • keyfile : Indica la ubicación del archivo que contiene pares de claves de ID usado en la autenticación de paquetes NTP.
  • driftfile : Define la ubicación del fichero driftfile. Una de las funciones principales que realiza chrony es calcular la velocidad a la que el reloj del sistema gana o pierde tiempo en relación con el tiempo real. Cada vez que Chrony calcula una nueva tasa de ganancia o pérdida, es conveniente almacenarlos en algún lugar, esto se hace con ésta directiva.
  • rtcsync : La directiva rtcsync habilita un modo en el que la hora del sistema se copia periódicamente al RTC . En Linux, la copia RTC es realizada por el kernel cada 11 minutos.
  • makestep : Esta directiva hace que Chrony corrija gradualmente cualquier compensación de tiempo acelerando o ralentizando el reloj según corresponda.

El resto de directivas se pueden consultar en la documentación de Chrony:

man chrony.conf

O consultando la documentación en internet.

Una vez configurado resta iniciar el servicio (chronyd)

systemctl start chronyd
o en caso de estar en ejecución:
systemctl restart chronyd

Y activamos el servicio, para que sea iniciado durante el arrancar el sistema:

systemctl enable chronyd

Comandos de consultas

El primer comando que podemos consultar, es el del estado del servicio:

systemctl status chronyd

El resultado nos mostrará si está o no activo:

A parte de la aplicación del servicio propiamente (chronyd) se proporciona un cliente (chronyc) que se puede usar para realizar consultas o acciones sobre el servicio, algunos comandos útiles:

Forzar la sincronización en el momento

sudo chronyc makestep

Resultado:

200 OK

Comprobar la sincronización

chronyc tracking

Resultado

Reference ID    : A29FC87B (time.cloudflare.com)
Stratum         : 4
Ref time (UTC)  : Tue Nov 03 21:51:14 2020
System time     : 0.000491000 seconds fast of NTP time
Last offset     : -0.000266349 seconds
RMS offset      : 0.000853151 seconds
Frequency       : 14.966 ppm slow
Residual freq   : +0.038 ppm
Skew            : 2.131 ppm
Root delay      : 0.044723451 seconds
Root dispersion : 0.001206369 seconds
Update interval : 64.7 seconds
Leap status     : Normal

Listas de servidores

chronyc sources

Resultado:

Consultar y cambiar la zona horaria

Por último vamos a ver los comandos para consultar y/o cambiar la zona o Huso de un sistema Linux.

Consultar la zona actual

La zona actual está configurada en Linux mediante un enlace, se puede consultar con el comando:

ls -l /etc/localtime

Resultado, en mi caso es:

lrwxrwxrwx 1 root root 33 may 18  2018 /etc/localtime -> /usr/share/zoneinfo/Europe/Madrid

O se puede consultar con información más concreta mediante:

timedatectl

Resultado:

Lista de zonas disponibles

timedatectl list-timezones

Si filtramos por las zonas de europa:

 timedatectl list-timezones |grep Europe

Obtendríamos como resultado:

Cambiar la zona

Una vez seleccionada la zona a cambiar se puede hacer o cambiando en enlace a mano o con el comando:

sudo timedatectl set-timezone Nueva_Zona

Por ejemplo:

sudo timedatectl set-timezone Europe/London