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


20 sept 2010

Sistema de Backup con rsync

Hoy me encuentro con la necesidad de poseer un sistema de backups ágil y dinámico para los sites que tengo hosteados. Ya había leído y escuchado de rsync, aunque nuca visto su potencial. Y debo decir que es magnifico, permite realizar backups de directorios completos manteniendo sus atributos, backups incrementales de los datos que "solo han sido modificados" (discerniendo los  archivos que han sido modificados y los suprimidos) .... EPETACULARRR !!!
Basta de vueltas aca va mi sencillo script:



#!/bin/bash
#Develepr By: Alejandro Andino =)
#set -x
export PATH=$PATH:/usr/bin:/usr/local/bin:/bin
# Directorio que se quiere backapear
from="/home/usr/"
# Donde se va a guardar el backup. Este es un site remoto mount.cifs
to="/home/usr/Storage"
# Patrones que no se copiaran desde el source
exclude=$HOME/rsync_pattern.txt
# Nombre del dir que contendra los cambios incrementales
incremental_dir=`date +%d-%m-%Y_%H%M`
# Opciones rsync
rsync_option="--force --ignore-errors --delete --delete-excluded --exclude-from=${exclude} --backup --backup-dir=${to}/${incremental_dir} -av"

/usr/bin/rsync $rsync_option $from $to

#NOTA:
#       1) Se realiza una copia completa del directorio en $to
#       2) Se crea el directorio incremental $to/$incremental (vacio la primera vez)
#               Lugar donde se almacenaran los archivos modificados y eliminados.
#       3) Si se crea un nuevo archivo/dir esta aparece por primera vez dentro del dir
#               de backup principal (main), no en el incremental.

Agregamos en /etc/rc.local el recurso remoto donde se almacena los backups de modo que cada vez que se inicie el equipo este el mismo disponible.

mount.cifs //StorageHost/DirBackup /home/usr/Storage/ -o user=usrDomain,domain=xxx,password=xxxx,rw,uid=usrOwnerFiles

Y bualá... un sistema de backup a nuestra medida, solo queda programarlo en el crontab.