NOMBRE¶
hwclock - interroga y pone en hora el Reloj del Hardware (RTC)
SINOPSIS¶
hwclock --show
hwclock --set --date=nuevafecha
hwclock --systohc
hwclock --hctosys
hwclock --getepoch
hwclock --setepoch --epoch=año
hwclock --adjust
hwclock --version
otras opciones:
--utc --directisa --test --debug
Las abreviaciones mínimas de todas las opciones son aceptables, si no hay
ambigüedad.
También se aceptan las opciones equivalentes -r, -w, -s, -a, -v, -u y -D,
por compatibilidad con el programa "clock".
DESCRIPCIÓN¶
hwclock es una herramienta para acceder al Reloj del Hardware. Ud. puede
mostrar la hora actual, poner el Reloj del Hardware a una hora especificada,
poner el Reloj del Hardware a la Hora del Sistema, y poner el Tiempo del
Sistema desde el Reloj del Hardware.
Ud. también puede ejecutar
hwclock periódicamente para
insertar o quitar tiempo del Reloj del Hardware para compensar desviaciones
sistemáticas (en las que el reloj gana o pierde tiempo consistentemente
a una cierta velocidad si se deja solo).
OPCIONES¶
Ud. necesita exactamente una de las siguientes opciones para decirle a
hwclock qué función realizar:
- --show
- Lee el Reloj del Hardware y muestra la hora en la salida
estándar.
- --set
- Pone el Reloj del Hardware a la hora dada por la opción
--date.
- --hctosys
- Pone el Tiempo del Sistema a partir del Reloj del Hardware. Ésta es
una buena opción para poner en uno de los guiones de arranque del
sistema.
- --systohc
- Pone el Reloj del Hardware a la hora del sistema actual.
- --adjust
- Añade o sustrae tiempo del Reloj del Hardware para tener en cuenta
el desvío sistemático desde la última vez que el
reloj se puso o se ajustó. Vea la discusión al respecto
más adelante.
- --getepoch
- Muestra en la salida estándar el valor de la época del Reloj
del Hardware del núcleo. Esto es el número de años en
la Era al que se refiere el año cero del Reloj del Hardware. Por
ejemplo, si Ud. emplea el convenio de que el contador de años en su
Reloj del Hardware contiene el número de años completos
desde 1952, entonces el valor de la época del contador de
años del Reloj del Hardware debe ser 1952.
Este valor de la época se emplea cada vez que hwclock lee o pone el
Reloj del Hardware.
- --setepoch
- Pone el valor de la época del Reloj del Hardware del núcleo
al valor especificado por la opción --epoch. Vea la
opción --getepoch para más detalles.
- --version
- Muestra la versión de hwclock en la salida estándar.
Si Ud. especifica la opción --set, necesita la opción
siguiente. Si no, no es tenida en consideración.
- --date=nuevafecha
- Especifica la hora a la cual poner el Reloj del Hardware. El valor de esta
opción es un argumento válido para el programa
date(1). Por ejemplo,
hwclock --set --date="9/22/96 16:45:05"
- --epoch=año
- Especifica el año que es el principio de la época del Reloj
del Hardware. Esto es el número de años en la Era a la cual
se refiere un valor cero en el contador de años del Reloj del
Hardware.
Por ejemplo,
hwclock --setepoch --epoch=1952
Las opciones siguientes se aplican a la mayoría de las funciones.
- --utc
- Indica que el Reloj del Hardware se mantiene en el Tiempo Universal
Coordinado (UTC). Es cosa suya si mantiene su reloj en hora local o UTC,
pero nada en el reloj le dice qué es lo que ha escogido. Así
que con esta opción es como le da esa información a
hwclock.
Si no especifica
--utc cuando debiera, o viceversa, el poner y preguntar
la hora del reloj del hardware acabarán funcionando mal.
- --directisa
- tiene sentido solamente en una máquina ISA. Para todas las otras
máquinas no tiene efecto. Esta opción le dice a
hwclock que use instrucciones de E/S explícitas para acceder
al reloj del hardware. Sin esta opción, hwclock
intentará emplear el dispositivo /dev/rtc (que supone que
está controlado por el controlador del dispositivo rtc). Si es
incapaz de abrir el dispositivo (para lectura), empleará las
instrucciones explícitas de E/S, de todas formas.
El controlador de dispositivo rtc fue introducido en Linux versión 2.
- --test
- Hace todo excepto actualizar realmente el Reloj del Hardware o cualquier
otra cosa. Esto es útil, especialmente en conjunción con
--debug, para aprender sobre cómo funciona
hwclock.
- --debug
- Muestra un montón de información sobre lo que hwclock
está haciendo internamente. Algo de su función es compleja y
esta salida puede ayudarle a comprender cómo funciona el programa.
NOTAS¶
Relojes en un sistema Linux¶
Hay dos relojes principales en un sistema Linux:
El Reloj del Hardware: Esto es un reloj que corre independientemente de
cualquier programa de control ejecutándose en la CPU e incluso cuando
la máquina está apagada.
En un sistema ISA, este reloj está especificado como parte del
estándar ISA. El programa de control puede leer o poner este reloj a un
segundo entero, pero el programa de control también puede detectar los
límites de los pulsos del reloj de 1 segundo, así que el reloj
realmente tiene una precisión virtualmente infinita.
Este reloj se llama comúnmente el Reloj del Hardware, el reloj de tiempo
real, el RTC, el reloj de la BIOS, y el reloj CMOS. El Reloj del Hardware, en
esta forma con las iniciales en mayúsculas, se acuñó para
el uso en
hwclock porque todos los otros nombres son inapropiados hasta
el punto de llevar a confusión.
El Tiempo del Sistema: Esto es el tiempo mantenido por un reloj de dentro
del núcleo Linux y controlado por un interruptor de
temporización. (En una máquina ISA, el interruptor de
temporización es parte del estándar ISA.) Sólo tiene
sentido mientras Linux está ejecutándose en la máquina.
El Tiempo del Sistema es el número de segundos desde las 00:00:00 horas
del 1 de Enero de 1970, UTC (o más sucintamente, el número de
segundos desde 1969). El Tiempo del Sistema no es un entero, sin embargo.
Tiene precisión virtualmente infinita.
El Tiempo del Sistema es el que tiene importancia. El propósito
básico del Reloj del Hardware en un sistema Linux es mantener la hora
mientras que Linux no está ejecutándose. Ud. inicia el Tiempo
del Sistema al tiempo del Reloj del Hardware cuando Linux arranca, y ya no
utiliza nunca más el Reloj del Hardware. Observe que en DOS, para quien
se diseñó ISA, el Reloj del Hardware es el único reloj de
tiempo real.
Es importante que el Tiempo del Sistema no tenga discontinuidades como las que
podrían ocurrir si Ud. empleara el programa
date(1) para ponerlo
en hora mientras el sistema esté en ejecución. Sin embargo, Ud.
puede hacer lo que quiera con el Reloj del Hardware mientras el sistema
esté ejecutándose, y la siguiente vez que Linux arrancara, lo
haría con la nueva hora ajustada del Reloj del Hardware. También
puede emplear el programa
adjtimex(8) para ajustar suavemente el Tiempo
del Sistema mientras que el sistema está ejecutándose.
Cómo hwclock accede al Reloj del Hardware¶
hwclock utiliza muchas formas diferentes de obtener y poner valores en el
Reloj del Hardware. La forma más normal es hacer E/S en el fichero
especial de dispositivo /dev/rtc, que se supone controlado por el controlador
del dispositivo rtc. Sin embargo, este método no está siempre
disponible. Por una cosa: el controlador rtc es una adición
relativamente reciente a Linux. Sistemas más antiguos no lo tienen.
En sistemas más viejos, el método de acceder al Reloj del Hardware
depende del hardware del sistema.
En un sistema ISA,
hwclock puede acceder directamente a los registros de
la "memoria CMOS" que constituye el reloj, haciendo E/S a los
puertos 0x70 y 0x71. Esto sólo lo puede hacer si se ejecuta con el UID
efectivo 0 (esto es, con privilegios de súper-usuario).
Esto es realmente un pobre método de acceder al reloj, por la
razón de que los programas en el espacio de usuario se supone
generalmente que no deben hacer E/S directa y deshabilitar interrupciones.
Hwclock lo proporciona porque es el único método disponible con
núcleos Linux más antiguos para máquinas ISA.
En un sistema m68k (68000 de Motorola),
hwclock puede acceder al reloj a
través del controlador de consola, mediante el fichero especial de
dispositivo /dev/tty1.
En un Alpha, de DEC,
/dev/rtc es la única posibilidad.
Hay o había algunos sistemas Linux en Alpha que no tienen /dev/rtc y hay
o había programas que accedían al reloj a través de E/S
casi directa usando /dev/port. Sin embargo, esto no es un método tan
bueno como el de /dev/rtc y tales programas no fueron tan ampliamente
empleados como para que hwclock tuviera ninguna necesidad de ser compatible
hacia atrás con ellos. Así que hwclock no proporciona el
método de /dev/port y consecuentemente no funcionará en un Alpha
que no tenga /dev/rtc.
hwclock intenta emplear /dev/rtc. Si se ha compilado para un
núcleo que no tiene esa función o es incapaz de abrir /dev/rtc,
hwclock intentará otro método, si hay alguno disponible.
En una máquina ISA, Ud. puede forzar a
hwclock a usar la
manipulación directa de los registros de la CMOS sin ni siquiera
intentar /dev/rtc especificando la opción --directisa.
La Función de Ajuste¶
El Reloj del Hardware no es usualmente muy preciso. Sin embargo, mucha de su
imprecisión es completamente predecible; gana o pierde la misma
cantidad de tiempo cada día. Esto se llama desviación
sistemática. La función de "ajuste" de
hwclock
le permite hacer correcciones sistemáticas para corregir la
desviación sistemática.
Funciona así:
Hwclock mantiene un fichero,
/etc/adjtime,
que mantiene alguna información histórica. Este fichero se llama
el fichero adjtime.
Suponga que Ud. empieza sin fichero adjtime. Ud. da una orden
hwclock
--set para poner el Reloj del Hardware a la hora verdadera actual.
Hwclock crea el fichero adjtime y graba en él la hora actual
como la última vez que el reloj se calibró. 5 días
más tarde, el reloj ha ganado 10 segundos, así que Ud. da otra
orden
hwclock --set para ponerlo con 10 segundos menos.
Hwclock
ajusta el fichero adjtime para mostrar la hora actual como la última
vez que el reloj se calibró, y graba dos segundos por día como
la velocidad de desviación sistemática. Pasan 24 horas, y
entonces Ud. da una orden
hwclock --adjust. Hwclock consulta el
fichero adjtime y ve que el reloj gana 2 segundos por día cuando se le
deja solo, y que se le ha dejado solo exactamente un día. Así
que sustrae 2 segundos del Reloj del Hardware. Entonces graba la hora actual
como la última vez que se ajustó el reloj. Otras 24 horas pasan
y Ud. da otra orden
hwclock --adjust.
Hwclock hace lo mismo:
sustrae 2 segundos y actualiza el fichero adjtime con la hora actual como la
última vez que el reloj se ajustó.
Cada vez que Ud. calibra (pone en hora) el reloj,
hwclock recalcula la
velocidad de desviación sistemática basado en cuánto
tiempo ha pasado desde la última calibración, cuánto
tiempo ha pasado desde el último ajuste, qué velocidad de
desviación se suponía en cualesquiera ajustes intervinientes, y
la cantidad que el reloj está desviado actualmente de la hora
verdadera.
Se arrastra una pequeña cantidad de error en cualquier momento en que
hwclock pone el reloj en hora, de forma que rehúsa hacer un
ajuste que vaya a ser de menos de 1 segundo. Más tarde, cuando Ud. pida
un ajuste de nuevo, la desviación acumulada será de más
de un segundo y
hwclock hará el ajuste entonces.
Es bueno hacer un
hwclock --adjust justo antes del
hwclock
--hctosys en la hora del arranque del sistema, y quizás
periódicamente mientras que el sistema está ejecutándose,
mediante cron.
El formato del fichero adjtime es:
Línea 1: 3 números: 1) velocidad de desviación
sistemática en segundos por día, número en base diez en
coma flotante; 2) número resultante de segundos desde 1969 UTC del
más reciente ajuste o calibración, entero en base diez; 3) cero
(por compatibilidad con
clock ).
Línea 2: 1 número: El número resultante de segundos desde
1969 UTC de la calibración más reciente.
Ud. puede emplear con
hwclock un fichero adjtime que fuera usado
previamente con el programa
clock.
FICHEROS¶
/etc/adjtime
VÉASE TAMBIÉN¶
adjtimex(8),
date(1),
gettimeofday(2),
settimeofday(2),
crontab(1)
AUTORES¶
Escrito por Bryan Henderson, en Septiembre de 1996 (bryanh@giraffe-data.com),
basándose en el trabajo hecho en el programa
clock de Charles
Hedrick, Rob Hooft y Harald König. Mire el código fuente para la
historia completa y los créditos.