2.4.1. Configuración de hora

En una máquina hay dos horas diferenciadas:

  • La hora del reloj de hardware, también llamada hora RTC, y que conserva la pila cuando el sistema está apagado y el ordenador desenchufado de una fuente de corriente.

  • La hora del sistema operativo.

Al arrancar el sistema, éste toma la hora RTC y, aunque esto pudiera significar que siempre coinciden, no tiene por qué ser así:

  • Es muy común que la hora RTC exprese la hora UTC, mientras que el reloj del sistema la hora local (en España, la hora CET). En algún lugar de la configuración estará definido si la hora RTC es la UTC o la local.

  • La hora del sistema puede sincronizarse con un servidor de hora mediante el protocolo NTP que es, en realidad, lo más recomendable, porque la hora del servidor siempre será más fiable que la hora RTC.

Por supuesto, también puede copiarse la hora del sistema al reloj del hardware. De hecho, el reloj del hardware no se caracteriza por su fiabilidad[1], por lo que es muy recomendable hacerlo si la del sistema se sincroniza con un servidor externo.

Las fecha y hora antes de systemd.

Tradicionalmente, para configurar la hora desde la shell se han venido usando varias órdenes:

date(1)

Que establece la hora del sistema con la opción -s. No nos interesa ya este uso, pero sigue siendo muy útil para averiguar la hora del sistema en cualquier formato que se nos ocurra:

# date
mié feb  3 10:04:07 CET 2021
# date +'%H:%M - %d/%m/%Y'
10:04 - 03/02/2021

El modo de introducir el formato de salida de la hora esta documentado en la página del manual. También tiene mucho interés para convertir una hora a un formato de salida distinto, ya que con la opción -d se puede hacer que la hora de referencia no sea la del sistema sino una arbitraria. La forma de expresar esta hora de referencia está explicada en la documentación info (quizás tenga que instalar el paquete info para poder leerla):

# info date
hwclock(8)

Se utilizaba para consultar o establecer la hora RTC, bien manualmente o bien copiándola de la del sistema. A diferencia de date que sigue siendo útil para consulta, este comando no tiene ya excesiva utilidad.

Paquete tzdata

Este paquete permitía escoger el huso horario para determinar cuál es nuestra hora local:

# dpkg-reconfigure tzdata

El resultado de la selección (p.e. «Europe/Madrid») se almacena en /etc/timezone.

Además, en /etc/default/rcS se especificaba si la hora RTC representaba la UTC o la local.

Un cliente NTP

Para poder sincronizar la hora con un servidor externo se utilizaba un cliente como ntpdate o sntp.

Configuración moderna

Actualmente, sin embargo, toda la configuración (la de ambos relojes, la del huso horario, la de si se usa UTC en el reloj de hardware y la de si se sincroniza o no la hora), se realiza mediante la orden timedatectl(1):

$ timedatectl status
               Local time: mié 2021-02-03 20:57:00 CET
           Universal time: mié 2021-02-03 19:57:00 UTC
                 RTC time: mié 2021-02-03 19:57:00
                Time zone: Europe/Madrid (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Toda la configuración puede hacerse a través de esta orden de manera bastante sencilla: basta con leer su paǵina de manual. Lo aconsejable es:

  • Que este habilitada la sincronización con NTP.

  • Que la hora RTC refleje la hora UTC.

La propia orden facilita información sobre el protocolo NTP (p.e.los servidores con los que se sincroniza), pero no suele ser necesario hacer cambios, a menos que deseemos converir nuestra máquina en un servidor NTP para la red local, en cuyo caso deberemos deshabilitar la sincronización porque de ella se encargará el propio software del servidor.

Nota

Esta orden al establecer la hora, fija la hora local del sistema y solidariamente, establecerá la hora RTC según deba reflejar la hora UTC o la hora local.