31 wrote: > > siempre lo he puesto en la bios, pero cuando se cambia la hora tengo que > cambiarlo, �hay > forma de que se cambie automaticamente?, ademas mi bios adelanta un poco, y > tambi�n he oido > que hay una forma de poner en hora el reloj de linux que toma en cuenta los > adelantos cada > vez que se pone en hora y ajusta solo el reloj, haciendo que cada vez sea mas > preciso �es > verdad?
Primero un poco de teor�a: En Linux hay dos relojes: el de la BIOS (o el de CMOS, o RTC, o reloj hardware: tiene muchos nombres) y el del sistema. El que importa es el del sistema, pero al arrancar el kernel no sabe qu� hora es. Para que el sistema sepa la hora el primer programa que lanza el kernel (el programa init) se la pregunta al reloj hardware inmediatamente despu�s del arranque (el trabajo sucio lo hace /etc/rcS.d/S50hwclock.sh --> /etc/init.d/hwclock.sh, que se instala gracias al paquete base/util-linux). Por entonces el kernel no sabe nada de variables del sistema tipo TZ. Lo �nico que necesita saber es si el reloj hardware mantiene una hora local o la hora universal (GMT, UTC). Eso lo sabe mirando qu� valor tiene la variable GMT en el fichero /etc/default/rcS (fichero que creo que se crea cuando instalas Debian por primera vez y te pregunta entre otras cosas qu� tipo de hora mantiene tu reloj hardware). Entonces pone la hora del sistema como la hora del reloj hardware. Cuando durante el arranque aparece en pantalla Local time: Mon Nov 15 19:42:10 CET 1999 es que el hwclock.sh ha actuado. Desde entonces tienes el reloj del sistema con la misma hora que el reloj hardware. Pero cada uno de ellos se mueve a diferente velocidad porque tienen distintos mecanismos de funcionamiento. El hardware funciona con un oscilador de cuarzo o lo que sea, y el de sistema mediante una interrupci�n de tiempo (la t�pica timer interrupt que forma parte del est�ndar ISA). S�lo vuelven a coincidir los dos relojes cuando se apaga el sistema y entre otros se ejecuta el script /etc/init.d/hwclock.sh con la opci�n stop: entonces la hora del sistema se guarda en el reloj hardware, y al cabo de pocos segundos tienes el ordenador apagado. Este sistema de sincronizaci�n presupone que justo antes de apagar el ordenador, la hora del sistema es m�s fiable que la hora del reloj hardware. Con el sistema en marcha puedes modificar cualesquiera de estos dos relojes, aunque no es aconsejable modificar el reloj del sistema con el comando date porque entonces haces que haya discontinuidades en la hora (aunque no s� por qu� eso es tan malo). El reloj hardware se puede modificar con el comando hwclock cada vez que quieras. Para eliminar errores sistem�ticos del reloj hardware lo mejor es usar una fuente fiable de la hora (creo que es m�s fiable llamar a informaci�n horaria que usar tu reloj de pulsera, pero no lo he comprobado) para poner el reloj hardware a la hora que sea con "hwclock --set ..." (has de ser root para poner el reloj), y hacerlo cuando enciendas el ordenador y bastantes horas despu�s estando enchufado (eso es para que no se ejecute /etc/init.d/hwclock.sh con la opci�n stop y te joda el invento). As�, tendr�s en el fichero /etc/adjtime la informaci�n necesaria para poner siempre el reloj hardware en hora con un simple "hwclock --adjust". Sin embargo, esto no funciona si en alg�n momento apagas el ordenador, se ejecuta /etc/init.d/hwclock.sh con la opci�n stop (que te hace un hwclock --systohc), y por una de esas la hora del sistema no es exacta. Entonces, en /etc/adjtime tendr�as la informaci�n para ajustar el reloj hardware al reloj del sistema, lo cual es un problema si el reloj del sistema no es suficientemente fiable. Por eso, creo que la soluci�n es tener siempre el reloj del sistema funcionando perfectamente. Pero no es aconsejable poner el reloj del sistema con el comando date porque eso provocar�a una discontinuidad en la hora, y adem�s habr�a que repetirlo continuadamente cada vez que se observara un atraso o adelanto considerable. Por ello es mejor usar el comando adjtimex (paquete admin/adjtimex) que cambia la hora del sistema de forma progresiva (suave) y sistem�tica (siempre). Para ello modifica ciertas variables del kernel (no confundir con la variable de entorno TZ) que se usan para determinar la hora: tick y frequency para que el reloj del sistema se ajuste a una fuente externa. Dependiendo de la fuente externa se usa con unas opciones u otras. Y ahora la pr�ctica: Antes que nada hay que saber si el reloj del sistema usa GMT (o UTC). Si en /etc/default/rcS la variable GMT es "" entonces la hora es local, pero si GMT es "-u" entonces hay que usar la opci�n -u en los comandos en que se escriba [-u]. Adem�s, si la hora del sistema es local, hay que asegurarse de que el sistema conoce el timezone. El timezone viene definido en el fichero /etc/timezone, y/o en la variable de entorno TZ. Adem�s has de tener los comandos hwclock (en el paquete base/util-linux) y netstd (en el paquete net/netstd). Las fuentes externas (extenas al sistema) de hora pueden ser: el reloj hardware, un reloj que no pueda leer directamente sino a trav�s de la informaci�n que le proporcione una persona que mira ese reloj (un reloj de pulsera, o de servicio telef�nico, o el del teletexto), y un reloj en un ordenador servidor de tiempo accesible via internet. Por ello, seg�n tus posibilidades tienes que elegir alguna de estas soluciones: Y ahora la pr�ctica: a) Un ordenador completamente aislado del mundo: a.1: Tras instalar el paquete admin/adjtimex, lo primero es borrar todos los ficheros antiguos con datos generados autom�ticamente (quieres tener pleno control): # cat <<EOF >/etc/adjtime > 0.0 0 0.0 > EOF # rm /var/log/clocks.log a.2: C�gete un buen reloj (de pulsera, de pared, de lo que sea) o pon el teletexto de alguna cadena de televisi�n o llama a informaci�n horaria. Teclea "adjtimex [-u] -w <enter>" (la opci�n -u s�lo hay que ponerla si trabajas con hora universal, y no con hora local) y vuelve a pulsar <enter> cuando sepas la hora exacta (el segundero del reloj marca exactamente 00, por el tel�fono suena la se�al horaria "pip", ...) entonces di qu� hora era cuando has pulsado <enter> y qu� error adjudicas a este tiempo (cuanto tiempo pasa desde que es la hora hasta que pulsas <enter>: yo pongo 0.1 segundos: para estimar tus reflejos y capacidad y anticipaci�n te sugiero que pongas un cron�metro en marcha e intentes pararlo cuando marque 10 segundos exactos). Cada cierto tiempo (media hora, una hora) vuelve a hacer "adjtimex [-u] -w" (-u si el reloj del sistema va en UTC, sin -u si es hora local) para darle informaci�n de la hora que es, y entonces "adjtimex -r" para mostrar las estimaciones (ajuste por m�nimos cuadrados) de los errores sistem�ticos del reloj del sistema y del reloj hardware. a.3: Entonces, cuando tenga suficientes datos buenos, en la informaci�n que te da "adjtimex -r" aparecer� el "suggested tick" y el "suggested freq". Imagina que te sale: least-squares solution: cmos_error = -215 +- 11 ppm suggested adjustment = 18.5921 sec/day sys_error = 785 +- 11 ppm suggested tick = 9992 freq = 963288 note: clock variations and unstated data errors may mean that the least squares solution has a bigger uncertainty than estimated here entonces, edita el fichero /etc/rc.boot/adjtimex y cambia las l�neas TICK=10000 FREQ=0 por las l�neas TICK=9992 FREQ=963288 para que las variables del kernel tengan los valores apropiados cuando arranques de nuevo. Adem�s puedes fijarte en cu�l de los dos relojes es mejor: en este caso el de harware (cmos) tiene un error menor (215 partes por mill�n = 19 segundos al d�a) que el del sistema (785 partes por mill�n = 68 segundos al d�a). Adem�s tendr�s que hacer "adjtimex -tick 9992 -frequency 963288" para eliminar las variaciones sistem�ticas del reloj del sistema hasta que no lo apagues de nuevo. a.4: Una vez eliminadas las variaciones sistem�ticas (systematic drift) hay que eliminar el error sistem�tico constante. Para ello, puedes hacerlo con: # cat <<EOF > /etc/adjtime > 18.5921 0 0.0 (el 18.5921 aparec�a haciendo "adjtimex -r") > EOF # date [-u] --set "22:32:50" (la hora que sea cuando teclees <enter>) # hwclock [-u] --systohc a.5: De esta forma tendr�s los dos relojes siempre sincronizados a tu fuente externa y sincronizados entre s�. Si detectas que la sincronizaci�n falla al cabo de unos d�as, vuelve a hacerlo todo desde el punto a.1. b) Un ordenador que tiene una conexi�n intermitente a internet (por ejemplo, si usas modem y s�lo lo enchufas unos pocos minutos al d�a: al empezar la jornada laboral, y al terminarla para leer el correo electr�nico) b.1: Exactamente igual que en a.1. b.2: Es igual que en el apartado a) salvo que en vez de usar una fuente externa manual usas un servidor de tiempo. Yo en la facultad uso el servidor del campus que est� en la IP 147.156.1.3. Entonces, en vez de "adjtimex [-u] -w" de antes usas "adjtimex [-u] --host 147.156.1.3". Ejecutas este comando un par de veces con una separaci�n de unas horas, y "adjtimex -r" te dar� unos valores muy precisos del systematic drift (variaci�n sistem�tica) de los relojes hardware y del sistema. b.3: Exactamente igual que en a.3 b.4: El error sistem�tico constante de ambos relojes se elimina muy f�cilmente con # cat <<EOF > /etc/adjtime > 18.5921 0 0.0 (el 18.5921 aparec�a haciendo "adjtimex -r") > EOF # netdate 147.156.1.3 # hwclock [-u] --systohc b.5: Los relojes hardware y del sistema est�n sincronizados entre s� y con el reloj del servidor de tiempo. Si al cabo de unas semanas ves que se producen variaciones sistem�ticas, vuelve a empezar desde el punto b.1. c) Un ordenador con una conexi�n permanente a internet (como lo que tengo en la facultad: una red local en todo el campus con la que estoy siempre conectado) c.1: Ahora no se necesita el paquete adjtimex, pues es mejor usar el demonio xntpd. Para ello instala el paquete net/xntp3. Cuando lo configures (le tendr�s que decir cu�l es tu servidor de tiempo, por ejemplo 147.156.1.3 para los ordenadores de la Universidad de Valencia) dile que quieres ejecutar el comando ntpdate antes de ejecutar el demonio xntpd cuando el sistema arranca, con lo que siempre tendr�s una buena hora de sistema desde el momento del arranque. c.2: Para ver como funciona todo el cotarro sin tener que esperar al siguiente arranque puedes hacer: # /etc/init.d/xntp3 start # hwclock [-u] --systohc c.3: Y ya no tendr�s que preocuparte nunca m�s de que el reloj del sistema tenga una variaci�n sistem�tica, salvo que el servidor de tiempo se caiga o te corten el cable Ethernet, o alguna otra desgracia. c.4: Adem�s, el script /etc/init.d/hwclock.sh, que se ejecuta al arrancar y al apagar el sistema te asegura que el apagar el sistema el reloj hardware se actualizar� con la hora del sistema (que es perfecta gracias a xntpd), y otros SOs que usan este reloj (como Mierdows 9x y TOS) se beneficiar�n de la potencia de Linux. F�jate que al apagar el sistema aparece un mensaje como �ste: CMOS clock updated to Mon Nov 15 23:43:44 CET 1999. PS: Y hablando de la hora que es: he tardado CUATRO HORAS en escribir este email, me he quedado sin cenar, sin ver Periodistas, y como no me d� prisa en salir seguro que me atacan los perros de seguridad del campus. -- Conrado Badenas <[EMAIL PROTECTED]> PhD student | Assistant Lecturer Department of Thermodynamics | Department of Optics --------------------------------------------------- Faculty of Physics. University of Valencia c/. Dr. Moliner, 50 46100 Burjassot (Valencia) - SPAIN

