108.1 Lektion 1
Zertifikat: |
LPIC-1 (102) |
---|---|
Version: |
5.0 |
Thema: |
108 Grundlegende Systemdienste |
Lernziel: |
108.1 Die Systemzeit verwalten |
Lektion: |
1 von 2 |
Einführung
Exakte Zeitmessung ist für moderne Datenverarbeitung absolut notwendig. Die Implementierung der Zeitmessung ist jedoch erstaunlich komplex. Einem Benutzer scheint es trivial, aber das System muss viele Besonderheiten und Randfälle intelligent handhaben. So sind beispielsweise Zeitzonen nicht statisch, sondern ändern sich durch administrative oder politische Entscheidungen, oder ein Land kann beschließen, keine Sommerzeit mehr zu haben. Jedes Programm muss in der Lage sein, mit solchen Änderungen logisch umzugehen. Zum Glück für Systemadministratoren sind die Lösungen für die Zeitmessung unter Linux ausgereift, robust und in der Regel ohne große Eingriffe lauffähg.
Wenn ein Linux-Computer hochfährt, beginnt er mit der Zeitmessung. Wir bezeichnen dies als Systemuhr oder System Clock, da diese vom Betriebssystem aktualisiert wird. Darüber hinaus verfügen moderne Computer über eine Hardware- oder Echtzeituhr. Diese ist oft ein Teil der Hauptplatine und behält die Zeit unabhängig davon, ob der Computer läuft oder nicht. Während des Bootens wird die Systemzeit von der Hardware-Uhr eingestellt, aber zum größten Teil laufen diese beiden Uhren unabhängig voneinander. In dieser Lektion werden wir Methoden zur Interaktion zwischen System- und Hardware-Uhr besprechen.
Auf den meisten modernen Linux-Systemen werden System- und Hardware-Zeit mit der Netzwerkzeit synchronisiert, die das Network Time Protocol (NTP) implementiert. In den meisten Fällen ist die einzige Konfiguration, die ein normaler Benutzer vornehmen muss, die Einstellung seiner Zeitzone, und NTP kümmert sich um den Rest. Wir werden jedoch einige Möglichkeiten zur manuellen Konfiguration der Zeit behandeln und die Besonderheiten der Konfiguration der Netzwerkzeit in der nächsten Lektion.
Lokale Zeit vs. Universalzeit
Die Systemuhr ist auf die Universal Time Coordinated (UTC) oder koordinierte Weltzeit eingestellt, die der Ortszeit in Greenwich, Großbritannien, entspricht. Normalerweise möchte ein Benutzer seine Ortszeit wissen. Diese berechnet sich, indem auf die UTC ein Offset, basierend auf der Zeitzone und der Sommerzeit, angewendet wird. Auf diese Weise wird viel Komplexität vermieden.
Die Systemuhr wird entweder auf UTC oder die lokale Zeit eingestellt — es empfiehlt sich jedoch UTC.
Datum
date
ist ein Kerndienstprogramm, das einfach die lokale Zeit ausgibt:
$ date Sun Nov 17 12:55:06 EST 2019
Über Optionen ändern Sie das Ausgabeformat.
Zum Beispiel zeigt date -u
die aktuelle UTC an:
$ date -u Sun Nov 17 18:02:51 UTC 2019
Andere häufig verwendete Optionen geben die lokale Zeit im gängigen RFC-Format zurück:
-I
-
Datum/Uhrzeit im Format ISO 8601. Durch Anhängen von
date
(-Idate
) wird die Ausgabe nur auf das Datum beschränkt. Andere Formate sindhours
,minutes
,seconds
undns
für Nanosekunden. -R
-
Gibt Datum und Uhrzeit im Format RFC 5322 wieder.
--rfc-3339
-
Gibt Datum und Uhrzeit im Format RFC 3339 wieder.
Das Format von date
passen Sie über die in der Manpage angegebenen Sequenzen an, z.B. die aktuelle Zeit als Unix-Zeit formatiert:
$ date +%s 1574014515
Die Manpage von date
gibt an, dass sich %s
auf die Unix-Zeit bezieht.
Die Unix-Zeit wird intern auf den meisten Unix-ähnlichen Systemen verwendet. Sie speichert die UTC als die Anzahl der Sekunden seit Epoche, definiert als 1. Januar 1970.
Note
|
Die Anzahl der Bits, die zum Speichern der Unix-Zeit notwendig sind, beträgt derzeit 32. Daraus ergibt sich ein ernsthaftes Problem für 32-Bit-Systeme, wenn 32 Bits nicht mehr ausreichen, um die aktuelle Zeit im Unix-Format zu speichern. Glücklicherweise wird dies nicht vor dem 19. Januar 2038 der Fall sein. |
Mit Hilfe dieser Sequenzen sind Sie in der Lage, Datum und Uhrzeit in fast jedem Format zu formatieren, das von einer beliebigen Anwendung benötigt wird. Natürlich ist es in den meisten Fällen angeraten, sich an einen akzeptierten Standard zu halten.
Darüber hinaus können Sie date --date
nutzen, um eine Zeit zu formatieren, die nicht die aktuelle Zeit ist. Im folgenden Szenario gibt ein Benutzer das Datum an, das das System anwenden soll, und zwar in Unix-Zeit:
$ date --date='@1564013011' Wed Jul 24 20:03:31 EDT 2019
Mit der Option --debug
stellen Sie sicher, dass ein Datum erfolgreich geparst werden kann. Sehen Sie, was passiert, wenn Sie ein gültiges Datum an den Befehl übergeben:
$ date --debug --date="Fri, 03 Jan 2020 14:00:17 -0500" date: parsed day part: Fri (day ordinal=0 number=5) date: parsed date part: (Y-M-D) 2020-01-03 date: parsed time part: 14:00:17 UTC-05 date: input timezone: parsed date/time string (-05) date: using specified time as starting value: '14:00:17' date: warning: day (Fri) ignored when explicit dates are given date: starting date/time: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' date: '(Y-M-D) 2020-01-03 14:00:17 TZ=-05' = 1578078017 epoch-seconds date: timezone: system default date: final: 1578078017.000000000 (epoch-seconds) date: final: (Y-M-D) 2020-01-03 19:00:17 (UTC) date: final: (Y-M-D) 2020-01-03 14:00:17 (UTC-05)
Dies ist ein praktisches Werkzeug bei der Fehlersuche in einer Anwendung, die ein Datum erzeugt.
Hardware-Uhr
Mit dem Befehl hwclock
sehen Sie die Zeit, die die Echtzeituhr verwaltet. Dieser Befehl erfordert Sonderrechte, weshalb wir ihn in diesem Fall mit sudo
aufrufen:
$ sudo hwclock 2019-11-20 11:31:29.217627-05:00
Mit der Option --verbose
erhalten Sie ausführlichere Ausgaben, die bei der Fehlersuche nützlich sind:
$ sudo hwclock --verbose hwclock from util-linux 2.34 System Time: 1578079387.976029 Trying to open: /dev/rtc0 Using the rtc interface to the clock. Assuming hardware clock is kept in UTC time. Waiting for clock tick... ...got clock tick Time read from Hardware Clock: 2020/01/03 19:23:08 Hw clock time : 2020/01/03 19:23:08 = 1578079388 seconds since 1969 Time since last adjustment is 1578079388 seconds Calculated Hardware Clock drift is 0.000000 seconds 2020-01-03 14:23:07.948436-05:00
Beachten Sie die Calculated Hardware Clock drift
. Hier erkennen Sie, ob Systemzeit und Hardwarezeit voneinander abweichen.
timedatectl
Mit timedatectl
überprüfen Sie den allgemeinen Status von Zeit und Datum, einschließlich der Frage, ob die Netzwerkzeit synchronisiert wurde oder nicht (das Netzwerkzeitprotokoll behandeln wir in der nächsten Lektion).
Standardmäßig gibt timedatectl
ähnliche Informationen wie date
zurück, jedoch mit dem Zusatz der RTC (Hardwarezeit) sowie dem Status des NTP-Dienstes:
$ timedatectl Local time: Thu 2019-12-05 11:08:05 EST Universal time: Thu 2019-12-05 16:08:05 UTC RTC time: Thu 2019-12-05 16:08:05 Time zone: America/Toronto (EST, -0500) System clock synchronized: yes NTP service: active RTC in local TZ: no
Zeit mit timedatectl
einstellen
Ist NTP nicht verfügbar ist, empfiehlt sich timedatectl
anstelle von date
oder hwclock
zum Einstellen der Zeit:
# timedatectl set-time '2011-11-25 14:00:00'
Der Vorgang ist ähnlich wie bei date
. Sie können die Zeit auch unabhängig vom Datum im Format HH:MM:SS einstellen.
Zeitzone mit `timedatectl`einstellen
timedatectl
ist das bevorzugte Werkzeug zum Einstellen der lokalen Zeitzone auf systemd
-basierten Linux-Systemen, wenn es keine grafische Benutzeroberfläche gibt. timedatectl
listet mögliche Zeitzonen auf, von denen Sie dann eine wählen und als Argument nutzen.
Zunächst werden die möglichen Zeitzonen aufgelistet:
$ timedatectl list-timezones Africa/Abidjan Africa/Accra Africa/Algiers Africa/Bissau Africa/Cairo ...
Die Liste der möglichen Zeitzonen ist lang, so dass sich die Verwendung von grep
anbietet.
Anschießend können wir die Zeitzone mit einem der in der Liste zurückgegebenen Argumente setzen:
$ timedatectl set-timezone Africa/Cairo $ timedatectl Local time: Thu 2019-12-05 18:18:10 EET Universal time: Thu 2019-12-05 16:18:10 UTC RTC time: Thu 2019-12-05 16:18:10 Time zone: Africa/Cairo (EET, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
Achten Sie darauf, den Namen der Zeitzone exakt einzugeben: Africa/Cairo
zum Beispiel ändert die Zeitzone, cairo
oder africa/cairo
hingegen nicht.
NTP mit timedatectl
deaktivieren
In einigen Fällen kann es notwendig sein, NTP zu deaktivieren, z.B. mit systemctl
. Hier die Vorgehensweise mit timedatectl
:
# timedatectl set-ntp no $ timedatectl Local time: Thu 2019-12-05 18:19:04 EET Universal time: Thu 2019-12-05 16:19:04 UTC RTC time: Thu 2019-12-05 16:19:04 Time zone: Africa/Cairo (EET, +0200) NTP enabled: no NTP synchronized: no RTC in local TZ: no DST active: n/a
Zeitzone ohne timedatectl
einstellen
Die Einstellung der Zeitzoneninformationen ist ein Standardschritt bei der Installation von Linux.Bei einem grafischen Installationsprozess geschieht dies höchstwahrscheinlich ohne weitere Benutzereingaben.
Das Verzeichnis /usr/share/zoneinfo
enthält Informationen über die möglichen Zeitzonen. Im Verzeichnis zoneinfo
gibt es Unterverzeichnisse, benannt nach den Kontinenten, sowie weitere symbolische Links. Es empfiehlt sich, die zoneinfo
für Ihre Region ausgehend von Ihrem Kontinent zu suchen.
Die zoneinfo
-Dateien enthalten Regeln zur Berechnung des lokalen Zeitversatzes in Bezug auf UTC sowie die in Ihrer Region geltenden Regeln zur Sommerzeit. Das System liest die Informationen aus /etc/localtime
, wenn es die lokale Zeitzone bestimmen muss. Um die Zeitzone ohne grafische Benutzeroberfläche einzustellen, sollten Sie einen symbolischen Link für Ihren Standort von /usr/share/zoneinfo
nach /etc/localtime
erstellen, z.B.:
$ ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime
Nach der Bestimmung der korrekten Zeitzone ist folgender Befehl empfehlenswert:
# hwclock --systohc
Diese setzt die Hardware-Uhr auf die Systemuhr (d.h. die Echtzeituhr wird auf die gleiche Zeit wie date
gesetzt). Bitte beachten Sie, dass dieser Befehl Root-Rechte erfordert, sie in diesem Fall also als root angemeldet sind.
/etc/timezone
ist /etc/localtime
ähnlich: Es handelt sich um eine Datendarstellung der lokalen Zeitzone, und als solche kann cat
sie lesen:
$ cat /etc/timezone America/Toronto
Beachten Sie, dass nicht alle Linux-Distrubitionen diese Datei nutzen.
Datum und Uhrzeit ohne timedatectl
einstellen
Note
|
Die meisten modernen Linux-Systeme setzen |
date
date
hat eine Option zum Einstellen der Systemzeit: Nutzen Sie --set
oder -s
, um Datum und Uhrzeit einzustellen. Mit --debug
überprüfen Sie das korrekte Parsen des Befehls:
# date --set="11 Nov 2011 11:11:11"
Beachten Sie, dass zum Einstellen des Datums Root-Rechte erforderlich sind. Sie können Uhrzeit und Datum auch unabhängig voneinander einstellen:
# date +%Y%m%d -s "20111125"
Hier müssen wir die Sequenzen angeben, damit unsere Zeichenkette richtig geparst wird. Zum Beispiel bezieht sich %Y
auf das Jahr, und so werden die ersten vier Ziffern 2011
als das Jahr 2011 interpretiert. Ähnlich ist %T
die Sequenz für die Uhrzeit, z.B.:
# date +%T -s "13:11:00"
Nach dem Ändern der Systemzeit empfiehlt es sich, auch die Hardware-Uhr zu stellen, damit beide synchronisiert sind:
# hwclock --systohc
systohc
steht für “system clock to hardware clock” (Systemzeit nach Hardwareuhr).
hwclock
Statt die Systemuhr zu stellen und die Hardware-Uhr zu aktualisieren, können Sie den Vorgang auch umkehren. Wir beginnen mit dem Einstellen der Hardware-Uhr:
# hwclock --set --date "4/12/2019 11:15:19" # hwclock Fri 12 Apr 2019 6:15:19 AM EST -0.562862 seconds
Beachten Sie, dass hwclock
standardmäßig UTC erwartet, aber standardmäßig die lokale Zeit zurückgibt.
Ist die Hardware-Uhr gestellt, müssen wir die Systemuhr nach ihr aktualisieren. hctosys
als “hardware clock to system clock” sorgt dafür:
# hwclock --hctosys
Geführte Übungen
-
Geben Sie an, ob die folgenden Befehle die Systemzeit oder die Hardware-Zeit anzeigen oder ändern:
Befehl(e) System Hardware Beide date -u
hwclock --set --date "12:00:00"
timedatectl
timedatectl | grep RTC
hwclock --hctosys
date +%T -s "08:00:00"
timedatectl set-time 1980-01-10
-
Betrachten Sie die folgende Ausgabe und korrigieren Sie das Format des Arguments so, dass der Befehl erfolgreich ausgeführt wird:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
-
Nutzen Sie den Befehl
date
und Sequenzen so, dass der Monat des Systems auf Februar eingestellt ist. Lassen Sie den Rest des Datums und der Uhrzeit unverändert. -
Nutzen Sie nun
hwclock
, um die Hardware-Uhr nach der Systemuhr zu stellen. -
Es gibt einen Ort namens
eucla
. Zu welchem Kontinent gehört er? Verwenden Sie den Befehlgrep
, um das herauszufinden. Geben Sie den vollständigen Befehl an. -
Setzen Sie Ihre aktuelle Zeitzone auf die von
eucla
.
Offene Übungen
-
Welche ist die beste Methode zum Einstellen der Zeit? In welchem Szenario ist die bevorzugte Methode nicht möglich?
-
Warum gibt es Ihrer Meinung nach so viele Methoden, um die Systemzeit zu setzen?
-
Nach dem 19. Januar 2038 wird die Linux-Systemzeit eine 64-Bit-Zahl zum Speichern benötigen. Es ist jedoch auch möglich, eine “Neue Epoche” zu setzen. Zum Beispiel könnte der 1. Januar 2038 um Mitternacht auf die “New Epoch Time”
0
gesetzt werden. Warum wäre das nicht die bevorzugte Lösung?
Zusammenfassung
In dieser Lektion haben Sie gelernt:
-
Wie Sie die Uhrzeit in verschiedenen Formaten über die Befehlszeile anzeigen.
-
Der Unterschied zwischen der Systemuhr und der Hardware-Uhr unter Linux.
-
Wie Sie die Systemuhr manuell einstellen.
-
Wie Sie die Hardware-Uhr manuell einstellen.
-
Wie Sie die Zeitzone des Systems ändern.
In dieser Lektion verwendete Befehle:
date
-
Anzeige oder Änderung der Systemuhr. Weitere Optionen:
-u
-
Anzeige der UTC-Zeit.
+%s
-
Sequenz zur Anzeige der Epochenzeit.
--date=
-
Angabe einer bestimmte Uhrzeit, die angezeigt werden soll, im Gegensatz zur aktuellen Uhrzeit.
--debug
-
Anzeige von Debug-Meldungen beim Parsen eines vom Benutzer eingegebenen Datums.
-s
-
Systemuhr manuell stellen.
hwclock
-
Anzeige oder Änderung der Hardware-Uhr.
--systohc
-
Verwendet die Systemuhr, um die Hardware-Uhr zu stellen.
--hctosys
-
Verwendet die Hardware-Uhr, um die Systemuhr zu stellen.
--set --date
-
Hardwareuhr manuell stellen.
timedatectl
-
Anzeige von System- und Hardware-Uhr sowie der NTP-Konfiguration auf systemd-basierten Linux-Systemen.
set-time
-
Stellt die Uhrzeit manuell ein.
list-timezones
-
Listet mögliche Zeitzonen auf.
set-timezone
-
Stellt die Zeitzone manuell ein.
set-ntp
-
Aktiviert/Deaktiviert NTP.
Lösungen zu den geführten Übungen
-
Geben Sie an, ob die folgenden Befehle die Systemzeit oder die Hardware-Zeit anzeigen oder ändern:
Befehl(e) System Hardware Beide date -u
X
hwclock --set --date "12:00:00"
X
timedatectl
X
timedatectl | grep RTC
X
hwclock --hctosys
X
date +%T -s "08:00:00"
X
timedatectl set-time 1980-01-10
X
-
Betrachten Sie die folgende Ausgabe und korrigieren Sie das Format des Arguments so, dass der Befehl erfolgreich ausgeführt wird:
$ date --debug --date "20/20/12 0:10 -3" date: warning: value 20 has less than 4 digits. Assuming MM/DD/YY[YY] date: parsed date part: (Y-M-D) 0002-20-20 date: parsed time part: 00:10:00 UTC-03 date: input timezone: parsed date/time string (-03) date: using specified time as starting value: '00:10:00' date: error: invalid date/time value: date: user provided time: '(Y-M-D) 0002-20-20 00:10:00 TZ=-03' date: normalized time: '(Y-M-D) 0003-08-20 00:10:00 TZ=-03' date: ---- -- date: possible reasons: date: numeric values overflow; date: incorrect timezone date: invalid date ‘20/20/2 0:10 -3’
date --debug --set "12/20/20 0:10 -3"
-
Nutzen Sie den Befehl
date
und Sequenzen so, dass der Monat des Systems auf Februar eingestellt ist. Lassen Sie den Rest des Datums und der Uhrzeit unverändert.date +%m -s "2"
-
Nutzen Sie nun
hwclock
, um die Hardware-Uhr nach der Systemuhr zu stellen.hwclock -systohc
-
Es gibt einen Ort namens
eucla
. Zu welchem Kontinent gehört er? Verwenden Sie den Befehlgrep
, um das herauszufinden. Geben Sie den vollständigen Befehl an.timedatectl list-timezones \| grep -i eucla
oder
grep -ri eucla /usr/share/zoneinfo
-
Setzen Sie Ihre aktuelle Zeitzone auf die von
eucla
.timedatectl set-timezone 'Australia/Eucla'
oder
ln -s /usr/share/zoneinfo/Australia/Eucla /etc/localtime
Lösungen zu den offenen Übungen
-
Welche ist die beste Methode zum Einstellen der Zeit? In welchem Szenario ist die bevorzugte Methode nicht möglich?
In den meisten Linux-Distributionen ist NTP standardmäßig aktiviert und sollte so belassen werden, dass es die Systemzeit ohne Störung setzt. Ist das Linux-System jedoch nicht mit dem Internet verbunden, ist NTP nicht erreichbar. Ein Embedded Linux-System in einer Industrieanlage könnte ein solches System ohne Netzwerkverbindung sein.
-
Warum gibt es Ihrer Meinung nach so viele Methoden, um die Systemzeit zu setzen?
Da das Setzen der Zeit seit Jahrzehnten eine Voraussetzung für alle Unix-artigen Systeme ist, gibt es viele veraltete Methoden zum Setzen der Zeit, die immer noch gepflegt werden.
-
Nach dem 19. Januar 2038 wird die Linux-Systemzeit eine 64-Bit-Zahl zum Speichern benötigen. Es ist jedoch auch möglich, eine “Neue Epoche” zu setzen. Zum Beispiel könnte der 1. Januar 2038 um Mitternacht auf die “New Epoch Time”
0
gesetzt werden. Warum wäre das nicht die bevorzugte Lösung?Im Jahr 2038 wird die überwiegende Mehrheit der Computer bereits mit 64-Bit-CPUs arbeiten und eine 64-Bit-Nummer wird die Leistung in keiner Weise beeinträchtigen. Es wäre jedoch unmöglich, die Risiken des “Zurücksetzens” der Epochenzeit auf diese Weise abzuschätzen. Es gibt zahlreiche Legacy-Software, die davon betroffen sein könnte. Banken und große Unternehmen haben zum Beispiel oft viele ältere Programme, auf die sie intern angewiesen sind. Das Szenario ist also, wie so viele andere, eine Studie über Kompromisse. Alle 32-Bit-Systeme, die im Jahr 2038 noch laufen, wären von einem Epochenzeit-Überlauf betroffen, aber Legacy-Software würde durch die Änderung des Epochenwerts beeinträchtigt.