108.1 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
108 Servicios esenciales del sistema |
Objetivo: |
108.1 Mantener la hora del sistema |
Lección: |
1 de 2 |
Introducción
Mantener la exactitud de la hora es absolutamente crucial para la informática moderna, sin embargo,su implementación es sorprendentemente compleja.. La práctica de mantener la hora parece trivial para un usuario final, pero el sistema necesita ser capaz de manejar muchas idiosincrasias y casos extremos de forma inteligente. Hay que tener en cuenta que las zonas horarias no son estáticas, sino que pueden modificarse por una decisión administrativa o política. Un país puede optar por dejar de utilizar el horario de verano. Cualquier programa debe ser capaz de manejar esos cambios de forma lógica. Afortunadamente para los administradores de sistemas, las soluciones para el control de la hora en el sistema operativo Linux son maduras, robustas y generalmente funcionan sin mucha interferencia.
Cuando un equipo informático Linux arranca, empieza a mantener el tiempo. Nos referimos a esto como un reloj del sistema, ya que es actualizado por el sistema operativo. Además, los ordenadores modernos también tendrán un reloj de hardware o de tiempo real. Este reloj de hardware es a menudo una característica de la placa madre y matiene la hora independientemente de si el ordenador está funcionando o no. Durante el arranque, la hora del sistema se ajusta desde el reloj de hardware, pero en la mayoría de los casos estos dos relojes funcionan independientemente el uno del otro.
En la mayoría de los sistemas modernos de Linux, la hora del sistema y del hardware están sincronizados con el tiempo de la red, que se implementa mediante el Protocolo de Tiempo de Red (NTP). En la gran mayoría de los casos, la única configuración que un usuario normal tendrá que hacer es establecer su zona horaria y el NTP se encargará del resto. Sin embargo, cubriremos algunas formas de trabajar con la hora manualmente y los detalles de la configuración de la hora de red se tratarán en la próxima lección.
=== Local vs TIempo Universal
El reloj del sistema está ajustado al Tiempo Universal Coordinado (UTC), que es la hora local de Greenwich, Reino Unido. Normalmente un usuario quiere saber su hora local
. La hora local se calcula tomando la hora UTC y aplicando un offset basado en la zona horaria y en un "Horario de verano" De esta manera, se puede evitar mucha complejidad.
El reloj del sistema puede ajustarse a la hora UTC o a la hora local, pero se recomienda que se ajuste a la hora UTC.
Date
El comando date
es una utilidad básica que simplemente imprime la hora local:
$ date Sun Nov 17 12:55:06 EST 2019
Modificar las opciones del comando date
cambiará el formato de la salida.
Por ejemplo, un usuario puede usar date -u
para ver la hora UTC actual.
$ date -u Sun Nov 17 18:02:51 UTC 2019
Algunas otras opciones de uso común devolverán la hora local a un formato que se adhiere a un modelo RFC aceptado:
-I
-
Fecha/hora en formato ISO 8601. Si se añade
date
(-Idate
) se limitará la salida a la fecha solamente. Otros formatos sonhours
para horas,minutes
para minutos,seconds
para segundos yns
para nanosegundos. -R
-
Devuelve la fecha y la hora en formato RFC 5322.
--rfc-3339
-
Devuelve la fecha y la hora en formato RFC 3339.
El formato de date
puede ser personalizado por el usuario con secuencias especificadas en la página de manual. Por ejemplo, la hora actual puede ser formateada como la hora de Unix de esta manera:
$ date +%s 1574014515
En la página del manual de date
podemos ver que %s
se refiere al tiempo de Unix.
El tiempo Unix se utiliza internamente en la mayoría de los sistemas tipo Unix. Almacena la hora UTC como el número de segundos desde Epoch, que ha sido definido como el 1 de enero de 1970.
Note
|
El número de bits necesarios para almacenar el tiempo de Unix en el presente es de 32 bits. Hay un problema futuro en el que 32 bits serán insuficientes para contener la hora actual en formato Unix. Esto causará serios problemas para cualquier sistema Linux de 32 bits. Afortunadamente, esto no ocurriría sino hasta el 19 de enero de 2038. |
Utilizando estas secuencias, somos capaces de dar formato a la fecha y la hora en casi cualquier formato requerido por cualquier aplicación. Por supuesto, en la mayoría de los casos es preferible atenerse a una norma aceptada.
Además, date --date
puede usarse para dar formato a una hora que no es la actual. En este escenario, un usuario puede especificar la fecha que se aplicará al sistema utilizando la hora de Unix, por ejemplo:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
Usar la opción --debug
puede ser muy útil para asegurar que una fecha pueda ser analizada con éxito. Observe lo que sucede cuando se pasa una fecha válida al comando:
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Esta puede ser una herramienta útil cuando se trata de resolver problemas con una aplicación que genera una fecha.
Reloj de hardware
Un usuario puede ejecutar el comando hclock
para ver como la hora se mantiene en el reloj en tiempo real. Este comando requerirá privilegios elevados, por lo que en este caso usaremos sudo
para ejecutar al comando:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
Usando la opción --verbose
la salida del comando tendrá más detalles que pueden ser útiles para la resolución de problemas:
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Fíjese en la línea que contiene Calculated Hardware Clock drift
. Esta salida puede decirle si la hora del sistema y la del hardware se desvían una de otra.
timedatectl
timedatectl
es un comando que puede utilizarse para comprobar el estado general de la hora y la fecha, incluyendo si la hora de red se ha sincronizado o no (dicho protocolo se tratara en la próxima lección.
Por defecto timedatectl
devuelve información similar a date
, pero con la adición de la hora RTC (hardware) así como el estado del servicio NTP:
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Ajustar el tiempo utilizando timedatectl
No hay un servidor NTP disponible, se recomienda usar timedatectl
en lugar de date
o hwclock
para fijar la hora:
# timedatectl set-time '2011-11-25 14:00:00'
El proceso es similar a date
. El usuario también puede establecer la hora independientemente de la fecha usando el formato HH:MM:SS.
Ajustar la zona horaria utilizando timedatectl
timedatectl
es la forma preferida de establecer la zona horaria local en sistemas Linux basados en Systemd
cuando no existe una interfaz gráfica. Timedatectl
listará posibles zonas horarias y luego la zona horaria puede ser establecida usando una de estas como argumento.
Primero haremos una lista de posibles zonas horarias:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
La lista de posibles zonas horarias es larga, por lo que en este caso se recomienda el uso del comando grep
.
A continuación podemos establecer la zona horaria usando uno de los elementos de la lista que fue devuelto:
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Tenga en cuenta que el nombre de la zona horaria debe ser exacto. Africa/Cairo
por ejemplo cambiará la zona horaria, pero cairo
o africa/cairo
no lo hará.
Desactivar NTP usando timedatectl
En algunos casos podría ser necesario desactivar NTP. Esto podría hacerse usando systemctl
pero lo demostraremos usando timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Establecer la zona horaria sin timedatectl
La configuración de la información de la zona horaria es un paso estándar cuando se instala Linux en una nueva máquina. Si hay un proceso de instalación gráfico, lo más probable es que se maneje sin ninguna otra entrada del usuario.
El directorio /usr/share/zoneinfo
contiene información de las diferentes zonas horarias posibles. En el directorio zoneinfo
, hay subdirectorios que contienen los nombres de los continentes así como otros enlaces simbólicos. Se recomienda encontrar el zoneinfo
de su región a partir de su continente.
Los archivos zoneinfo
contienen las reglas necesarias para calcular el desfase de la hora local en relación con UTC, y también son importantes si su región hace uso del horario de verano. El contenido de /etc/localtime
será leído cuando Linux necesite determinar la zona horaria local. Para establecer la zona horaria sin el uso de una interfaz gráfica, el usuario debe crear un enlace simbólico para su ubicación desde /usr/share/zoneinfo
a /etc/localtime
. Por ejemplo:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Después de establecer la zona horaria correcta, se recomienda ejecutar:
# hwclock --systohc
Esto ajustará el reloj de hardware desde el reloj de sistema (es decir, el reloj de tiempo real se ajustará a la misma hora que date
). Tenga en cuenta que este comando se ejecuta con privilegios de root, en este caso se ejecutó desde una session de root.
/etc/timezone
es similar a /etc/localtime
. Es una representación de datos de la zona horaria local, y como tal puede ser leída usando cat
:
$ cat /etc/timezone America/Toronto
Tenga en cuenta que este archivo no es utilizado por todas las distribuciones de Linux.
Establecer la fecha y la hora sin timedatectl
Note
|
La mayoría de los sistemas modernos de Linux usan |
Utilizando date
date
tiene una opción para ajustar la hora del sistema. Estas son: --set
o -s
para fijar la fecha y la hora. También puede usar --debug
para verificar la sintaxis correcta correcto del comando:
# date --set="11 Nov 2011 11:11:11"
Tenga en cuenta que se requieren privilegios de root para fijar la fecha aquí. También podemos cambiar la hora o la fecha de forma independiente:
# date +%Y%m%d -s "20111125"
Aquí debemos especificar las secuencias para que nuestra cadena sea interpretada correctamente. Por ejemplo, %Y
se refiere al año, y así los primeros cuatro dígitos 2011
se interpretarán como el año 2011. De manera similar, %T
es la secuencia para el tiempo, y se demuestra así:
# date +%T -s "13:11:00"
Después de cambiar la hora del sistema, se recomienda también ajustar el reloj del hardware para que ambos relojes, el del sistema y el del hardware, estén sincronizados:
# hwclock --systohc
systohc
significa “system clock to hardware clock”.
Utilizando hwclock
En lugar de ajustar el reloj del sistema y actualizar el reloj del hardware, puede optar por invertir el proceso. Empezaremos por ajustar el reloj del hardware:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Note que por defecto el hwclock
espera la hora UTC, pero devuelve la hora local por defecto.
Después de ajustar el reloj del hardware, tendremos que actualizar el reloj del sistema a partir de este. hctosys
significa “hardware clock to system clock”.
# hwclock --hctosys
Ejercicios guiados
-
Indique si los siguientes comandos están mostrando o modificando la hora del sistema o la hora del hardware:
Comando(s) Sistema Hardware Ambos date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Observe la siguiente salida, y luego corrija el formato del argumento para que el comando sea exitoso:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Use el comando
date
y las secuencias para que el mes del sistema sea febrero. Deje el resto de la fecha y la hora sin cambios. -
Asumiendo que el comando anterior tuvo éxito, use
hwclock
para ajustar el reloj del hardware desde el reloj del sistema. -
Hay un lugar llamado
eucla
. ¿De qué continente forma parte? Use el comandogrep
para averiguarlo. -
Establezca su zona horaria actual en la de
eucla
.
Ejercicios de exploración
-
¿Qué método de ajuste de tiempo es el óptimo? ¿En qué escenario podría ser imposible el método preferido?
-
¿Por qué cree que hay tantos métodos para lograr lo mismo, es decir, establecer la fecha y hora del sistema?
-
Después del 19 de enero de 2038, Linux System Time requerirá un número de 64 bits para almacenar. Sin embargo, es posible que podamos elegir simplemente establecer un “nuevo epoch”. Por ejemplo, el 1 de enero de 2038 a medianoche podría establecerse una nueva época de
0
. ¿Por qué cree que esto no se ha convertido en la solución preferida?
Resumen
En esta lección aprendió:
-
A mostrar la hora en diferentes formatos desde la línea de comandos.
-
La diferencia entre el reloj del sistema y el reloj del hardware en Linux.
-
Ajustar manualmente el reloj del sistema.
-
Establecer manualmente el reloj del hardware.
-
Cambiar la zona horaria del sistema.
Comandos usados en esta lección:
date
-
Visualizar o cambiar el reloj del sistema. Otras opciones:
-u
-
Muestra la hora UTC.
+%s
-
Usa una secuencia para mostrar el tiempo de la época.
--date=
-
Establece una hora específica para mostrar, en lugar de la hora actual.
--debug
-
Muestra mensajes de depuración al interpretar una fecha introducida por el usuario.
-s
-
Ajusta el reloj del sistema manualmente.
hwclock
-
Muestra o cambia el reloj del hardware.
--systohc
-
Usa el reloj del sistema para ajustar el reloj del hardware.
--hctosys
-
Usa el reloj de hardware para ajustar el reloj del sistema.
--set --date
-
Ajusta el reloj de hardware manualmente.
timedatectl
-
Muestra los relojes del sistema y del hardware, así como la configuración NTP en los sistemas Linux basados en Systemd.
set-time
-
Ajusta la hora manualmente.
list-timezones
-
Lista las posibles zonas horarias.
set-timezone
-
Configura la zona horaria manualmente.
set-ntp
-
Activa/desactiva NTP.
Respuesta a los ejercicios guiados
-
Indique si los siguientes comandos están mostrando o modificando la hora del sistema o la hora del hardware:
Comando(s) Sistema Hardware Ambos date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Observe la siguiente salida, y luego corrija el formato del argumento para que el comando sea exitoso:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Use el comando
date
y las secuencias para que el mes del sistema sea febrero. Deje el resto de la fecha y la hora sin cambios.date +%m -s "2"
-
Asumiendo que el comando anterior tuvo éxito, use
hwclock
para ajustar el reloj del hardware desde el reloj del sistema.hwclock -systohc
-
Hay un lugar llamado
eucla
. ¿De qué continente forma parte? Usa el comandogrep
para averiguarlo.timedatectl list-timezones \| grep -i eucla
o
grep -ri eucla /usr/share/zoneinfo
-
Establezca su zona horaria actual en la de
eucla
.timedatectl set-timezone 'Australia/Eucla'
o
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Respuestas a los ejercicios de exploración
-
¿Qué método de ajuste de tiempo es el óptimo? ¿En qué escenario podría ser imposible el método preferido?
En la mayoría de las distribuciones de Linux, el NTP está habilitado por defecto y debería dejarse que establezca la hora del sistema sin interferencias. Sin embargo, si hay un sistema Linux que no está conectado a Internet, NTP será inaccesible. Por ejemplo, un sistema Linux integrado que funcione en un equipo industrial podría no tener conectividad a la red.
-
¿Por qué crees que hay tantos métodos para lograr lo mismo, es decir, establecer la fecha y hora del sistema?
Dado que el establecimiento del tiempo ha sido un requisito de todos los sistemas *nix durante décadas, hay muchos métodos heredados para establecer el tiempo que aún se mantienen.
-
Después del 19 de enero de 2038, Linux System Time requerirá un número de 64 bits para almacenar. Sin embargo, es posible que podamos elegir simplemente establecer un “nuevo epoch”. Por ejemplo, el 1 de enero de 2038 a medianoche podría establecerse un nuevo epoch de
0
. ¿Por qué crees que esto no se ha convertido en la solución preferida?Para el 2038 la gran mayoría de las computadoras ya estarán funcionando con CPU de 64 bits, y el uso de un número de 64 bits no degradará el rendimiento de manera significativa. Sin embargo, sería imposible estimar los riesgos de “resetear” epoch de tal manera. Hay mucho software antiguo que podría ser afectado. Los bancos y las grandes empresas, por ejemplo, a menudo tienen una gran cantidad de programas antiguos de los que dependen para su uso interno. Así que este escenario, como muchos otros, es un estudio de las compensaciones. Cualquier sistema de 32 bits que siga funcionando en 2038 se vería afectado por un desbordamiento de "Epoch Time", pero el software heredado se vería afectado por el cambio de valor de Epoch.