Manteniendo La Hora

"Time is an illusion. Lunchtime double so." (Douglas Adams.)

En este captulo se explica como un sistema Linux mantiene la fecha y hora,
y lo que debe conocer para evitar problemas.
Usualmente no es necesario realizar
ninguna actividad, pero es bueno entender su funcionamiento.

Zonas horarias
Las mediciones horarias estn basadas en su mayora a fenmenos naturales regulares, 
como por ejemplo, los periodos alternados de luz y oscuridad
causados por la rotacin del planeta. El tiempo total tomado por dos perodos 
sucesivos es constante, pero la duracin del perodo de luz vara 
con respecto al de oscuridad. Una constante simple es la luz del medioda.

El medioda es el momento del da en el cual el Sol se encuentra en la posicin ms alta. 
Debido a la rotacin de la Tierra, el momento del medioda sucede en diferentes 
momentos en diferentes lugares. Esto nos conduce al concepto de hora local. 
La hora se mide en muchas unidades, y con frecuencia, estas
mediciones estn relacionadas a fenmenos naturales como la luz del medioda. 
En caso de que permanezca siempre en el mismo lugar, las diferencias entre los
horarios locales no tienen mucha importancia.

En cuanto necesite comunicarse con lugares distantes, notar la necesidad de una
hora en comn. Hoy en da, la mayora de los lugares en el mundo deben 
comunicarse con otros, por lo que se defini un estndar mundial de medicin
horaria. Este estndar se llama hora universal (UT o UTC, formalmente 
conocido como Greenwich Mean Time o GMT, debido a que se utiliza como hora 
local en Greenwich, Inglaterra). Cuando personas con diferentes horas locales 
necesitan comunicarse, pueden expresar el tiempo en hora universal,
para que no exista confusin acerca de cuando deben suceder las cosas.

Cada hora local es llamada zona horaria (time zone), y existen 24 zonas horarias 
en el planeta. Aunque geogrficamente es posible pensar que todos los lugares 
en donde el medioda suceda en el mismo momento tienen la misma zona horaria, 
polticamente no siempre esto es posible. Por diversas razones, varios pases 
adoptan el "horario de verano" (daylight savings time) para atender las demandas
econmicas. Los pases que adoptan el "horario de verano" cambian la hora 
de sus relojes en verano (en gral. se retrasan los relojes una hora) para 
tener ms luz natural mientras trabajan (durante la tarde), y vuelven a adelantar 
la hora de sus relojes en otoo u invierno. Otros pases no adoptan estos procedimientos.
Los pases que utilizan horarios de verano no tienen un acuerdo comn de cuando deben 
modificarse los relojes, y cambian, adems, las reglas ao tras ao. Por lo que las
conversiones de zonas horarios son definitivamente no-triviales.

Las zonas horarias son denominadas de mejor manera a travs de su ubicacin o por
la diferencia entre la hora universal y la hora local. En los Estados Unidos y 
en algunos otros pases, las zonas horarias locales tienen un nombre y una abreviatura 
de tres letras. Las abreviaturas no son nicas, por lo que no deberan
ser utilizadas sin que aparezca tambin el nombre del pas. Es mejor referirse a la 
la hora local en Helsinki, que referirse a la hora del Este de Europa, debido a que
no todos los pases del Este de Europa adoptan las mismas reglas.

Linux tiene un paquete de zonas horarias que reconoce todas las zonas horarias existentes, 
y puede ser fcilmente actualizado cuando las reglas cambian. Todo lo que un administrador de 
sistemas necesita hacer es seleccionar la zona horaria apropiada. Cada usuario tambin
puede establecer su propia zona horaria; por lo que facilita el trabajo de mucha gente,
debido a que muchas personas trabajan en diferentes pases a travs de Internet.
Cuando las reglas del "horario de verano" cambia en su zona horaria local, asegrese
de actualizar al menos la zona horaria del sistema. Adems de configurar la zona horaria
del sistema y de actualizar los archivos de datos de zonas horarias de vez en cuando, 
no hay mucho de que preocuparse con respecto al tiempo.


Los relojes de software y hardware

Una computadora personal tiene un reloj de hardware alimentado por una batera. 
Esa batera asegura que el reloj contine trabajando an cuando la computadora se encuentre sin 
suministro elctrico. El reloj de hardware puede ser modificado (o definido)
desde la pantalla de configuracin de la BIOS o desde cualquier sistema operativo.
el kernel Linux mantiene la fecha y hora de manera independiente al reloj de hardware. 
Durante el inicio de un sistema Linux, el kernel configura su propio reloj de software accediendo
a la fecha y hora mantenida por el reloj de hardware.
Luego, ambos relojes trabajan independientemente. 
Linux mantiene su propio reloj debido a que leer el reloj de hardware constantemente es lento y complicado.

El reloj del kernel siempre muestra la hora universal, por lo que
no necesita conocer como utilizar usos horarios. La simplicidad de este 
modo de trabajar proporciona alta confiabilidad y facilita actualizar 
la informacin de la zona horaria. Cada proceso realiza las conversiones de zona horaria 
de manera independiente (utilizando herramientas estndar que son parte del paquete de zona horaria).

El reloj de hardware puede estar en formato de hora local u hora universal. 
Usualmente es mejor que el reloj de hardware mantenga la hora universal,
porque de esta manera no ser necesario modificar la hora del reloj cuando el "horario de verano" 
(daylight savings time) empiece o finalice (UTC no tiene DST). Desafortunadamente, algunos sistemas operativos de PC
(incluyendo a MS-DOS, Windows y OS/2) asumen que el reloj de hardware muestra la hora local. 
Linux puede manejar cualquiera de los dos formatos, pero si el reloj de hardware muestra la hora local, 
entonces debe modificarlo cada vez que el "horario de verano" empiece o finalice. 


Configurar y visualizar la hora

En Linux, la zona horaria del sistema es determinada por /etc/localtime (algunas veces
es un enlace simblico). Si es un enlace, entonces apunta a un archivo de datos de zona horaria 
que describe la zona horaria local. Los archivos de datos de zonas horarias estn ubicados en 
/usr/lib/zoneinfo o /usr/share/zoneinfo. (Otras distribuciones de Linux pueden llegar 
a determinar la zona horaria del sistema de manera diferente.)

Por ejemplo, en un sistema SuSE ubicado en New Jersey, /etc/localtime apuntara a /usr/share/zoneinfo/US/Eastern.

Si no encuentra el directorio zoneinfo en /usr/lib o en /usr/share, intente encontrarlo ejecutando
find /usr -type d -name zoneinfo, o consulte la documentacin de su distribucin Linux.

Qu sucede cuando existen usuarios utilizando el mismo sistema pero se encuentran ubicados en 
zonas horarias diferentes?
Un usuario puede cambiar su zona horaria privada definiendo la variable del ambiente TZ. 
Si TZ no se encuentra definida, entonces la zona horaria del sistema es la utilizada.
La sintaxis de la variable TZ se encuentra descripta en la pgina de manual de tzset.

El comando date muestra la hora y fecha actuales. Por ejemplo:
$ date
Sun Jul 14 21:53:41 EET DST 1996
$
Domingo, 14 de julio de 1996, alrededor de las 10 menos 10 de la noche, en la zona horaria llamada "EET DST" 
(la cual puede ser el "horario de verano" del Da del Este de Europa). 
date puede tambin mostrar la hora en forma universal:
$ date -u
Sun Jul 14 18:53:42 UTC 1996
Sun Jul 14 18:53:42 UTC 1996
$
date tambin se utiliza para establecer la hora del reloj del kernel:
# date 07142157
Sun Jul 14 21:57:00 EET DST 1996
# date
Sun Jul 14 21:57:02 EET DST 1996
#
Lea la pgina de manual de date si desea conocer mayores detalles; ya que la sintaxis es un poco complicada. 
Solo el usuario root puede modificar la fecha y/u hora. Aunque cada usuario puede definir su propia zona horaria, 
el reloj es el mismo para todos.

Date solo muestra o modifica el reloj de software. El comando clock sincroniza los relojes de hardware y software.
Cuando el sistema inicia, el comando clock es utilizado para leer el reloj de hardware y actualizar
el reloj de software. Si necesita modificar ambos relojes, primero debe modificar el reloj de software con date, 
y luego sincronizar la hora del reloj por hardware con el comando clock -w.

La opcin -u en el comando clock le indica a clock que la fecha y hora (mostrada o definida)
se encuentra en formato de hora universal. Debe utilizar la opcin -u correctamente, en 
caso contrario, la computadora puede estar confundida sobre cual es la fecha y hora correcta.

Los relojes deben modificarse con cuidado y precisin. 
Muchas partes de un sistema UNIX requieren que los relojes trabajen correctamente. 
Por ejemplo, el demonio cron ejecuta comandos peridicamente. Si cambia el reloj, el sistema puede 
estar confundido en cuanto a la necesidad o no de ejecutar determinado comando.
Hubo una vez, en un sistema UNIX antiguo, en donde alguien adelant el reloj 20 aos en el futuro, y 
entonces cron quiso ejecutar 
los comandos peridicos de veinte aos, todos de una sola vez. 
Las versiones actuales de cron no tienen este problema, pero an as debe ser cuidadoso con estos
detalles (pueden existir otros programas actuales que trabajen similarmente mal como "ese" viejo cron).

Grandes saltos en el tiempo (hacia el futuro o el pasado) son mas peligrosos que pequeas diferencias.


Cuando el reloj es errneo

El reloj por software de un sistema Linux no siempre es preciso. Para mantener este reloj
Linux utiliza una interrupcin peridica generada por el hardware, llamada "timer interrupt".
En caso de que existan muchos procesos siendo ejecutados (con respecto a los recursos disponibles)
el sistema podra demorar un poco al momento de intentar servir la interrupcin, por lo que 
el reloj de software puede estar ligeramente atrasado. El reloj por hardware trabaja
independientemente del sistema operativo, as que usualmente es mas preciso. 
Si re-inicia de manera frecuente la computadora (como es el caso para la mayora de los
sistemas que no son servidores) el reloj debe encontrarse prcticamente correcto.

Si es necesario modificar el reloj de hardware, la manera mas simple es reiniciar el sistema,
ingresar a la pantalla de configuracin de la BIOS y realizar el cambio de fecha y hora desde
ah. Esta manera evita todos los problemas que podran suceder si se modifica el reloj desde 
el sistema. Si la modificacin desde la configuracin de la BIOS no se puede realizar, modifique
el reloj utilizando date y clock (en ese orden), pero est preparado para reiniciar Linux, si
alguna parte del sistema comienza a actuar de manera extraa, mal y/o divertida. :)

Otro mtodo posible para sincronizar el reloj de software es utilizar hwclock -w o hwclock --systohc.
Ambos comandos obtienen la fecha y hora desde el reloj de hardware y modifican el reloj de software.
Si en cambio desea sincronizar de manera inversa (modificar el reloj de hardware con la fecha y 
hora del reloj de software) entonces puede utilizar el comando hwclock -s o el comando
hwclock --hctosys. Si desea conocer mayores detalles de este comando lea su pgina de manual
ejecutando man hwclock.



13.5. NTP - Protocolo de reloj en red

Un ordenador conectado en red (incluso nicamente con un mdem) puede 
comprobar su propio reloj de forma automtica comparndolo con la hora 
de otro ordenador que se sabe almacena la hora de forma precisa. El 
protocolo de reloj en red (o NTP) hace esto exactamente. Es un mtodo para 
verificar y corregir la hora de su ordenador al sincronizarse con otro 
sistema. Con NTP su sistema puede mantenerse a milisegundos de la Hora 
Universal Coordinada. [50]

Para la mayora de usuarios ocasionales de Linux, esto puede resultar 
simplemente un lujo. En mi casa todos los relojes se ajustan en base a 
la hora que mi sistema Linux dice que es. Para grandes organizaciones 
este "lujo" puede convertirse en fundamental. Ser capaz de buscar sucesos 
en los archivos de diario basndose en la hora puede hacer la vida 
bastante ms sencilla y puede eliminar mucho "trabajo de adivinacin" 
durante la depuracin.

Otro ejemplo de cuan importante puede ser NTP es con SAN. Algunos SAN 
necesitan NTP para configurarse y funcionar adecuadamente para permitir 
la correcta sincronizacin durante el uso del sistema de ficheros, y un 
control adecuado de las marcas de tiempo. Algunos SAN (y algunas 
aplicaciones) pueden confundirse cuando tratan con archivos que tienen marcas 
de tiempo que estn en el futuro.

La mayora de las distribuciones Linux vienen con un paquete NTP de 
algn tipo, ya sea un paquete .deb o .rpm. Puede utilizarlo para instalar 
NTP, o puede bajarse el cdigo fuente de 
http://www.ntp.org/downloads.html y compilarlo usted mismo. En 
cualquier caso, la configuracin bsica es la misma.


13.6. Configuracin bsica de NTP

El programa NTP se configura utilizando el archivo /etc/ntp.conf o 
/etc/xntp.conf dependiendo de qu distribucin Linux tenga. No entrar 
ahora en demasiados detalles sobre cmo configurar NTP. En su lugar cubrir 
slo lo bsico.

Un ejemplo de archivo ntp.conf debera parecer:

# --- GENERAL CONFIGURATION ---
server	aaaa.bbb.ccc.ddd
server	127.127.1.0
fudge	127.127.1.0 stratum 10

# Drift file.

driftfile /etc/ntp/drift

El archivo ntp.config ms bsico simplemente listar 2 servidores, uno 
con el que le gustara sincronizarse, y una direccin pseudo-IP para l 
mismo (en este caso 127.127.1.0). La pseudo-IP se utiliza en el caso de 
errores en la red o si cae el servidor NTP remoto. NTP sincronizar 
consigo mismo hasta que pueda empezar a sincronizar de nuevo con el 
servidor remoto. Se recomienda que se pongan al menos 2 servidores remotos 
con los que pueda sincronizarse. Uno actuar como servidor primario y el 
otro como copia de respaldo.

Tambin debe ponerse una ubicacin para el archivo de fluctuacin. De 
vez en cuando NTP "aprender" el error que se comete en el reloj de 
sistema y automticamente se ajustar.

La opcin de restriccin puede usarse para otorgar un mejor control y 
seguridad adems de la que proporciona NTP, y quin puede efectuarla. 
Por ejemplo:

# Prohibit general acces to this service.
restrict default ignore

# Permit systems on this network to synchronize with this
# time service. But not modift our time.
restrict aaa.bbb.ccc.ddd nomodify

# Allow the following unrestricted acces to ntpd

restrict aaa.bbb.ccc.ddd
restric 127.0.0.1

Est avisado: debe esperar hasta que tenga NTP trabajando adecuadamente 
antes de aadir la opcin de restriccin. Puede accidentalmente 
restringirse usted mismo de sincronizarse y perder tiempo buscando el por qu.

NTP corrige el sistema lentamente. Sea paciente! Una simple prueba es 
cambiar el reloj de sistema en 10 minutos antes de irse a la cama y 
comprobarlo cuando se levante. La hora deber ser la correcta.


13.7. La herramienta NTP

Hay innumerables utilidades disponibles para comprobar si NTP est 
haciendo su trabajo. El comando ntpq -p mostrar el estado de la hora 
actual de su sistema.

# ntpq -p
	remote		refid		  st  t	when	poll	reach	delay	  offset	   jitter
=================================================================
*cudns.cit.corne  ntp0.usno.navy.	  2  u	832	1024	377	43.208	  0.361	   
2.646
LOCAL(0)	     LOCAL(0)		10  1	13	64	377	0.000	  0.000	   0.008

ntpdc -c loopinfo mostrar cmo de desviado est el reloj del sistema 
en segundos, basndose en la ltima vez que se contact con el servidor 
remoto.

# ntpdc -c loopinfo
offset:			-0.004479 s
frecuency:		133.625 ppm
poll adjust:		30
watchdog timer:	404 s

ntpdc -c kerninfo mostrar la correccin actual acumulada.

# ntpdc -c kerninfo
pll offset:		-0.003917 s
pll frecuency:		133.625 ppm
maximum error:	0.391414 s
estimated error:	0.003676 s
status:			0001	pll
pll time constant:	6
precision:		1e-06 s
frecuency tolerance:	512 ppm
pps frecuency:		0.000 ppm
pps stability:		512.000 ppm
pps jitter:		0.0002 s
calibration interval:	4 s
calibration cycles:	0
jitter exceeded:	0
stability exceeded:	0
calibration errors:	0

Una versin ligeramente distinta de ntpdc -c kerninfo es ntptime

# ntptime
ntp_gettime() returns conde 0 (OK)
  time c35e2cc7.879ba000  Thu,  Nov  13  2003  11:16:07.529,  
(.529718),
  maximum  error  425206  us,  estimated  error  3676  us
ntp_adjtime()  returns  code  0  (OK)
modes  0x0  (),
offset  -3854.000 us, frecuency  133.625 ppm,  interval  4  s,
maximum  error  425206  us,  estimated  error  3676  us,
status  0x1  (PLL),
time  constant  6, precision  1.000  us,  tolerance  512  ppm,
pps frecuency  0.000 ppm,  stability  512.000  ppm,  jitter  200.000  
us,
interval  0,  jitter  exceeded  0,  stability  exceeded 0,  errors  0.

Existe todava otra manera de ver cmo de bien est trabajando NTP con 
el comando ntpdate -d. ste contactar con un servidor NTP y 
determinar la diferencia de tiempos pero no modificar el reloj de su sistema.

# ntpdate  -d  132.236.56.250
13  Nov  14:42:17  ntpdate[29631] :  ntpdate  4.1.1c-rc1@1.836  Thu  
Feb  13  12:17:20  EST   2003  (1)
transmit(132.236.56.250)
receive(132.236.56.250)
transmit(132.236.56.250)
receive(132.236.56.250)
transmit(132.236.56.250)
receive(132.236.56.250)
transmit(132.236.56.250)
receive(132.236.56.250)
transmit(132.236.56.250)
server 132.236.56.250,  port 123
stratum  2, precision  -17,  leap  00,  trust  000
refid  [192.5.41.209],  delay  0.06372,  dispersion  0.00044
transmitted  4,  in filter  4
reference  time:	c35e5998.4a46cfc8  Thu,  Nov  13  2003  14:27:20.290
originate  timestamp:  c35e5d55.d69a6f82  Thu,  Nov  13  2003  
14:43:17.838
transmit  timestamp:	c35e5d55.d16fc9bc  Thu,  Nov  13  2003  
14:43:17.818
filter  delay:	0.06522	0.06372	0.06442	0.06442
	0.00000	0.00000	0.00000	0.00000
filter offset:	0.000036	0.001020	0.000527	0.000684
	0.000000	0.000000	0.000000	0.000000
delay  0.06372,  dispersion  0.00044
offset  0.001020

13  Nov  14:43:17  ntpdate[29631] :  adjust  time  server  
132.236.56.250  offset  0.001020 sec

Si quiere ver al sistema sincronizarse en tiempo real puede utilizar 
ntptrace.

# ntptrace  132.236.56.250
cudns.cit.cornell.edu:  stratum  2,  offset -0.003278,  synch  distance  
0.02779
dtc-truetime.ntp.aol.com:  stratum  1,  offset  -0.014363,  synch  
distance  0.00000, refid 'ACTS'

Si necesita sincronizar su sistema inmediatamente puede utilizar 
ntpdate remote-servername para forzar una sincronizacin. Sin esperas!

# ntpdate  132.236.56.250
13  Nov  14:56:28  ntpdate[29676] :  adjust  time  server  
132.236.56.250  offset  -0.003151  sec


13.8. Algunos servidores NTP conocidos

Una lista de servidores pblicos puede obtenerse de: 
http://www.eecis.udel.edu/~mills/ntp/servers.html. Por favor lea la 
informacin de utilizacin de la pgina antes de utilizar un servidor. No 
todos los servidores tienen el suficiente ancho de banda para permitir 
un gran nmero de sistemas sincronizndose con ellos. As que es buena 
idea contactar con el administrador de sistemas antes de utilizar su 
servicio NTP.


13.9. Enlaces NTP

Informacin ms detallada sobre NTP puede obtenerse de la pgina 
original NTP: http://www.ntp.org, o de 
http://www.ntp.org/ntpfaq/NTP-a-faq.htm


