26 sept 2010

Linux - Clock - Time - TimeZone (Parte I)

En el año 2009 en Argentina, tuvimos durante un periodo corto, hasta tres horarios distintos en todo el país, algo no habitual y problemático ya que la localización de los sistemas operativos (DST) no estaban preparados para ello. Existen circunstancia en las que determinadas aplicaciones y BD no pueden sufrir cambios inesperados en sus relojes, ya que puede ser catastrófico y hasta implicar acciones legales. En este post voy explicar, sin entrar en demasiados detalles, como linux administra sus relojes.

Linux distingue dos tipos de relojes, el de la BIOS o RTC (hwclock) y el del sistema, mantenido por el kernel de linux (sysclock) . El hardware clock es utilizado para salvaguardar el time (fecha/hora)  cuando el sistema se reinicia o apaga. Al iniciar, el sistema toma la fecha/hora desde la BIOS y la setea en el sistema (sysclock) con hwclock --systz. Cuando el sistema está siendo reiniciado o apagado, la secuencia es la inversa, sysclock setea al RTC con hwclock --systohc. Como se puede observar /sbin/hwclock es utilizado para copiar el time entre estos dos relojes. En algunas implementaciones de Linux, el hardware clock se actualiza cada 11min desde el sysclock. Pero eso no es todo, existen pequeñas desviaciones o errores de exactitud entre ambos relojes, estos porcentajes de desviación son almacenados en el archivo /etc/adjtime y corregidos por la función adjtimex(). La cual puede producir una aceleración o retraso (dependiendo si el factor delta es positivo o negativo) en la frecuencia del hardware clock, para producir la corrección (esto me hace acordar a un post de hace tiempo),  no es una corrección inmediata sino gradual que se produce con el tiempo por el cambio de frecuencia. Cuando se llama a hwclock --syshc este ajuste (/etc/adjtime) es tomado en consideración.

Bien ahora, alguien se habrá preguntado, ¿ por que cornos hay una distinción al setar el hwclock en UTC o localtime y por que suele venir por default a UTC=true?
Al principio estaba convencido que era para complicarnos la vida y tomar esa desición de dejar UTC=true ó cambiar a UTC=false, perooo no no.
La idea es simple, ahora que la entiendo, no generar variaciones bruscas al RTC al producirse los cambios de horarios entre las estaciones del año en los distintos países del mundo. Si dejamos UTC=true el hwclock tendra siempre el mismo time como si fuese el Meridiano de Greenwich y el sysclock al iniciar el sistema tomara el hwclock al cual le +/- el time zone de /etc/localtime lo que dará nuestra hora local. Sin importar la estación del año, la ahora del hardware clock es siempre la misma, evitando que se produzcan cambios que puedan afectar el clock-surce del hardware.

Glosario:
RTC = Real Time Clock ~= CMOS clock ~= Hardware Cloc
DST= Daylight Savings Time (Horario de Verano)

Referencias:
Linux, Clocks, and Time
How Linux Keeps Track of Time
Time, Date, and Time Zones for Red Hat Linux
Gentoo Linux Localization Guide