.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2020 by Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH time_namespaces 7 "12. März 2023" "Linux man\-pages 6.05.01" .SH BEZEICHNUNG time_namespaces \- Überblick über Linux\-Zeitnamensräume .SH BESCHREIBUNG Zeitnahmensräume virtualisieren die Werte von zwei Systemuhren: .IP \[bu] 3 \fBCLOCK_MONOTONIC\fP (und entsprechend \fBCLOCK_MONOTONIC_COARSE\fP und \fBCLOCK_MONOTONIC_RAW\fP), eine nichtsetzbare Uhr, die die monotone Zeit seit einem »nicht näher spezifizierten Zeitpunkt in der Vergangenheit« (so die POSIX\-Beschreibung) darstellt. .IP \[bu] \fBCLOCK_BOOTTIME\fP (und entsprechend \fBCLOCK_BOOTTIME_ALARM\fP), eine nichtsetzbare Uhr, die zu \fBCLOCK_MONOTONIC\fP identisch ist, abgesehen davon, dass sie auch die Zeit enthält, in der das System suspendiert ist. .PP Daher benutzen die Prozesse in einem Zeitnamensraum gemeinsame Werte für diese Uhren. Dies betrifft verschiedene API, die gegen diese Uhren messen, einschließlich: \fBclock_gettime\fP(2), \fBclock_nanosleep\fP(2), \fBnanosleep\fP(2), \fBtimer_settime\fP(2), \fBtimerfd_settime\fP(2) und \fI/proc/uptime\fP. .PP .\" Derzeit kann ein Zeitnamensraum nur durch Aufruf von \fBunshare\fP(2) mit dem Schalter \fBCLONE_NEWTIME\fP erstellt werden. Dieser Aufruf erstellt einen neuen Zeitnamensraum, legt den aufrufenden Prozess aber \fInicht\fP 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 \fI/proc/\fPPID\fI/ns/time_for_children\fP 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 \fBsetns\fP(2) verwenden, um sich in den Namensraum zu bewegen.) .SS \fI/proc/\fPPID\fI/timens_offsets\fP 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 \fI/proc/\fPPID\fI/timens_offsets\fP offengelegt. Innerhalb dieser Datei werden Versätze als Zeilen ausgedrückt, die aus drei durch Leerzeichen getrennten Feldern bestehen: .PP .in +4n .EX .EE .in .PP \fIUhrenkennung\fP ist eine Zeichenkette, die die Uhr definiert, deren Versatz angezeigt wird. Dieses Feld ist entweder \fImonotonic\fP für \fBCLOCK_MONOTONIC\fP oder \fIboottime\fP für \fBCLOCK_BOOTTIME\fP. 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 \fIVersatzsekunden\fP kann unter Berücksichtigung der nachfolgend beschriebenen Einschränkungen negativ sein; \fIVersatznanosekunden\fP ist ein vorzeichenloser Wert. .PP Im anfänglichen Zeitnamensraum ist der Inhalt der Datei \fItimens_offsets\fP wie folgt: .PP .in +4n .EX $ \fBcat /proc/self/timens_offsets\fP monotonic 0 0 boottime 0 0 .EE .in .PP 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 \fItimens_offsets\fP verändert werden. Die Datei kann mehrfach beschrieben werden, sobald aber der erste Prozess in dem Namensraum erstellt wurde oder diesem beigetreten ist, werden \fBwrite\fP(2)s in dieser Datei mit dem Fehler \fBEACCES\fP fehlschlagen. Um in die Datei \fItimens_offsets\fP zu schreiben, muss ein Prozess über die Capability \fBCAP_SYS_TIME\fP in dem Benutzernamenraum, dem der Zeitnamensraum gehört, verfügen. .PP Schreibzugriffe auf die Datei \fItimens_offsets\fP können mit den folgenden Fehlern fehlschlagen: .TP \fBEINVAL\fP Ein \fIVersatznanosekunden\fP\-Wert ist größer als 999.999.999. .TP \fBEINVAL\fP Eine \fIUhrenkennung\fP ist nicht gültig. .TP \fBEPERM\fP Der Aufrufende verfügt nicht über die Capability \fBCAP_SYS_TIME\fP. .TP \fBERANGE\fP Ein Wert \fIVersatzsekunden\fP ist außerhalb des Bereichs. Insbesondere .RS .IP \[bu] 3 kann \fIVersatzsekunden\fP nicht auf einen Wert gesetzt werden, wodurch die aktuelle Zeit in der entsprechenden Uhr innerhalb des Namensraumes negativ würde, und .IP \[bu] kann \fIVersatzsekunden\fP nicht auf einen Wert gsetzt werden, so dass die Uhr innerhalb des Namensraums die Hälfte des Wertes der entsprechenden Kernelkonstante \fBKTIME_SEC_MAX\fP überschreiten würde (dies begrenzt den Uhrwert auf ein Maximum von ca. 146 Jahren). .RE .PP In einem neuen, durch \fBunshare\fP(2) erstellten Zeitnamensraum wird der Inhalt der Datei \fItimens_offsets\fP von dem Zeitnamensraum des erstellenden Prozesses geerbt. .SH ANMERKUNGEN Die Verwendung von Zeitnamensräumen benötigt einen Kernel, der mit der Option \fBCONFIG_TIME_NS\fP konfiguriert wurde. .PP Beachten Sie, dass Zeitnamensräume nicht die Uhr \fBCLOCK_REALTIME\fP virtualisieren. Die Virtualisierung dieser Uhr wurde aus Komplexitäts\- und Gesamtaufwandsgründen im Kernel vermieden. .PP Zur Kompatibilität mit der ursprünglichen Implementierung kann der numerische Wert der Kennung statt der oben dargestellten symbolischen Namen geschrieben werden, wenn eine \fIUhrenkennung\fP in die Datei \fI/proc/\fPPID\fI/timens_offsets\fP geschrieben wird; d.h. 1 statt \fImonotonic\fP und 7 statt \fIboottime\fP. Aus Lesbarkeitsgründen wird die Verwendung der symbolischen Namen gegenüber den nummerischen Werten bevorzugt. .PP 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. .SH 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: .PP .in +4n .EX $ \fBreadlink /proc/$$/ns/time\fP time:[4026531834] .EE .in .PP Weiter im anfänglichen Zeitnamensraum zeigen wir die Systemlaufzeit mittels \fBuptime\fP(1) und verwenden das in \fBclock_getres\fP(2) gezeigte Beispielprogramm \fIclock_times\fP, um die Werte der verschiedenen Uhren anzuzeigen: .PP .in +4n .EX $ \fBuptime \-\-pretty\fP up 21 hours, 17 minutes $ \fB./clock_times\fP 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) .EE .in .PP Dann verwenden wir \fBunshare\fP(1), um einen Zeitnamensraum zu erstellen und eine \fBbash\fP(1)\-Shell auszuführen. Von der neuen Shell verwenden wir den eingebauten Befehl \fBecho\fP, um Datensätze in die Datei \fItimens_offsets\fP zu schreiben und den Versatz für die Uhr \fBCLOCK_MONOTONIC\fP auf 2 Tage und den Versatz für die Uhr \fBCLOCK_BOOTTIME\fP 7 Tage vorwärts zu stellen: .PP .in +4n .EX $ \fBPS1="ns2# " sudo unshare \-T \-\- bash \-\-norc\fP ns2# \fBecho "monotonic $((2*24*60*60)) 0" > /proc/$$/timens_offsets\fP ns2# \fBecho "boottime $((7*24*60*60)) 0" > /proc/$$/timens_offsets\fP .EE .in .PP Oben haben wir die \fBbash\fP(1)\-Shell mit der Option \fB\-\-norc\fP 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 \fItimens_offsets\fP zu aktualisieren. .PP Dann verwenden wir \fBcat\fP(1), um die Inhalte der Datei \fItimens_offsets\fP anzuzeigen. Die Ausführung von \fBcat\fP(1) erstellt den ersten Prozess in dem neuen Zeitnamensraum, nachdem weitere Versuche, die Datei \fItimens_offsets\fP zu aktualisieren, zu Fehlern führen. .PP .in +4n .EX ns2# \fBcat /proc/$$/timens_offsets\fP monotonic 172800 0 boottime 604800 0 ns2# \fBecho "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets\fP bash: echo: write error: Permission denied .EE .in .PP Weiter in dem neuen Namensraum führen wir \fBuptime\fP(1) und das Beispielprogramm \fIclock_times\fP aus: .PP .in +4n .EX ns2# \fBuptime \-\-pretty\fP up 1 week, 21 hours, 18 minutes ns2# \fB./clock_times\fP 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) .EE .in .PP Von der obigen Ausgabe können wir sehen, dass die monotone und die Systemstart\-Uhr verschiedene Werte in dem neuen Zeitnamensraum haben. .PP Durch Untersuchen der symbolischen Links \fI/proc/\fPPID\fI/ns/time\fP und \fI/proc/\fPPID\fI/ns/time_for_children\fP sehen wir, das die Shell ein Mitglied des anfänglichen Zeitnamensraums ist, aber ihre Kindprozesse in dem neuen Namensraum erstellt werden. .PP .in +4n .EX ns2# \fBreadlink /proc/$$/ns/time\fP time:[4026531834] ns2# \fBreadlink /proc/$$/ns/time_for_children\fP time:[4026532900] ns2# \fBreadlink /proc/self/ns/time\fP # Erstellt einen Kindprozess time:[4026532900] .EE .in .PP 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 \fItimens_offsets\fP, die in dem anderen Zeitnamensraum erfolgten, nicht betroffen ist: .PP .in +4n .EX $ \fBuptime \-\-pretty\fP up 21 hours, 19 minutes $ \fB./clock_times\fP 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) .EE .in .SH "SIEHE AUCH" .\" clone3() support for time namespaces is a work in progress .\" .BR clone3 (2), \fBnsenter\fP(1), \fBunshare\fP(1), \fBclock_settime\fP(2), \fBsetns\fP(2), \fBunshare\fP(2), \fBnamespaces\fP(7), \fBtime\fP(7) .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .