La hora en LFS

TÍTULO:			La hora en LFS
VERSIÓN LFS:		Cualquiera
AUTOR:			Marc Heerdink <marc@linuxfromscratch.org>
TRADUCTOR:		Proyecto LFS-ES

SINOPSIS:
	Esta es una explicación profunda de las zonas horarias, UTC, la variable de
	entorno TZ y temas similares.

RECETA:
versión 2.1 (04/10/2002)

======
ÍNDICE
======

1 Introducción
2 Local frente a UTC
3 Determinando tu zona horaria
4 Usando la zona horaria
  4.1 Creando los enlaces
  4.2 Cambiando los guiones de arranque
      4.2.1 Inicio estilo SYSV
      4.2.2 Inicio estilo BSD
  4.3 La variable de entorno TZ
5 Sincronizando la hora
  5.1 Eligiendo un servidor NTP
  5.2 Sincronízalo
  5.3 Mantenimiento


===============
1. INTRODUCCIÓN
===============

  La Tierra está dividida en 24 zonas horarias. La zona horaria local depende de 
a cuántas zonas de distancia se encuentra de Greenwich, Gran Bretaña. La 
diferencia horaria es relativa a la zona 0 en Greenwich. Por ejemplo, en 
Holanda (donde vive el autor) estamos en la zona +1 (o sea que aquí es una hora 
más tarde que en Gran Bretaña). Esto es para compensar la rotación de la Tierra 
sobre su eje.
  Tu sistema Linux es multinacional. No sólo habla diferentes idiomas, sino que 
también conoce las zonas horarias. Esta receta te ayudará a configurarlas.
  El segundo capítulo de esta receta es probablemente el más importante, el 
resto depende de la zona que escojas en el capítulo 2. Buena suerte... :)

Envía tus comentarios, sugerencias, cartas de amor y mejoras a:
Marc Heerdink <marc@linuxfromscratch.org>


=====================
2. LOCAL FRENTE A UTC
=====================

  La primera pregunta y la más importante que deberás responder es si quieres 
almacenar en tu máquina la hora en formato UTC o en formato local. UTC es la 
hora en Greenwich, la hora local es la que se muestra en un reloj colgado en 
una pared junto a ti (tm). Cada formato tiene sus ventajas y desventajas, pero 
ambos se discutirán en esta receta.
  Tradicionalmente, todas las máquinas POSIX (por ej. las máquinas con Solaris, 
BSD o también con Linux) usan el formato UTC (Coordinated Universal Time, 
Tiempo Universal Coordinado) para la hora del sistema. Otros SO más estúpidos 
necesitan que los usuarios configuren sus máquinas con la hora local, y estos 
SO son mayormente los de Microsoft. Afortunadamente, Linux puede manejar tanto 
máquinas UTC normales como máquinas que sufren las enfermedades de Microsoft y 
tienen la hora del sistema en formato local. Aún así, recomiendo usar UTC ya 
que es el formato para el que Linux fue concebido originalmente. El uso de la 
hora local sólo es un arreglo temporal.
  En este punto tendrás que decidir qué formato usarás: local o UTC.
Un consejo: Si tienes Windows y Linux juntos en una máquina te recomiendo
que uses hora local, si tienes Windows pero casi no lo usas o directamente
no tienes Windows, es una buena idea usar el formato UTC. Las dos formas
están descritas en esta receta.


===============================
3. DETERMINANDO TU ZONA HORARIA
===============================

  Saber en qué zona horaria vives es importante para continuar con esta
receta. Pero no es suficiente saber a cuántas zonas horarias te encuentras
desde Greenwich, ya que esta elección influye además sobre el cambio de
hora. LFS te provee de un sencillo programa para determinar tu zona con
sólo contestar algunas preguntas (usualmente 2 o 3). Ejecútalo ahora:

 tzselect

  Cuando el programa termina, la última línea indica tu zona. A mí me
indica "Europa/Amsterdam" (sin las comillas) porque yo vivo en Holanda.
Recuerda este valor, escríbelo en un papel o en un fichero de texto. Esta
variable será referenciada como _TIMEZONE_ en el resto de la receta para
simplificar las explicaciones.


=========================
4. USANDO LA ZONA HORARIA
=========================

  Ahora que sabes en qué zona horaria vives podemos poner este conocimiento
en práctica. Este capítulo trata sobre los distintos pasos que necesitas seguir
para configurar tu zona. Cada subcapítulo describe lo que vamos a hacer y te
indica cómo lo haremos. Asumo que estás usando una instalación virgen de LFS.
Si no es este tu caso, tal vez tengas que improvisar.


=======================
4.1 CREANDO LOS ENLACES
=======================

  Estos enlaces deben existir sin importar si usas hora local o UTC. Las razones
por las que debemos crear estos enlaces están explicadas en el capítulo 4.2.
Por ahora, ingresa al directorio /usr/share/zoneinfo y crea un enlace llamado
localtime que apunte a tu zona horaria con el siguiente comando:

 cd /usr/share/zoneinfo &&
 ln -sf _TIMEZONE_ localtime

  En el capítulo 3 hablamos sobre _TIMEZONE_. Léelo si no lo has hecho ya,
porque contiene información importante. Ahora necesitamos otro enlace en /etc:

 cd /etc &&
 ln -sf ../usr/share/zoneinfo/localtime

  Con esto los enlaces están listos, lo que sigue es cambiar los guiones de
arranque.


=====================================
4.2 CAMBIANDO LOS GUIONES DE ARRANQUE
=====================================

  En el arranque, el reloj del sistema que mantiene el núcleo Linux necesita
sincronizarse con el reloj de la máquina. Este reloj es el que corre en la BIOS
y mantiene la hora incluso cuando el sistema está apagado. La razón de hacer
esto es que el reloj de la máquina no es realmente preciso. El núcleo Linux
usa una forma mucho más precisa para mantener la hora, que no describiré
en detalle aquí. Para mantener la hora del sistema Linux al apagar la máquina,
se escribe la hora del sistema en el reloj de la máquina cada vez que la vamos
a reiniciar o apagar.
  La escritura y la lectura del reloj de la máquina la realiza un programa
llamado hwclock(8). Este programa forma parte de un sistema LFS normal, así que
no necesitas descargarlo. Modificaremos algunos guiones de arranque para hacer
que este programa se ejecute en el arranque y en el apagado del sistema.
  Este capítulo describe los cambios que hay que realizar tanto a los guiones
estilo SYSV que se encuentran en el libro como a los guiones estilo BSD
descritos en la receta BSD Init. Si no conoces qué tipo de guiones usas puedes
asumir que son los de tipo SYSV.


========================
4.2.1 INICIO ESTILO SYSV
========================

  En el libro se crea el guión setclock en /etc/init.d/setclock. Este guión
sólo hace una parte del trabajo, que es la de configurar el reloj del sistema
de acuerdo con el reloj de la máquina. Modificaremos este guión y crearemos
enlaces adicionales para que, si es necesario, se guarde la hora del sistema
en el reloj de la máquina. Pero primero deberás verificar si el fichero
/etc/sysconfig/clock es correcto. Este fichero define una variable llamada UTC.
El valor que toma esta variable es bastante obvio luego de leer el capítulo 2.
En síntesis: UTC=1 si el reloj de la máquina usa hora UTC, UTC=0 si usa
hora local. Ahora crearemos un nuevo guión /etc/init.d/setclock:

 rm -f /etc/init.d/setclock
 cat >/etc/init.d/setclock <<EOF
#!/bin/sh
# Comienzo de /etc/init.d/setclock

#
# Incluir las funciones declaradas en el fichero /etc/init.d/functions
# e incluir las variables desde el fichero /etc/sysconfig/clock
#

source /etc/init.d/functions
source /etc/sysconfig/clock

case "$1" in
	start)
		case "$UTC" in
			yes|true|1)
				/sbin/hwclock --hctosys --utc
			;;
			no|false|0)
				/sbin/hwclock --hctosys --localtime
			;;
			*)
				echo "Valor incorrecto para UTC en /etc/sysconfig/clock: $UTC"
				echo "Los valores posibles para UTC son 1 y 0."
				exit 1
			;;
		esac
	;;
	stop)
		case "$UTC" in
			yes|true|1)
				/sbin/hwclock --systohc --utc
			;;
			no|false|0)
				/sbin/hwclock --systohc --localtime
			;;
			*)
				echo "Valor incorrecto para UTC en /etc/sysconfig/clock: $UTC"
				echo "Los valores posibles para UTC son 1 y 0."
				exit 1
			;;
		esac
	;;
	*)
		echo "Uso: $0 {start|stop}"
		exit 1
	;;
esac

# Fin de /etc/init.d/setclock
EOF
 chmod 755 /etc/init.d/setclock

  Luego de esto siguen los enlaces. El que ejecuta el guión setclock al
inicio del sistema ya existe en /etc/init.d/rcS.d, así que el único enlace que
tenemos que crear es el que lo ejecuta al apagar la máquina:

 cd /etc/rc0.d &&
 ln -sf ../init.d/setclock S700setclock &&
 cd /etc/rc6.d &&
 ln -sf ../init.d/setclock S700setclock

  En este momento, los guiones de arranque están configurados correctamente
y lo único que resta es establecer la variable de entorno TZ en el capítulo 4.3.


=======================
4.2.2 INICIO ESTILO BSD
=======================

  En este caso los guiones ya están enterados de hwclock y lo único que
tienes que cambiar son los parámetros que se le pasan en los guiones
/etc/rc.d/rc.sysinit y en /etc/rc.d/rc.0. Abre dichos ficheros en un editor
de textos, busca las llamadas a hwclock en unas líneas similares a estas
y modifícalas

para hora UTC:
(rc.sysinit) /sbin/hwclock --hctosys --utc
(rc.0)       /sbin/hwclock --systohc --utc

para hora local:
(rc.sysinit) /sbin/hwclock --hctosys --localtime
(rc.0)       /sbin/hwclock --systohc --localtime

  ¡Y listo!


=============================
4.3 LA VARIABLE DE ENTORNO TZ
=============================

  Esta variable la utiliza hwclock cuando es ejecutado desde un intérprete de
comandos y también la usan algunos programas que dependen mucho de las
zonas horarias. Esta es una variable global del sistema, por lo tanto es una
buena idea definirla en /etc/profile añadiendo estas líneas:

 TZ=__TIMEZONE__
 export TZ


========================
5. SINCRONIZANDO LA HORA
========================

  Sincronizar la hora significa "hacer que tu sistema muestre la hora correcta".
Aprenderás a sincronizar la hora con uno de los servidores NTP (Network Time
Protocol, Protocolo Horario de Red) existentes y a mantener la hora
sincronizada. En este capítulo usaremos una utilidad llamada "getdate" para
sincronizar la hora. Descárgala desde:

 ftp://metalab.unc.edu/pub/Linux/system/network/misc/getdate_rfc868-1.2.tar.gz

  Desempaquétala en /usr/src:

 cd /usr/src &&
 tar xzvf /ruta/a/getdate_rfc868-1.2.tar.gz

  Y compílala:

 cd getdate_rfc868 &&
 make &&
 make install &&
 make installman

  Esto es todo lo que necesitaremos para sincronizar la hora..


=============================
5.1 ELIGIENDO UN SERVIDOR NTP
=============================

  Esta es la parte más difícil de la sincronización. Necesitas un servidor NTP
que esté en tu zona horaria preferentemente y que funcione. Elige uno de
la lista que se encuentra en http://www.eecis.udel.edu/~mills/ntp/clock1a.html.
Comprueba si el servidor funciona ejecutando:

 getdate tu.servidor.ntp

  Si no recibes una respuesta positiva, toma el siguiente servidor NTP de la
lista e inténtalo nuevamente. En caso contrario, ajusta manualmente la hora del
sistema al valor más cercano posible al del servidor NTP. Por ejemplo, si el
servidor responde:

 ntp.foo.bar.com:  (-40)  Sun Mar 4 13:33:33 2001

  Ajusta la hora con este comando:

 date -s 13:33:40

  Todavía no importa demasiado que ajustes la hora exacta, pero necesitamos un
valor lo suficientemente cercano para usar getdate, ya que éste no funcionará
si hay una diferencia mayor a 180 segundos entre la hora del servidor NTP y la
hora local.


================
5.2 SINCRONÍZALO
================

  Este es el comando para sincronizar la hora de tu sistema con el servidor NTP:

 getdate -adjust 5 180 your.ntp.server

  ¡Eso es todo! La hora correcta será escrita en el reloj de tu máquina la
próxima vez que apagues el sistema (bueno... si leíste el capítulo 4) así que
tendrás la hora exacta por unos días. "¡¿Por unos días?!" Sí, porque el reloj
de tu máquina no es realmente preciso. Para asegurarte de que siempre tienes la
hora correcta, deberás sincronizarla periódicamente. Te explicaré cómo hacerlo
en el capítulo 5.3.


=================
5.3 MANTENIMIENTO
=================

  Puedes mantener el reloj del sistema en buena forma si sincronizas la hora
local con un servidor NTP regularmente. Puede ser una buena idea hacerlo cada
vez que te conectas a internet, o (si tienes una conexión continua) por medio
de un trabajo de cron. Si no te gusta esta automatización, por supuesto que
puedes hacerlo manualmente de vez en cuando. Este capítulo contiene algunos
ejemplos para los métodos mencionados.
  El primer método es "sincronizar cuando nos conectamos a internet". En este
ejemplo usaremos el demonio PPP estándar porque suele ser el que se usa para
las conexiones seriales. Abre el fichero /etc/ppp/ip-up en un editor de textos.
Este fichero se ejecuta automáticamente al conectarnos con ppp, entonces es
seguro sincronizar la hora desde aquí. Agrega esta línea al final del fichero:

 /usr/bin/getdate -adjust 5 180 tu.servidor.ntp

  El segundo método es "sincronizar cada x horas usando un trabajo de cron". Hay
demasiados demonios cron como para dar un ejemplo que funcione con todos ellos.
Normalmente, la página del manual del editor de crontab que uses te dará la
información suficiente para que lo hagas tú mismo. Si has hecho un trabajo para
un demonio cron específico, por favor avísame y lo agregaré a esta receta.
  El tercer y último método, "hazlo tú mismo" es bastante simple. Ejecuta la
conocida línea "getdate -adjust" una vez cada tanto...

__EOF__