Provided by: manpages-de_4.21.0-2_all 

BEZEICHNUNG
time_namespaces - Überblick über Linux-Zeitnamensräume
BESCHREIBUNG
Zeitnahmensräume virtualisieren die Werte von zwei Systemuhren:
• CLOCK_MONOTONIC (und entsprechend CLOCK_MONOTONIC_COARSE und CLOCK_MONOTONIC_RAW), eine nichtsetzbare
Uhr, die die monotone Zeit seit einem »nicht näher spezifizierten Zeitpunkt in der Vergangenheit« (so
die POSIX-Beschreibung) darstellt.
• CLOCK_BOOTTIME (und entsprechend CLOCK_BOOTTIME_ALARM), eine nichtsetzbare Uhr, die zu CLOCK_MONOTONIC
identisch ist, abgesehen davon, dass sie auch die Zeit enthält, in der das System suspendiert ist.
Daher benutzen die Prozesse in einem Zeitnamensraum gemeinsame Werte für diese Uhren. Dies betrifft
verschiedene API, die gegen diese Uhren messen, einschließlich: clock_gettime(2), clock_nanosleep(2),
nanosleep(2), timer_settime(2), timerfd_settime(2) und /proc/uptime.
Derzeit kann ein Zeitnamensraum nur durch Aufruf von unshare(2) mit dem Schalter CLONE_NEWTIME erstellt
werden. Dieser Aufruf erstellt einen neuen Zeitnamensraum, legt den aufrufenden Prozess aber nicht in den
neuen Namensraum ab. Stattdessen werden die durch den aufrufenden Prozess nachfolgend erstellten Kinder
in dem neuen Namensraum abgelegt. Dies ermöglicht das Setzen von Uhrversätzen (siehe unten) für den neuen
Namensraum, bevor der erste Prozess in dem Namensraum abgelegt wird. Der symbolische Link
/proc/PID/ns/time_for_children zeigt den Zeitnamensraum, in dem die Kindprozesse eines Prozesses erstellt
werden. (Ein Prozess kann einen für diesen symbolischen Link geöffneten Dateideskriptor in einem Aufruf
von setns(2) verwenden, um sich in den Namensraum zu bewegen.)
/proc/PID/timens_offsets
Jedem Zeitnamensraum sind Versätze zugeordnet, die in Bezug auf den anfänglichen Namensraum ausgedrückt
werden, die die Werte der monotonen und Systemstartuhren in diesem Namensraum definieren. Diese Versätze
werden über die Datei /proc/PID/timens_offsets offengelegt. Innerhalb dieser Datei werden Versätze als
Zeilen ausgedrückt, die aus drei durch Leerzeichen getrennten Feldern bestehen:
<Uhrenkennung> <Versatzsekunden> <Versatznanosekunden>
Uhrenkennung ist eine Zeichenkette, die die Uhr definiert, deren Versatz angezeigt wird. Dieses Feld ist
entweder monotonic für CLOCK_MONOTONIC oder boottime für CLOCK_BOOTTIME. Die verbleibenden Felder
beschreiben den Versatz (Sekunden und Nanosekunden) für die Uhr in diesem Zeitnamensraum. Diese Versätze
werden relativ zu den Uhrwerten im anfänglichen Zeitnamensraum ausgedrückt. Der Wert Versatzsekunden kann
unter Berücksichtigung der nachfolgend beschriebenen Einschränkungen negativ sein; Versatznanosekunden
ist ein vorzeichenloser Wert.
Im anfänglichen Zeitnamensraum ist der Inhalt der Datei timens_offsets wie folgt:
$ cat /proc/self/timens_offsets
monotonic 0 0
boottime 0 0
In einem neuen Zeitnamensraum, der keine Mitgliedsprozesse hat, kann der Uhrversatz durch Schreiben von
Datensätzen (die durch Zeilenumbrüche getrennt sind) der gleichen Form in die Datei timens_offsets
verändert werden. Die Datei kann mehrfach beschrieben werden, sobald aber der erste Prozess in dem
Namensraum erstellt wurde oder diesem beigetreten ist, werden write(2)s in dieser Datei mit dem Fehler
EACCES fehlschlagen. Um in die Datei timens_offsets zu schreiben, muss ein Prozess über die Capability
CAP_SYS_TIME in dem Benutzernamenraum, dem der Zeitnamensraum gehört, verfügen.
Schreibzugriffe auf die Datei timens_offsets können mit den folgenden Fehlern fehlschlagen:
EINVAL Ein Versatznanosekunden-Wert ist größer als 999.999.999.
EINVAL Eine Uhrenkennung ist nicht gültig.
EPERM Der Aufrufende verfügt nicht über die Capability CAP_SYS_TIME.
ERANGE Ein Wert Versatzsekunden ist außerhalb des Bereichs. Insbesondere
• kann Versatzsekunden nicht auf einen Wert gesetzt werden, wodurch die aktuelle Zeit in der
entsprechenden Uhr innerhalb des Namensraumes negativ würde, und
• kann Versatzsekunden nicht auf einen Wert gsetzt werden, so dass die Uhr innerhalb des
Namensraums die Hälfte des Wertes der entsprechenden Kernelkonstante KTIME_SEC_MAX
überschreiten würde (dies begrenzt den Uhrwert auf ein Maximum von ca. 146 Jahren).
In einem neuen, durch unshare(2) erstellten Zeitnamensraum wird der Inhalt der Datei timens_offsets von
dem Zeitnamensraum des erstellenden Prozesses geerbt.
ANMERKUNGEN
Die Verwendung von Zeitnamensräumen benötigt einen Kernel, der mit der Option CONFIG_TIME_NS konfiguriert
wurde.
Beachten Sie, dass Zeitnamensräume nicht die Uhr CLOCK_REALTIME virtualisieren. Die Virtualisierung
dieser Uhr wurde aus Komplexitäts- und Gesamtaufwandsgründen im Kernel vermieden.
Zur Kompatibilität mit der ursprünglichen Implementierung kann der numerische Wert der Kennung statt der
oben dargestellten symbolischen Namen geschrieben werden, wenn eine Uhrenkennung in die Datei
/proc/PID/timens_offsets geschrieben wird; d.h. 1 statt monotonic und 7 statt boottime. Aus
Lesbarkeitsgründen wird die Verwendung der symbolischen Namen gegenüber den nummerischen Werten
bevorzugt.
Die Motivation für das Hinzufügen von Zeitnamensräumen war es, monotonen und Systemstart-Uhren zu
erlauben, über Container-Migrationen und Checkpoint-/Wiederherstellungsaktionen hinweg konsistente Werte
beizubehalten.
BEISPIELE
Die folgende Shell-Sitzung zeigt die Aktionen eines Zeitnamensraumes. Wir beginnen mit der Anzeige der
Inode-Nummer eines Zeitnamensraumes einer Shell in dem anfänglichen Zeitnamensraum:
$ readlink /proc/$$/ns/time
time:[4026531834]
Weiter im anfänglichen Zeitnamensraum zeigen wir die Systemlaufzeit mittels uptime(1) und verwenden das
in clock_getres(2) gezeigte Beispielprogramm clock_times, um die Werte der verschiedenen Uhren
anzuzeigen:
$ uptime --pretty
up 21 hours, 17 minutes
$ ./clock_times
CLOCK_REALTIME : 1585989401.971 (18356 days + 8h 36m 41s)
CLOCK_TAI : 1585989438.972 (18356 days + 8h 37m 18s)
CLOCK_MONOTONIC: 56338.247 (15h 38m 58s)
CLOCK_BOOTTIME : 76633.544 (21h 17m 13s)
Dann verwenden wir unshare(1), um einen Zeitnamensraum zu erstellen und eine bash(1)-Shell auszuführen.
Von der neuen Shell verwenden wir den eingebauten Befehl echo, um Datensätze in die Datei timens_offsets
zu schreiben und den Versatz für die Uhr CLOCK_MONOTONIC auf 2 Tage und den Versatz für die Uhr
CLOCK_BOOTTIME 7 Tage vorwärts zu stellen:
$ PS1="ns2# " sudo unshare -T -- bash --norc
ns2# echo "monotonic $((2*24*60*60)) 0" > /proc/$$/timens_offsets
ns2# echo "boottime $((7*24*60*60)) 0" > /proc/$$/timens_offsets
Oben haben wir die bash(1)-Shell mit der Option --norc gestartet, so dass keine Start-Skripte ausgeführt
wurden. Damit wird sichergestellt, dass keine Kindprozesse von der Shell erstellt werden, bevor wir die
Möglichkeit hatten, die Datei timens_offsets zu aktualisieren.
Dann verwenden wir cat(1), um die Inhalte der Datei timens_offsets anzuzeigen. Die Ausführung von cat(1)
erstellt den ersten Prozess in dem neuen Zeitnamensraum, nachdem weitere Versuche, die Datei
timens_offsets zu aktualisieren, zu Fehlern führen.
ns2# cat /proc/$$/timens_offsets
monotonic 172800 0
boottime 604800 0
ns2# echo "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets
bash: echo: write error: Permission denied
Weiter in dem neuen Namensraum führen wir uptime(1) und das Beispielprogramm clock_times aus:
ns2# uptime --pretty
up 1 week, 21 hours, 18 minutes
ns2# ./clock_times
CLOCK_REALTIME : 1585989457.056 (18356 days + 8h 37m 37s)
CLOCK_TAI : 1585989494.057 (18356 days + 8h 38m 14s)
CLOCK_MONOTONIC: 229193.332 (2 days + 15h 39m 53s)
CLOCK_BOOTTIME : 681488.629 (7 days + 21h 18m 8s)
Von der obigen Ausgabe können wir sehen, dass die monotone und die Systemstart-Uhr verschiedene Werte in
dem neuen Zeitnamensraum haben.
Durch Untersuchen der symbolischen Links /proc/PID/ns/time und /proc/PID/ns/time_for_children sehen wir,
das die Shell ein Mitglied des anfänglichen Zeitnamensraums ist, aber ihre Kindprozesse in dem neuen
Namensraum erstellt werden.
ns2# readlink /proc/$$/ns/time
time:[4026531834]
ns2# readlink /proc/$$/ns/time_for_children
time:[4026532900]
ns2# readlink /proc/self/ns/time # Erstellt einen Kindprozess
time:[4026532900]
Kehren wir zu der Shell in dem anfänglichen Zeitnamensraum zurück, dann sehen wir, dass die monotone und
die Systemstart-Uhr von den Änderungen in timens_offsets, die in dem anderen Zeitnamensraum erfolgten,
nicht betroffen ist:
$ uptime --pretty
up 21 hours, 19 minutes
$ ./clock_times
CLOCK_REALTIME : 1585989401.971 (18356 days + 8h 38m 51s)
CLOCK_TAI : 1585989438.972 (18356 days + 8h 39m 28s)
CLOCK_MONOTONIC: 56338.247 (15h 41m 8s)
CLOCK_BOOTTIME : 76633.544 (21h 19m 23s)
SIEHE AUCH
nsenter(1), unshare(1), clock_settime(2), setns(2), unshare(2), namespaces(7), time(7)
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von 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 die
Mailingliste der Übersetzer.
Linux man-pages 6.03 5. Februar 2023 time_namespaces(7)