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__ |