108.1 Lección 1
Certificación: |
LPIC-1 |
---|---|
Versión: |
5.0 |
Tema: |
108 Servicios Esenciales del Sistema |
Objetivo: |
108.1 Mantener el tiempo 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 el próximo tema.
Tiempo 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
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 el próximo tema).
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
Si 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. Podría hacerse usando
systemctl
pero lo
mostraremos 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 del
comando:
# date --set="11 Nov 2011 11:11:11"
Tenga en cuenta que se requieren privilegios de root para fijar la fecha. 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.