Menú Principal
Lo más leído
Consigue Firefox
Usuarios
993 registrados
1 hoy
5 esta semana
138 este mes
Último: gabity...
Formulario de acceso



... Regenerar clave
... Registro
Poniendo linux en hora Imprimir E-Mail
miércoles, 18 de enero de 2006

Al finalizar la lectura de este artículo, habremos adquirido los conocimientos necesarios para mantener una máquina con linux en perfecta sincronía horaria. Para lograr este fin, repasaremos de la forma más fiable posible el uso del programa hwclock.

 


Familiarizándonos con hwclock

Antes de nada, teclearemos en nuestra consola el comando man hwclock. Así tendremos una idea genérica a cerca del contenido de este artículo y del uso del comando hwclock.

Para la ejecución del comando hwclock o cualquier otro programa que afecte a la hora del sistema o el reloj CMOS, habremos de tener privilegios de administrador.

 

Revisando los archivos del sistema

En los sistemas Fedora, el comando hwclock se ejecuta con la intención de sincronizar el sistema con el reloj de hardware al apagar el sistema o al entrar en modo suspensión, si este está activado. Así podemos ver llamadas a dicho comando en lugares como /etc/sysconfig/apm-scripts/apmscript o /etc/rc.d/init.d/halt. En otros sistemas, encontraremos llamadas al comando en rutas como /etc/rc.local o en /etc/rc.d/rc.sysinit , /etc/rc.d/init.d o algún otro lugar similar. La llamada también podría ser al alias clock.

Si no hemos cambiado nada y de forma habitual, la llamada al comando en estos archivos de inicio se hará de la forma hwclock -a o hwclock -ua. Aunque podemos encontrarnos con llamadas que utilizan el perámetro -s (hctosys) . En este último caso, si queremos una sincronización a nuestro gusto, cambiaremos la s por una a. Seguidamente, comprobaremos el contenido de /etc/adjtime . En su interior podemos encontrarnos varias líneas, pero la más importante será una que contiene una cadena parecida a esta:

0.312147 1134578609 0.000000

Estos números son el factor de corrección (en segundos por día), el momento que reloj fue corregido por última vez (en segundos desde el uno de enero de 1970), y el momento (segundo) en que fue corregido por última vez. Si no dispone de este archivo, entre en el sistema como administrador y créelo, con una única línea que contenga lo siguiente:

0.0 0 0.0

Ejecute hwclock -a o hwclock -ua manualmente desde la consola para actualizar el segundo número (use la u si el reloj esta usando el sistema UTC en vez de la hora local).

 

Cálculo de las variaciones del reloj

Lo primero de todo: averiguar qué hora es y poner el reloj en hora, ya que ésta puede estar ya desasjustada. Tomaremos la hora exacta de un servidor horario o de cualquier servicio que nos la suministre. Si dispone de acceso a un servidor horario en la red, puede utilizar el programa ntpdate del paquete ntp (utilice el parámetro -b para permitir que el kernel actualice el reloj del CMOS). De lo contrario use date -s hh:mm:ss para poner en hora el reloj del kernel a mano, y entonces hwclock -w para el reloj del CMOS, tomando la hora del reloj del kernel. Deberá recordar cuándo puso en hora el reloj por última vez, así que escriba la fecha en algún lugar a prueba de pérdidas. Si utilizó ntpdate , con date +%s " puede registrar el número de segundos desde el uno de enero de 1970.

Una vez hechos los ajustes, deberemos esperar unos días para ver si el reloj ha sufrido desviaciones y de cuánto han sido. Si la hora se puso a mano (mediante date), es recomendable esperar al menos dos semanas para poder calcular fielmente la desviación aproximada a .1 seg/día. Después de algunos meses le será posible determinarla con una exactitud de .01 seg/día (se puede conseguir aún más exactitud, pero esta precisión es más que razonable). Si la hora se estableció usando ntpdate no es necesario esperar tanto tiempo, aunque el ajuste siempre será más fiable cuanto más tiempo pase.

Puede ejecutar con cron el comando hwclock -a a intervalos regulares para mantener la hora del sistema ajustada con el horario (corregido) de la CMOS. Este comando puede ejecutarse también desde algún archivo de inicio en el momento del arranque, lo cual será más que suficiente para nuestros propósitos.

Tenga en cuenta que algunos programas pueden quejarse si el sistema salta más de un segundo a la vez, o si va para atrás. Si tiene este problema, puede utilizar ntpdate para corregir el tiempo más gradualmente. Ejecutaremos el comando desde el cron, tal y como hemos descrito en el párrafo anterior.

Ejemplo práctico

Haremos login como administrador y pondremos el reloj del sistema en hora, bien mediante ntpdate o bien con date:

# date -s hh:mm:ss

# /usr/sbin/ntpdate -b swisstime.ethz.ch

A continuación teclearemos lo siguiente (si hemos usado ntpdate -w no será necesario):

# hwclock -w

Con esto ajustamos el reloj de la CMOS con la hora del kernel. Seguidamente escribimos:

# date +%j

(o date +%s si ha usado ntpdate en lugar de date) y escriba el resultado en un fichero seguro.

Ahora vamos a calcular la desviación, al tiempo que restablecemos la hora. Como hemos dicho anteriormente, dejaremos que pase un tiempo entre la primera puesta en hora y la siguiente. Vamos a teclear lo siguiente:

# clock -a

Con esto conseguimos que el kernel se ponga en hora con el reloj de la CMOS. Ahora deberemos obtener la hora exacta y compararla con el reloj de nuestro sistema. Para esto, escribiremos el siguiente comando y pulsaremos la tecla Intro justo en el instante en que los segundos de nuestro controlador horario exacto se ponen a cero:

# date

Seguidamente, teclearemos esto:

# date hh:mm:00

donde hh:mm será el minuto siguiente al actual en nuestro servidor horario exacto. Esto es: si nuestro servidor horario marca 12:23:11 hh:mm será 12:24. Pulsaremos Intro cuando el servidor horario se ponga a cero. Así se establece la hora del kernel. Teclee ahora:

# clock -w

que establecerá la nueva hora (correcta) sobre el reloj del CMOS. Seguimos:

# date +%j

(o date +%s si es lo que ha utilizado anteriormente)

Ahora dispone de tres números (dos fechas y un intervalo de tiempo) que nos permitirán calcular la desviación horaria.

Estableceremos ahora si la ejecución del comando date dio como resultado una hora atrasada o adelantada. Si iba adelantada, descontaremos algunos segundos. Si la hora estaba atrasada, agregaremos segundos. Igualmente restaremos las fechas. Si se usó date +%j, restaremos el número que representa el día del año (1-365 o 1-366 en año bisiesto). Si ha comenzado un nuevo año entre la primera prueba y la segunda, se deben agregar 365 (o 366) al segundo número. Si se usó date +%s , el número está en segundos y deberá dividirlo por 86400 para obtener el número de días.

Si en /etc/adjtime ya existe factor de corrección, deberá tomar en consideración el número de segundos que ha corregido. Si ha corregido adelantando, este número tendrá el signo opuesto al introducido; si ha corregido atrasando tendrá el mismo signo. Multiplique el antiguo factor de corrección por el número de días y añada el número de segundos resultante (adición con signos - si ambos números tienen el mismo signo: obtendrá un número mayor; si tienen signos opuestos, obtendrá un número menor).

Divida el número total de segundos por el número de días para tener el nuevo factor de corrección, y colóquelo en /etc/adjtime en lugar del anterior. Registre la nueva fecha (en segundos o días) para la próxima vez.

/etc/adjtime quedará distinto en cada caso. No obstante, ponemos un ejemplo:

-9.600000 845082716 -0.250655

(9.6 segundos por día son casi cinco minutos al mes de desviación.)

 

Comentario[s]

Sólo los usuarios registrados pueden escribir comentarios.
Por favor, valídate o regístrate.

Powered by AkoComment 2.0!

 
< Anterior   Siguiente >