HWCLOCK(8)

BEZEICHNUNG
hwclock - die Hardware-Uhr (RTC) auslesen oder einstellen

ÜBERSICHT
hwclock [Funktion] [Option …]

BESCHREIBUNG
hwclock ist ein Werkzeug zum Zugriff auf die Hardware-Uhr. Es kann die aktuelle Hardware-Uhrzeit anzeigen, die Hardware-Uhr auf eine angegebene Zeit stellen, die Hardware-Uhr nach der Systemzeit stellen oder umgekehrt, eine Hardware-Uhr-Abweichung ausgleichen, die Zeitskala der Systemuhr korrigieren, die Zeitzone des Kernels, die NTP-Zeitskala und die Epoche (nur Alpha) setzen, die System- und Hardware-Uhren vergleichen und zukünftige Hardware-Uhrwerte, basierend auf der Abweichungsrate, vorhersagen.

Seit v2.26 gibt es wichtige Änderungen an der Funktion --hctosys, der Option --directisa und eine neue Option --update-drift wurde hinzugefügt. Lesen Sie die entsprechenden Beschreibungen unten.

FUNKTIONEN
Die folgenden Funktionen schließen sich gegenseitig aus, nur eine kann ausgewählt werden. Die Vorgabe ist --show, falls keine angegeben wurde.

--adjust
    fügt Zeit zur Hardware-Uhr hinzu oder zieht diese ab, um eine systematische Abweichung seit dem letzten Setzen oder Anpassen der Hardware-Uhr auszugleichen. Siehe die nachfolgende Erklärungen unter Die Adjust-Funktion.

-c, --compare
    vergleicht die Hardware-Uhr periodisch mit der Systemzeit und gibt die Differenz alle 10 Sekunden aus. Der Frequenzversatz und die Ein-Sekunden-Impulse werden ebenfalls ausgegeben.

--getepoch
--setepoch
    Diese Funktionen sind nur für Alpha-Maschinen.

    liest und setzt den Kernel-Wert der Hardware-Uhr-Epoche. Epoche ist das Jahr, auf dass sich der Nullwert der Hardware-Uhr bezieht. Wenn Sie zum Beispiel die Konvention verwenden, dass die Jahreszählung in der Hardware-Uhr die Anzahl der vollen Jahre seit 1952 enthält, dann muss der Epochenwert der Hardware-Uhr des Kernels auf 1952 gesetzt werden.

    Die Funktion --setepoch benötigt die Option --epoch, um das Jahr festzulegen.

    Dieser Epochenwert wird verwendet, wenn hwclock die Hardware-Uhr ausliest oder stellt.

--predict
    sagt basierend auf der mit der Option --date angegebene Zeit und der Information in /etc/adjtime vorher, was die Hardware-Uhr in der Zukunft anzeigen wird. Dies ist zum Beispiel nützlich, um Abweichungen zu berücksichtigen, wenn das Hardware-Uhr-Aufwachen (d.h. ein Alarm) eingerichtet wird. Siehe rtcwake(8).

    Verwenden Sie diese Funktion nicht, falls die Hardware-Uhr durch irgendetwas anderes als den Befehl hwclock des aktuellen Betriebssystems verändert wird, wie dem »11-Minuten-Modus« oder durch das Starten eines anderen Betriebssystems.

-r, --show
--get
    liest die Hardware-Uhr und schreibt ihre Zeit in die Standardausgabe im ISO 8601-Format. Die angezeigte Zeit ist stets die lokale Zeit, selbst wenn Sie die Hardware-Uhr auf die Weltzeit (UTC) eingestellt haben, siehe die Option --localtime.

    Die Anzeige der Hardware-Uhrzeit ist die Vorgabe, falls keine Funktion angegeben ist.

    Die Funktion --get wendet auch Korrekturen für die Abweichung auf die eingelesene Zeit an, basierend auf Informationen aus /etc/adjtime. Verwenden Sie diese Funktion nicht, falls die Hardware-Uhr von irgendetwas anderem außer dem Befehl hwclock des aktuellen Betriebssystems verändert wird, wie dem »11-Minute-Modus« oder vom Dualstarten eines anderen Betriebssystems.

-s, --hctosys
    stellt die Systemuhr aus der Hardware-Uhr. Die aus der Hardware-Uhr eingelesene Zeit wird bezüglich der systematischen Abweichung ausgeglichen, bevor die Systemuhr gestellt wird. Lesen Sie die Diskussion weiter unten, unter Die Adjust-Funktion.

    Die Systemzeit muss in der UTC-Zeitskala gehalten werden, damit Anwendungen im Zusammenhang mit der für das System konfigurierten Zeitzone arbeiten. Falls die Hardware-Uhr in der lokalen Zeit gehalten wird, dann muss die daraus gelesene Zeit in die UTC-Zeitskala verschoben werden, bevor sie zum Setzen der Systemuhr verwandt wird. Die Funktion --hctosys erledigt dies basierend auf den Informationen in der Datei /etc/adjtime oder aus den Befehlszeilenargumenten --localtime und --utc. Hinweis: Es wird keine Sommerzeitanpassung durchgeführt. Siehe die Diskussion weiter unten unter LOKAL vs. UTC.

    Der Kernel hält auch einen Zeitzonenwert, die Funktion --hctosys setzt ihn auf den für das System konfigurierten Wert. Die Systemzeitzone wird durch die TZ-Umgebungsvariable oder die Datei /etc/localtime konfiguriert, wie tzset(3) sie interpretieren würde. Das veraltete Feld »tz_dsttime« des Kernel-Zeitzonenwerts wird auf Null gesetzt. Details zur ehemaligen Bedeutung dieses Feldes finden Sie in settimeofday(2).

    Wird die Funktion --hctosys durch Verwendung in einem Systemstartskript der erste Aufrufer von settimeofday(2), dann wird über die Kernelvariable persistent_clock_is_local der NTP-»11-Minuten-Modus« gesetzt. Falls die Hardware-Uhr-Zeitskalenkonfiguration geändert wird, ist ein Systemneustart notwendig, um den Kernel zu informieren. Lesen Sie die Diskussion weiter unten unter Automatischer Abgleich der Hardware-Uhr durch den Kernel.

    Dies ist eine gute Funktion für die Ausführung in einem der Startskripte des Systems bevor die Dateisysteme im Lese-/Schreibmodus eingehängt werden.

    Diese Funktion sollte niemals auf einem laufenden System verwandt werden. Springende Systemzeit führt zu Problemen, wie fehlerhaften Dateisystemzeitstempeln. Falls auch etwas die Hardware-Uhr geändert hat, wie NTPs »11-Minuten-Modus«, dann wird --hctosys die Zeit durch Berücksichtigung der Abweichungsausgleichung inkorrekt einstellen.

    Die Abweichungsausgleichung kann durch Setzen des Abweichungsfaktors in /etc/adjtime auf Null unterdrückt werden. Diese Einstellung ist dauerhaft, solange wie die Option --update-drift nicht zusammen mit --systohc beim Herunterfahren des Systems (oder irgendwann sonst) verwandt wird. Eine andere Möglichkeit, dies zu unterdrücken besteht durch die Option --noadjfile beim Einsatz der Funktion --hctosys. Eine dritte Methode besteht im Löschen der Datei /etc/adjtime. Hwclock wird dann standardmäßig die UTC-Zeitskala für die Hardware-Uhr verwenden. Falls die Hardware-Uhr in lokaler Zeit läuft, muss das in dieser Datei definiert werden. Dies kann durch Aufruf von hwclock --localtime --adjust erfolgen. Wenn die Datei nicht vorhanden ist, wird dieser Befehl nicht wirklich die Uhr anpassen sondern wird die Datei mit der konfigurierten lokalen Zeit und einem Abweichungsfaktor von Null anlegen.

    Eine Bedingung, unter der die Abweichungskorrektur von hwclock verhindert werden sollte, könnte beim Dualstart von mehreren Betriebssystemen vorliegen. Falls, während diese Instanz von Linux angehalten ist, ein anderes Betriebssystem die Hardware-Uhr stellt, dann wird die Abweichungskorrektur nach dem Start dieser Instanz bei der Anwendung inkorrekt sein.

    Damit die Abweichungskorrektur von hwclock korrekt funktioniert, ist es zwingend, dass nichts die Hardware-Uhr ändert, während die Linux-Instanz nicht läuft.

--set
    setzt die Hardware-Uhr auf die durch die Option --date angegebene Zeit und aktualisiert die Zeitstempel in /etc/adjtime. Mit der Option --update-drift wird der Abweichungsfaktor (neu) berechnet.

--systz
    Dies ist eine Alternative zu der Funktion --hctosys, die nicht die Hardware-Uhr liest und nicht die Systemzeit setzt. Entsprechend gibt es auch keine Korrektur der Abweichung. Sie ist für Hochfahrskripte auf Systemen mit Kerneln höher als 2.6 gedacht, bei denen Sie wissen, dass die Systemuhr bereits vom Kernel während des Systemstarts aus der Hardware-Uhr gesetzt wurde.

    Dies führt die folgenden Dinge aus, die weiter oben in der Funktion --hctosys beschrieben sind:

    •   Korrigiert die Systemuhrzeitskala auf UTC wie benötigt. Anstatt aber dies durch Setzen der Systemuhr zu erreichen, informiert hwclock einfach den Kernel und der kümmert sich um die Änderung.

    •   Setzt die NTP »11-Minuten-Modus«-Zeitskala des Kernels

    •   Setzt die Zeitzone des Kernels

    Die ersten zwei sind nur beim ersten Aufruf von settimeofday(2) nach dem Systemstart verfügbar. Konsequenterweise ergeben diese Optionen nur bei der Verwendung in Systemstartskripten Sinn. Falls die Hardware-Uhr-Zeitskalenkonfiguration geändert wird, ist ein Systemneustart notwendig, um den Kernel zu informieren.

-w, --systohc
    setzt die Hardware-Uhr aus der Systemuhr und aktualisiert die Zeitstempel in /etc/adjtime. Wenn die Option --update-drift angegeben ist, wird auch der Abweichungsfaktor (neu) berechnet.

-V, --version
    zeigt Versionsinformationen an und beendet das Programm.

-h, --help
    zeigt diese Hilfe an und beendet das Programm.

OPTIONEN

--adjfile=Dateiname
    setzt den vorgegebenen Dateipfad /etc/adjtime außer Kraft.

--badyear
    gibt an, dass die Hardware-Uhr unfähig ist, Jahresangaben außerhalb des Bereiches 1994-1999 korrekt zu speichern. In einigen BIOS-Versionen gibt es ein Problem (fast alle Award-BIOS zwischen dem 26.04.1994 und dem 31.05.1995), das die korrekte Verarbeitung der Jahre nach 1999 verhindert. Falls Sie versuchen, das Jahr der Jahrhundertwende auf weniger als 94 (bzw. 95 in einigen Fällen) zu setzen, dann wird der tatsächliche Wert auf 94 (oder 95) gesetzt. Sollten Sie eine dieser Maschinen betreiben, dann ist hwclock nicht in der Lage, das Jahr nach 1999 korrekt zu setzen, daher kann dieser Wert der Uhr nicht als wirkliche Zeit verwendet werden.

    Um dies auszugleichen (ohne BIOS-Aktualisierung, was definitiv zu bevorzugen wäre), verwenden Sie stets --badyear auf einer solchen Maschine. Wenn hwclock weiß, dass es mit einer solchen eingeschränkten Uhr arbeiten muss, dann wird die Jahresangabe des Wertes der Hardware-Uhr ignoriert. Stattdessen wird das Jahr auf der Grundlage des zuletzt kalibrierten Datums in der adjtime-Datei »erraten«. Dabei wird angenommen, dass dieses Datum im letzten Jahr liegt. Damit dies funktioniert, müssen Sie hwclock --set oder hwclock --systohc mindenstens einmal im Jahr ausführen!

    Obwohl hwclock die Jahresangabe beim Lesen der Hardware-Uhr ignoriert, wird dennoch der Jahreswert eingefügt, wenn die Uhr eingestellt wird. Er wird auf 1995, 1996, 1997 oder 1998 gestellt, je nachdem, welches davon die gleiche Position im Schaltjahreszyklus wie das tatsächliche Jahr hat. Auf diese Weise fügt die Hardware-Uhr Schalttage ein, wo sie hingehören. Und wieder: Falls Sie die Hardware-Uhr länger als ein Jahr laufen lassen, ohne sie einzustellen, kann dieses Schema scheitern und Sie können einen Tag verlieren.

--date=Datumszeichenkette
    Sie benötigen diese Option, wenn Sie die Funktionen --set oder --predict angeben, anderenfalls wird sie ignoriert. Sie gibt die Zeit an, auf welche die Hardware-Uhr gesetzt werden soll, oder die Zeit, für die die Anzeige der Hardware-Uhr vorhergesagt werden soll. Der Wert dieser Option wird als Argument für die Option --date des Programms date(1) verwandt. Beispiel:

        hwclock --set --date='2011-08-14 16:45:05'

    Das Argument muss in lokaler Zeit sein, selbst wenn Sie Ihre Hardware-Uhr in UTC halten. Siehe die Option --localtime. Das Argument darf keine relative Zeit wie »+5 minutes« sein, da hwclocks Genauigkeit von dem Zusammenhang zwischen dem Wert des Arguments und dem Zeitpunkt, zu dem die Eingabetaste gedrückt wird, abhängt.

-D, --debug
    zeigt ausführliche Informationen dazu an, wie hwclock intern arbeitet. Teile dieser Funktionalität sind recht komplex, so dass diese Ausgabe Ihnen helfen kann, zu verstehen, wie das Programm funktioniert.

--directisa
    Diese Option ist auf ISA-kompatiblen Maschinen (einschließlich X86 und X86_64 und Alpha (die eine ähnliche Hardware-Uhr-Schnittstelle hat) von Bedeutung. Auf anderen Maschinen hat dies keine Auswirkungen. Diese Option weist hwclock explizit an, E/A-Anweisungen für den Zugriff auf die Hardware-Uhr vorzunehmen. Ohne diese Option versucht hwclock, das RTC-Gerät zu verwenden, wobei angenommen wird, dass dieses mit dem RTC-Gerätetreiber läuft. Seit v2.26 wird er nicht mehr automatisch directisa verwenden, wenn der RTC-Treiber nicht verfügbar ist. Dies führte zu unsicheren Bedingungen, die es erlaubten, dass zwei Prozesse auf die Hardware-Uhr gleichzeitig zugreifen konnten. Direkter Hardware-Zugriff aus dem Benutzerraum sollte nur zum Testen, zur Fehlersuche und als letzte Rettung, wenn alle anderen Methoden fehlschlagen, verwandt werden. Siehe die Option --rtc.

-f, --rtc=Dateiname
    Setzt den Vorgabe-RTC-Dateinamen von hwclock außer Kraft. Andernfalls wird der erste aus der folgenden Liste (in dieser Reihenfolge) verwandt:
    /dev/rtc
    /dev/rtc0
    /dev/misc/rtc
    Für IA-64:
    /dev/efirtc
    /dev/misc/efirtc

--localtime
-u, --utc
    zeigt an, auf welche Zeitskala die Hardware-Uhr gesetzt ist.

    Die Hardware-Uhr kann konfiguriert sein, entweder UTC oder die lokale Zeitskala zu verwenden, allerdings gibt es nichts in der Uhr, das angibt, welche der Varianten gewählt wurde. Die Optionen --localtime und --utc übergeben diese Information an den Befehl hwclock. Falls Sie das Falsche festlegen (oder keines angeben und die falsche Voreinstellung nehmen) werden sowohl das Setzen als auch das Lesen der Hardware-Uhr inkorrekt sein.

    Falls Sie weder --utc noch --localtime angeben, dann wird die zuletzt mit der Setzen-Funktion (--set, --systohc oder --adjust) verwendete benutzt, wie dies in /etc/adjtime aufgezeichnet ist. Falls die adjtime-Datei nicht existiert, wird UTC als Vorgabe verwendet.

    Hinweis: Zeitübergangs-Änderungen können inkonsistent sein, falls die Hardware-Uhr in lokaler Zeit betrieben wird. Lesen Sie die Diskussion weiter unten unter LOKAL vs. UTC.

--noadjfile
    deaktiviert die von /etc/adjtime bereitgestellten Leistungen. hwclock liest oder schreibt nicht in diese Datei, wenn diese Option angegeben ist. Entweder --utc oder --localtime müssen mit dieser Option angegeben werden.

--test
    ändert tatsächlich nichts am System, d.h. den Uhren oder der adjtime-Datei. Dies ist speziell zusammen mit --debug sinnvoll, wenn Sie mehr über hwclock lernen wollen.

--update-drift
    aktualisiert den Abweichungsfaktor der Hardware-Uhr in /etc/adjtime. Sie wird zusammen mit --set oder --systohc verwandt, andernfalls wird sie ignoriert.

    Zwischen Einstellungen ist minimal ein Abstand von vier Stunden notwendig. Damit werden ungültige Berechnungen vermieden. Je länger die Periode, desto präziser wird der sich ergebende Abweichungsfaktor sein.

    Diese Option wurde in v2.26 hinzugefügt, da typischerweise auf Systemen beim Herunterfahren hwclock --systohc aufgerufen wird. Mit dem alten Verhalten würde dabei automatisch der Abweichungsfaktor (neu) berechnet werden, wodurch mehrere Probleme entstanden:

    •   Wird NTPD mit einem »11-Minuten-Modus«-Kernel verwandt, würde der Abweichungsfaktor auf fast Null verfremdet.

    •   Es würde nicht die Verwendung von »kalter«-Abweichungskorrektur erlauben. Bei den meisten Konfigurationen führt die »kalte« Abweichungskorrektur zu besseren Ergebnissen. Kalt bedeutet, wenn die Maschine ausgeschaltet ist, was eine wesentliche Auswirkung auf den Abweichungsfaktor haben kann.

    •   (Neu-)Berechnung des Abweichungsfaktors bei jedem Herunterfahren führt zu suboptimalen Ergebnissen. Führen beispielsweise kurzzeitige Bedingungen dazu, dass die Maschine ungewöhnlich heiß wird, wäre die Abweichungsfaktorberechnung außerhalb des Gültigkeitsbereichs.

    Die Berechnung des Abweichungsfaktors durch hwclock ist ein guter Start, aber für optimale Ergebnisse wird wahrscheinlich die Datei /etc/adjtime direkt bearbeitet werden müssen. Bei den meisten Konfigurationen braucht die Abweichung nicht mehr verändert zu werden, sobald der optimale Abweichungsfaktor erstellt wurde. Daher wurde das alte Verhalten, die Abweichung automatisch (neu) zu berechnen, geändert und benötigt nun dafür eine Option. Lesen Sie die Diskussion weiter unten unter Die Adjust-Funktion.

OPTIONEN NUR FÜR ALPHA-MASCHINEN

--arc
    Diese Option ist gleichbedeutend mit --epoch=1980 und wird zum Setzen des üblichen Epochenwertes auf Alpha-Rechnern mit einer ARC-Konsole verwendet (allerdings haben die Ruffian-Boards einen Epochenwert von 1900).

--epoch=Jahr
    legt das Startjahr des Epochenwertes der Hardware-Uhr fest. Dies ist die Anzahl der Jahre bis zum aktuellen Jahr ausgehend vom Nullwert in der Jahreszählung der Hardware-Uhr. Dies wird zusammen mit der Option --setepoch verwendet, um den Epochenwert der Hardware-Uhr des Kernels zu setzen.

    Beispiel für einen Digital-Unix-Rechner:

        hwclock --setepoch --epoch=1952

--funky-toy
--jensen
    Diese beiden Optionen geben die Art der verwendeten Alpha-Maschine an. Sie sind unzulässig, falls Sie keine Alpha-Maschine betreiben und selbst dann nicht erforderlich, denn hwclock sollte in der Lage sein, selbständig herauszufinden, worauf es läuft, wenn /proc eingehängt ist.

    Die Option --jensen wird für Jensen-Modelle verwandt; --funky-toy bedeutet, dass für die Maschine in der Hardware-Uhr das UF-Bit anstelle des UIP-Bits verwendet werden muss, um den Zeitübergang zu erkennen. »Toy« im Namen der Option bezieht sich auf die »Time Of Year«-Einrichtung der Maschine.

--srm
    Diese Option ist gleichbedeutend mit --epoch=1900 und wird zum Setzen des üblichsten Epochenwertes auf Alpha-Rechnern mit SRM-Konsole verwendet.

ANMERKUNGEN

  Uhren in einem Linux-System

Es gibt zwei Arten von Datum-Zeit-Uhren:

Die Hardware-Uhr: Diese Uhr ist ein unabhängiges Hardware-Gerät, mit seinem eigenen Energiebereich (Batterie, Kondensatoren, usw.), das läuft, wenn die Maschine ausgeschaltet oder sogar vom Netz getrennt ist.

Auf einem ISA-kompatiblen System wird diese Uhr als Teil des ISA-Standards spezifiziert. Ein Steuerprogramm kann diese Uhr nur in ganzen Sekunden stellen oder auslesen, aber es kann auch die Signalübergänge der Ein-Sekunden-Impulse erkennen, so dass die Uhr über virtuell unendliche Präzision verfügt.

Diese Uhr wird allgemein die Hardware-Uhr, die Echtzeituhr, die RTC, die BIOS-Uhr oder die CMOS-Uhr genannt. Der Begriff Hardware-Uhr wurde für hwclock gewählt. Der Linux-Kernel bezeichnet sie auch als beständige Uhr.

Einige Nicht-ISA-Systeme haben ein paar Echtzeituhren, wobei nur eine davon ihre eigene Energieversorgung hat. Ein sehr energiesparender externer I²C- oder SPI-Uhrchip könnte mit einer Stützbatterie als Hardware-Uhr fungieren, um eine funktionellere integrierte Echtzeituhr zu initialisieren, die für die meisten anderen Zwecke verwendet wird.

Die Systemuhr: Diese Uhr ist Teil des Linux-Kernels und wird durch einen Timer-Interrupt gesteuert (auf einer ISA-Maschine ist der Timer-Interrupt Teil des ISA-Standards). Sie ist nur von Bedeutung, solange Linux auf der Maschine läuft. Die Systemzeit wird als die Anzahl der Sekunden seit dem 1. Januar 1970 um 00:00:00 Uhr Weltzeit ausgedrückt, oder anders formuliert, die Anzahl der seit 1969 UTC vergangenen Sekunden. Die Systemzeit ist dennoch keine Ganzzahl. Sie hat virtuell unbegrenzte Präzision.

Die Systemzeit ist die Zeit, auf die es ankommt. Der grundlegende Zweck der Hardware-Uhr in einem Linux-System ist die Erhaltung der Zeit, wenn Linux nicht läuft, so dass die Systemzeit beim Systemstart daraus initialisiert werden kann. Beachten Sie, dass in DOS, wofür der ISA-Standard entworfen wurde, die Hardware-Uhr die einzig verfügbare Echtzeituhr ist.

Es ist wichtig, dass die Zählung der Systemzeit nicht unterbrochen wird, zum Beispiel wenn Sie mit dem Befehl date(1) die Systemzeit setzen, während das System läuft. Sie können dennoch im laufenden Betrieb mit der Hardware-Uhr tun, was Sie wollen, und beim nächsten Linux-Start wird die Zeit der Hardware-Uhr entsprechend angepasst. Hinweis: Derzeit ist dies auf den meisten Systemen nicht möglich, da beim Herunterfahren hwclock --systohc aufgerufen wird.

Die Zeitzone des Linux-Kernels wird durch hwclock gesetzt. Aber lassen Sie sich nicht in die Irre führen – beinahe niemand interessiert sich dafür, was der Kernel meint, in welcher Zeitzone er sich befindet. Stattdessen müssen Programme, für die die Zeitzone wichtig ist (um Ihnen beispielsweise die lokale Zeit anzuzeigen), fast immer einen etwas traditionelleren Weg wählen, um die Zeitzone zu ermitteln: Sie benutzen die TZ-Umgebungsvariable oder die Datei /etc/localtime, wie in der Handbuchseite zu tzset(3) erklärt. Jedoch nutzen einige Programme und Teile des Linux-Kernels dessen Zeitzonenwert, zum Beispiel Dateisysteme. Ein Beispiel hierfür ist das vfat-Dateisystem. Ist der Zeitzonenwert im Kernel falsch gesetzt, werden vom vfat-Dateisystem falsche Zeitstempel gemeldet und gesetzt. Ein weiteres Beispiel ist der NTP-11-Minuten-Modus-Modus des Kernels. Falls der Zeitzonenwert des Kernels und/oder die Variable persistent_clock_is_local falsch ist, dann wird die Hardware durch den 11-Minuten-Modus-Modus falsch gesetzt. Lesen Sie hierzu die Diskussion weiter unten, unter Automatischer Abgleich der Hardware-Uhr durch den Kernel.

hwclock setzt den Kernel-Zeitzonenwert auf den durch die Umgebungsvariable TZ oder aus /etc/localtime mit den Funktionen --hctosys oder --systz angegebenen Wert.

Der Zeitzonenwert des Kernels besteht aus zwei Teilen: erstens dem Feld »tz_minuteswest«, das die Anzahl der Minuten angibt, die die lokale Zeit (nicht an Sommer-/Winterzeit angepasst) gegenüber der Weltzeit zurückbleibt, und zweitens dem Feld »tz_dsttime«, welches angibt, ob am entsprechenden Ort gerade Sommer- oder Winterzeit herrscht. Dieses zweite Feld wird unter Linux nicht genutzt und wird stets auf 0 gesetzt. Siehe auch settimeofday(2).

  Zugriffsmethoden auf Hardware-Uhren

hwclock verwendet viele verschiedene Arten, die Hardware-Uhr-Werte zu ermitteln und zu setzen. Der normale Weg besteht in E/A zu der besondere Datei des RTC-Geräts. Dabei wird angenommen, dass diese vom RTC-Treiber betrieben wird. Auch sind Linux-Systeme, die das RTC-Konzept mit Udev verwenden, in der Lage, mehrere Hardware-Uhren zu unterstützen. Damit könnte die Notwendigkeit entstehen, das Vorgabe-RTC-Gerät mit der Option --rtc außer Kraft zu setzen.

Allerdings ist diese Methode nicht immer verfügbar, da ältere Systeme über keinen RTC-Treiber verfügen. Auf diesen Systemen hängt die Art des Zugriffs auf die Hardware-Uhr von der Art der Systemhardware ab.

Auf einem ISA-kompatiblen System kann hwclock direkt über Ein- und Ausgaben der Ports 0x70 und 0x71 auf die CMOS-Speicherregister zugreifen, welche die Uhr darstellen. Es werden E/A-Anweisungen verwendet, was konsequenterweise nur funktionieren kann, wenn diese mit der effektiven Benutzerkennung des Superusers aufgerufen werden. Diese Methode kann durch Angabe der Option --directisa festgelegt werden.

Dies ist eine recht armselige Methode, auf die Uhr zuzugreifen, vor allem deshalb, weil Programme auf Anwenderebene generell nicht dafür bestimmt sind, direkte E/A-Vorgänge auszuführen und Interrupts zu deaktivieren. hwclock bietet dies zum Testen, Fehlersuchen und da es auf ISA-kompatiblen und Alpha-Systemen, die über keinen funktionierenden RTC-Gerätetreiber verfügen, die einzige verfügbare Methode sein könnte.

Auf einer Jensen-Alpha-Maschine gibt es für hwclock keine Möglichkeit, diese E/A-Anweisungen auszuführen, daher wird stattdessen die spezielle Gerätedatei /dev/port verwendet, welche fast eine Low-Level-Schnittstelle zum E/A-Subsystem bereitstellt.

Auf einem m68k-System kann hwclock mit dem Konsolentreiber auf die Uhr über die spezielle Gerätedatei /dev/tty1 zugreifen.

  Die Adjust-Funktion

Die Hardware-Uhr ist üblicherweise nicht sehr genau. Jedoch lässt sich die Genauigkeit recht gut vorhersagen – sie geht jeden Tag die gleiche Zeit vor oder nach. Dies nennt man die Systemabweichung. Mit der Funktion --adjust von hwclock können Sie die Systemabweichung der Hardware-Uhr korrigieren.

Es funktioniert folgendermaßen: hwclock verwaltet die Datei /etc/adjtime, in der einige historische Informationen gespeichert sind. Diese Datei wird adjtime-Datei genannt.

Nehmen wir an, Sie beginnen ohne adjtime-Datei. Sie rufen den Befehl hwclock --set auf, um die Hardware-Uhr auf die tatsächliche aktuelle Zeit zu stellen. hwclock legt die adjtime-Datei an und zeichnet darin die Zeit als jene der letzten Kalibrierung der Uhr auf. Fünf Tage später geht die Uhr 10 Sekunden vor, und Sie rufen hwclock --set --update-drift auf, um die Uhr 10 Sekunden zurückzustellen. hwclock aktualisiert die adjtime-Datei, zeichnet wiederum die aktuelle Zeit als den Zeitpunkt der letzten Kalibrierung auf, wobei diesmal 2 Sekunden pro Tag als systematische Abweichung protokolliert werden. 24 Stunden später rufen Sie den Befehl hwclock --adjust auf. hwclock befragt die adjtime-Datei und stellt fest, dass die Uhr, wenn sie nicht korrigiert wird, 2 Sekunden pro Tag vorgeht. So zieht es die 2 Sekunden von der Zeit der Hardware-Uhr ab, da die Uhr genau 24 Stunden nicht korrigiert wurde. Die aktuelle Zeit wird auch wieder als die Zeit der letzten Kalibrierung aufgezeichnet. Noch einmal 24 Stunden später funktioniert der Befehl hwclock --adjust wieder auf die gleiche Weise: hwclock zieht 2 Sekunden ab und aktualisiert die adjtime-Datei mit der aktuellen Zeit als letztem Kalibrierungszeitpunkt der Uhr.

Wenn Sie die Option --update-drift mit --set oder --systohc verwenden, wird die automatische Abweichungsrate durch Vergleich der vollabweichungskorrigerten Hardware-Uhr mit der jetzt gesetzten Zeit (neu) berechnet. Daraus wird die 24-Stunden-Abweichungsrate basierend auf dem letzten kalibrierten Zeitstempel aus der Adjtime-Datei abgeleitet. Dieser aktualisierte Abweichungsfaktor wird dann in /etc/adjtime gespeichert.

Kleinere Fehler schleichen sich beim Stellen der Hardware-Uhr ein, daher unterlässt --adjust Korrekturen von weniger als einer Sekunde. Wenn Sie zu einem späteren Zeitpunkt erneut die Uhr stellen wollen, wird die aufgesammelte Abweichung nun mehr als eine Sekunde betragen und --adjust führt die Korrektur einschließlich eines Bruchanteils aus.

hwclock --hctosys verwendet auch die Adjtime-Dateidaten, um den Wert aus der Hardware-Uhr auszugleichen, bevor es die Systemuhr stellt. Es teilt nicht die 1-Sekunden-Begrenzung von --adjust und wird Teilsekundenabweichungen sofort korrigieren. Es ändert weder die Hardware-Uhr noch die Adjtime-Datei. Dies könnte die Notwendigkeit von --adjust beseitigen, außer etwas anderes auf dem System benötigt die Ausgleichung der Hardware-Uhr.

  Die Datei Adjtime
Sie wurde wegen ihres früheren ausschließlichen Zwecks der Steuerung des Abgleichs so benannt und enthält außerdem Informationen, die hwclock für spätere Aufrufe speichert.

Die adjtime-Datei verwendet folgendes Format, in ASCII:

Zeile 1: drei Zahlen, durch Leerzeichen getrennt: 1) die systematische Abweichung in Sekunden pro Tag als dezimale Fließkommazahl; 2) die sich ergebende Anzahl der Sekunden seit 1969 Weltzeit gemäß der letzten Anpassung oder Kalibrierung als dezimale Ganzzahl; 3) Null (zwecks Kompatibilität zu clock(8)) als dezimale Ganzzahl.

Zeile 2: eine Zahl: die sich ergebende Anzahl der Sekunden seit 1969 Weltzeit gemäß der letzten Kalibrierung. Dies ist Null, falls noch keine Kalibrierung ausgeführt wurde oder eine frühere Kalibrierung fehlschlug (zum Beispiel wurde die Hardware-Uhr seit der Kalibrierung zwar gefunden, enthielt aber keine gültige Zeit). Dies ist eine dezimale Ganzzahl.

Zeile 3: »UTC« oder »LOCAL«. Dies gibt an, ob die Hardware-Uhr auf lokale Zeit oder Weltzeit eingestellt ist. Sie können diesen Wert stets mit den Befehlszeilenoptionen zu hwclock außer Kraft setzen.

Sie können eine adjtime-Datei, die früher bereits mit dem Programm clock(8) genutzt wurde, auch mit hwclock verwenden.

  Automatischer Abgleich der Hardware-Uhr durch den Kernel

Es gibt auf einigen Systemen einen weiteren Weg, die Hardware-Uhr synchron zu halten. Der Linux-Kernel verfügt über einen Modus, in dem in Abständen von 11 Minuten die Systemzeit in die Hardware-Uhr kopiert wird. Dieser Modus wird beim Kompilieren ausgewählt, daher werden nicht alle Kernel über diese Fähigkeit verfügen. Dieser Modus ist sinnvoll, wenn Sie etwas Fortschrittliches wie NTP verwenden, um die Systemuhr synchron zu halten. (NTP bezeichnet die Synchronisation der Systemzeit entweder über einen Zeitserver im Netzwerk oder über eine an Ihrem System angeschlossene Funkuhr, siehe RFC 1305.)

Falls der Kernel mit der Option »11-Minuten-Modus« übersetzt ist, wird er aktiv sein, wenn sich die Uhrdisziplin des Kernels in einem synchronisierten Zustand befindet. In diesem Zustand ist das Bit 6 (das Bit, das mit der Maske 0x0040 gesetzt wird) der Kernelvariablen time_status nicht gesetzt. Der Wert wird als »Status«-Zeile der Befehle adjtimex --print oder ntptime ausgegeben.

Es bedarf eines Einflusses von außen, wie des NTP-Daemons ntpd(1), um die Uhrdisziplin des Kernels in einen synchronisierten Status zu bringen und damit den » 11-Minuten-Modus« zu aktivieren. Dieser kann durch die Ausführung von allem, die die Systemuhr auf die althergekommene Art setzt, wie hwclock --hctosys, wieder ausgeschaltet werden. Falls der NTP-Daemon allerdings noch läuft, wird er den » 11-Minuten-Modus« beim nächsten Synchronisieren der Systemuhr wieder einschalten.

Falls Ihr System mit aktiviertem »11-Minuten-Modus« läuft, könnte die Verwendung von entweder --hctosys oder --systz in den Systemstartskripten notwendig sein, insbesondere falls die Hardware-Uhr auf die lokale Zeitskala konfiguriert ist. Falls der Kernel nicht informiert ist, unter welcher Zeitskala die Hardware-Uhr läuft, könnte er sie mit der falschen verfremden. Der Kernel verwendet standardmäßig UTC.

Der erste Benutzerraumbefehl, der die Systemuhr setzt, informiert den Kernel, welche Zeitskala die Hardware-Uhr verwendet. Dies passiert über die Kernelvariable persistent_clock_is_local. Falls --hctosys oder --systz zuerst ist, wird es diese Variable entsprechend der Adjtime-Datei oder dem geeigneten Befehlszeilenargument setzen. Beachten Sie, dass der Einsatz dieser Fähigkeit erfordert, dass bei Änderung der Hardware-Uhr-Zeitskalenkonfiguration ein Systemneustart zur Information des Kernels benötigt wird.

hwclock --adjust sollte nicht zusammen mit NTPs »11-Minute-Modus« verwandt werden.

  Jahrhundertwert der ISA-Hardware-Uhr

Es gibt eine Art von Standard, der das CMOS-Speicherbyte 50 auf einer ISA-Maschine als Anzeiger für das aktuelle Jahrhundert verwendet. hwclock nutzt oder setzt dieses Byte nicht, da es einige Maschinen gibt, die das Byte nicht auf diese Weise definieren und es sowieso unnötig ist. Das year-of-century leistet gute Arbeit beim Ermitteln des aktuellen Jahrhunderts.

Falls Sie einen echten Anwendungsfall für das CMOS-Century-Byte haben, kontaktieren Sie den Betreuer von hwclock, eine Option könnte hier zweckdienlich sein.

Beachten Sie, dass dieser Abschnitt nur relevant ist, wenn Sie die »Direct ISA«-Methode für den Zugriff auf die Hardware-Uhr verwenden. ACPI bietet eine standardisierte Zugriffsmöglichkeit auf die Jahrhundertwerte an, sofern diese von der Hardware unterstützt werden.

DATUM-ZEIT-KONFIGURATION

  Zeit ohne externe Synchronisation erhalten

Diese Diskussion basiert auf den folgenden Annahmen:

•   Es läuft nichts, das die Echtzeituhren ändert, wie ntpd(1) oder ein Cron-Job.

•   Die Systemzeitzone ist für die korrekte lokale Zeit konfiguriert. Siehe unten unter POSIX kontra »KORREKT«.

•   Früh während des Systemstarts wird folgendes in dieser Reihenfolge aufgerufen:
    adjtimex --tick Wert --frequency Wert
    hwclock --hctosys

•   Während des Herunterfahrens wird folgendes aufgerufen:
    hwclock --systohc

* Systeme ohne adjtimex können ntptime verwenden.

Egal, ob eine Präzisionzeit mit ntpd(1) verwaltet wird oder nicht, ist es sinnvoll, das System so konfigurieren, dass es allein eine vernünftig gute Datum-Uhrzeit hält.

Im ersten Schritt dafür muss ein klares Verständnis des Gesamtbildes erreicht werden. Es gibt zwei komplett getrennte Hardwaregeräte, die alleine in ihrer eigenen Geschwindigkeit laufen und von der »korrekten« Zeit mit ihrer eigenen Rate abweichen. Die Methoden und Software für die Abweichungskorrektur unterscheiden sich für beide. Allerdings sind die meisten Systeme so konfiguriert, dass die beiden Uhren beim Systemstart und -herunterfahren die Werte austauschen. Dadurch werden die Fehlerkorrekturwerte der einzelnen Geräte zwischen beiden hin und her übertragen. Wird versucht, nur bei einem von ihnen eine Abweichungskorrektur vorzunehmen, wird die Abweichung des anderen Geräts darübergelegt.

Dieses Problem kann bei Konfiguration der Abweichung der Systemuhr vermieden werden, indem die Maschine nicht heruntergefahren wird. Dies und der Tatsache, dass die gesamte Präzision von hwclock (einschließlich der Berechnung des Abweichungsfaktors) von der Korrektheit der Systemuhrrate abhängt, bedeutet, dass die Konfiguration der Systemuhr zuerst erfolgen sollte.

Die Abweichung der Systemuhr wird mit den Optionen --tick und --frequency des Befehls adjtimex(8) korrigiert. Diese zwei Optionen arbeiten zusammen: »tick« ist die grobe und »frequency« die feine Anpassung. (Für Systeme, die kein Paket adjtimex haben, kann eventuell stattdessen ntptime -f ppm verwandt werden.)

Einige Linux-Distributionen versuchen, die Abweichung der Systemuhr mit der Vergleichsaktion von adjtimex automatisch zu berechnen. Der Versuch, eine abweichende Uhr mittels einer anderen abweichenden Uhr als Referenz zu korrigieren, gleicht dem Versuch eines Hundes, seinen eigenen Schwanz zu fangen. Es mag irgendwann von Erfolg gekrönt sein, aber vorher ist großer Aufwand und viel Frust involviert. Diese Automatisierung mag eine Verbesserung gegenüber keiner Konfiguration sein, aber optimale Ergebnisse zu erwarten, wäre fehlerhaft. Eine bessere Wahl für eine manuelle Konfiguration wäre die Option --log von adjtimex.

Es mag effizienter sein, einfach die Abweichung der Systemuhr mit sntp oder date -Ins und einem genauen Zeitstück nachzuverfolgen und dann die Abweichung manuell zu berechnen.

Nach dem Setzen der Tick- und Frequenzwerte fahren Sie mit dem Prüfen und Verfeinern der Anpassungen fort, bis die Systemuhr eine gute Zeit hält. Siehe adjtimex(8) für weitere Informationen und ein Beispiel, das die manuelle Abweichungskorrektur zeigt.

Sobald der Takt der Systemuhr sauber ist, widmen Sie sich der Hardware-Uhr.

In der Regel funktioniert die kalte Abweichung in den meisten Fällen am besten. Dies sollte sogar auf Maschinen zutreffen, die 24/7 laufen und deren normale Auszeit aus einem Systemneustart besteht. In diesen Fällen stellt der Abweichungsfaktor kaum einen Unterschied dar. Aber in den seltenen Fällen, in denen die Maschine für eine längere Zeit ausgeschaltet wird, sollte die kalte Abweichung zu besseren Ergebnissen führen.

Schritte zur Berechnung der kalten Abweichung:

1   Stellen Sie sicher, dass ntpd(1) beim Systemstart nicht gestartet wird.

2   Beim Herunterfahren muss die Zeit der Systemuhr korrekt sein!

3   Fahren Sie das System herunter.

4   Lassen Sie eine ausgedehnte Zeit vergehen, ohne die Hardware-Uhr zu ändern.

5   Starten Sie das System.

6   Verwenden Sie sofort hwclock, um die korrekte Zeit zu setzen, fügen Sie dabei die Option --update-drift hinzu.

Hinweis: Falls in Schritt 6 --systohc verwandt wird, muss davor die Systemuhr korrekt gesetzt werden (Schritt 6a).

Die Berechnung des Abweichungsfaktors mit hwclock ist ein guter Startpunkt, aber für optimale Ergebnisse wird es wahrscheinlich notwendig sein, dies durch direkte Bearbeitung der Datei /etc/adjtime anzupassen. Fahren Sie fort, den Abweichungsfaktor zu testen und verfeinern, bis die Hardware-Uhr beim Systemstart korrekt eingestellt ist. Um dies zu überprüfen, stellen Sie erst sicher, dass die Systemzeit vor dem Herunterfahren korrekt ist und dann verwenden Sie direkt nach dem Starten sntp oder date -Ins und eine Präzisionsuhr.

  LOKAL vs. UTC
Wird die Hardware-Uhr in der lokalen Zeitskala betrieben, führt dies zu inkonsistenten Sommerzeitergebnissen:

•   Falls Linux während des Sommer-/Winterzeitwechsels läuft, wird die in die Hardware-Uhr geschriebene Zeit für die Änderung angepasst.

•   Falls Linux NICHT während des Sommer-/Winterzeitwechsels läuft, wird die von der Hardware-Uhr gelesene Zeit NICHT für die Änderung angepasst werden.

Die Hardware-Uhr auf einem ISA-kompatiblen System hält nur ein Datum und eine Zeit. Sie kennt weder das Konzept der Zeitzone noch der Sommer-/Winterzeit. Daher nimmt hwclock, wenn ihm mitgeteilt wird, dass es in lokaler Zeit läuft, an, dass es sich in der »korrekten« lokalen Zeit befindet und führt keine Anpassungen für die aus ihr gelesene Zeit durch.

Linux führt den Sommer-/Winterzeitwechsel nur korrekt durch, wenn die Hardware-Uhr in der UTC-Zeitskala läuft. Dies wird Systemadministratoren erleichtert, da hwclock die lokale Zeit für seine Ausgabe und als Argument für die Option --date verwendet.

POSIX-Systeme sind wie Linux so entwickelt, dass die Systemuhr in der UTC-Zeitskala läuft. Der Zweck der Hardware-Uhr liegt darin, die Systemuhr zu initialisieren, daher ergibt ein Betrieb in UTC Sinn.

Linux versucht allerdings, die Tatsache, dass sich die Hardware in der lokalen Zeitskala befindet, zu berücksichtigen. Dies dient primär dem dualen Systemstart mit älteren Versionen von MS Windows. Seit Windows 7 soll der Registrierungsschlüssel RealTimeIsUniversal korrekt funktionieren, so dass die Hardware-Uhr in UTC gehalten werden kann.

  POSIX kontra »KORREKT«
Eine Diskussion der Datum/Zeit-Konfiguration wäre allerdings unvollständig, ohne Zeitzonen zu behandeln. Dies wird gut in tzset(3) abgedeckt. Ein Punkt, für den es keine Dokumentation gibt, ist das »korrekte« Verzeichnis der Zeitzonendatenbank, manchmal auch tz oder Zoneinfo genannt.

Es gibt zwei getrennte Datenbanken in dem Zoneinfo-System, POSIX und »korrekt«. »Korrekt« (jetzt Zoneinfo-leaps genannt) enthält Schaltsekunden, POSIX nicht. Um die »korrekte« Datenbank zu verwenden, muss die Systemuhr auf (UTC + Schaltsekunden) gesetzt sein, was zu (TAI - 10) äquivalent ist. Dies ermöglicht es, die genaue Anzahl von Sekunden zwischen zwei Daten zu berechnen, wenn dabei ein Schaltesekundenzeitraum durchlaufen wird. Die Systemuhr wird dann in die korrekte zivile Zeit, einschließlich UTC, umgewandelt, indem die »korrekten« Zeitzonendateien verwandt werden, die die Schaltsekunden abziehen. Hinweis: Diese Konfiguration wird als experimentell bezeichnet und hat bekanntermaßen Probleme.

Um ein System zur Verwendung einer bestimmten Datenbank zu konfigurieren, müssen alle in seinem Verzeichnis befindliche Dateien in die Wurzel von /usr/share/zoneinfo kopiert werden. Dateien werden nie vom POSIX- oder »korrekten« Unterverzeichnis benutzt, z.B. TZ='right/Europe/Dublin'. Diese Gepflogenheit wurde so üblich, dass die Originalentwickler des Zoneinfo-Projekts den Systemdateibaum restrukturierten, indem sie die POSIX- und »korrekten« Unterverzeichnisse aus dem Zoeninfo-Verzeichnis und in benachbarte Verzeichnisse verschoben:

/usr/share/zoneinfo
/usr/share/zoneinfo-posix
/usr/share/zoneinfo-leaps

Unglücklicherweise ändern einige Linux-Distributionen dies in ihren Paketen wieder auf die alte Struktur zurück. Daher besteht das Problem der Systemadministratoren, die in das »korrekte« Unterverzeichnis hineingreifen, weiter fort. Dies führt dazu, dass die Systemzeitzone konfiguriert wird, Schaltsekunden zu beachten, während die Zoneinfo-Datenbank weiterhin so konfiguriert ist, sie auszuschließen. Wenn dann eine Anwendung wie die »World Clock« die Zeitzonendatei South_Pole benötigt oder ein E-Mail-MTA oder hwclock die UTC-Zeitzonen-Datei benötigen, holen sie sie von der Wurzel von /usr/share/zoneinfo, da das so von ihnen erwartet wird. Diese Dateien schließen Schaltsekunden aus, aber die Systemuhr berücksichtigt sie, wodurch eine falsche Umwandlung hervorgerufen wird.

Der Versuch, Dateien aus diesen getrennten Datenbanken vermischt zu benutzen, wird nicht funktionieren, da sie von der Systemuhr verlangen, eine andere Zeitskala zu verwenden. Die Zoneinfo-Datenbank muss wie oben beschrieben konfiguriert werden, entweder die POSIX oder »korrekte« zu benutzen, oder indem der Umgebungsvariablen TZDIR ein Datenbankpfad zugewiesen wird.

UMGEBUNGSVARIABLEN

TZ  Falls diese Variable gesetzt ist, hat der Wert Vorrang vor der im System konfigurierten Zeitzone.

TZDIR
    Falls diese Variable gesetzt ist, hat der Wert Vorrang vor dem im System konfigurierten Zeitzonendatenbankverzeichnispfad.

DATEIEN

/etc/adjtime
    Die Konfiguration und die Zustandsdateien für Hwclock.

/etc/localtime
    Die Systemzeitzonedatei.

/usr/share/zoneinfo/
    Das Systemzeitzonendatenbankverzeichnis.

Gerätedateien, die hwclock für den Zugriff auf die Hardware-Uhr versuchen darf:
/dev/rtc
/dev/rtc0
/dev/misc/rtc
/dev/efirtc
/dev/misc/efirtc
/dev/port
/dev/tty1

SIEHE AUCH
date(1), adjtimex(8), gettimeofday(2), settimeofday(2), crontab(1), tzset(3)

AUTOREN
Geschrieben von Bryan Henderson, September 1996 (bryanh@giraffe-data.com), basierend auf dem Programm clock(8) von Charles Hedrick, Rob Hooft und Harald Koenig. Im Quellcode finden Sie die vollständige Geschichte einschließlich der Danksagungen.

VERFÜGBARKEIT
Der Befehl hwclock ist Teil des Pakets util-linux und kann von ftp://ftp.kernel.org/pub/linux/utils/util-linux/ heruntergeladen werden.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann <mario.blaettermann@gmail.com> und Helge Kreutzmann <debian@helgefjell.de> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.