time_namespaces(7) Miscellaneous Information Manual time_namespaces(7) BEZEICHNUNG time_namespaces - Uberblick uber Linux-Zeitnamensraume BESCHREIBUNG Zeitnahmensraume virtualisieren die Werte von zwei Systemuhren: o CLOCK_MONOTONIC (und entsprechend CLOCK_MONOTONIC_COARSE und CLOCK_MONOTONIC_RAW), eine nichtsetzbare Uhr, die die monotone Zeit seit einem >>nicht naher spezifizierten Zeitpunkt in der Vergangenheit<< (so die POSIX-Beschreibung) darstellt. o CLOCK_BOOTTIME (und entsprechend CLOCK_BOOTTIME_ALARM), eine nichtsetzbare Uhr, die zu CLOCK_MONOTONIC identisch ist, abgesehen davon, dass sie auch die Zeit enthalt, in der das System suspendiert ist. Daher benutzen die Prozesse in einem Zeitnamensraum gemeinsame Werte fur diese Uhren. Dies betrifft verschiedene API, die gegen diese Uhren messen, einschliesslich: 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 ermoglicht das Setzen von Uhrversatzen (siehe unten) fur 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 fur diesen symbolischen Link geoffneten Dateideskriptor in einem Aufruf von setns(2) verwenden, um sich in den Namensraum zu bewegen.) /proc/PID/timens_offsets Jedem Zeitnamensraum sind Versatze zugeordnet, die in Bezug auf den anfanglichen Namensraum ausgedruckt werden, die die Werte der monotonen und Systemstartuhren in diesem Namensraum definieren. Diese Versatze werden uber die Datei /proc/PID/timens_offsets offengelegt. Innerhalb dieser Datei werden Versatze als Zeilen ausgedruckt, die aus drei durch Leerzeichen getrennten Feldern bestehen: Uhrenkennung ist eine Zeichenkette, die die Uhr definiert, deren Versatz angezeigt wird. Dieses Feld ist entweder monotonic fur CLOCK_MONOTONIC oder boottime fur CLOCK_BOOTTIME. Die verbleibenden Felder beschreiben den Versatz (Sekunden und Nanosekunden) fur die Uhr in diesem Zeitnamensraum. Diese Versatze werden relativ zu den Uhrwerten im anfanglichen Zeitnamensraum ausgedruckt. Der Wert Versatzsekunden kann unter Berucksichtigung der nachfolgend beschriebenen Einschrankungen negativ sein; Versatznanosekunden ist ein vorzeichenloser Wert. Im anfanglichen 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 Datensatzen (die durch Zeilenumbruche getrennt sind) der gleichen Form in die Datei timens_offsets verandert 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 uber die Capability CAP_SYS_TIME in dem Benutzernamenraum, dem der Zeitnamensraum gehort, verfugen. Schreibzugriffe auf die Datei timens_offsets konnen mit den folgenden Fehlern fehlschlagen: EINVAL Ein Versatznanosekunden-Wert ist grosser als 999.999.999. EINVAL Eine Uhrenkennung ist nicht gultig. EPERM Der Aufrufende verfugt nicht uber die Capability CAP_SYS_TIME. ERANGE Ein Wert Versatzsekunden ist ausserhalb des Bereichs. Insbesondere o kann Versatzsekunden nicht auf einen Wert gesetzt werden, wodurch die aktuelle Zeit in der entsprechenden Uhr innerhalb des Namensraumes negativ wurde, und o kann Versatzsekunden nicht auf einen Wert gsetzt werden, so dass die Uhr innerhalb des Namensraums die Halfte des Wertes der entsprechenden Kernelkonstante KTIME_SEC_MAX uberschreiten wurde (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 Zeitnamensraumen benotigt einen Kernel, der mit der Option CONFIG_TIME_NS konfiguriert wurde. Beachten Sie, dass Zeitnamensraume nicht die Uhr CLOCK_REALTIME virtualisieren. Die Virtualisierung dieser Uhr wurde aus Komplexitats- und Gesamtaufwandsgrunden im Kernel vermieden. Zur Kompatibilitat mit der ursprunglichen 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 Lesbarkeitsgrunden wird die Verwendung der symbolischen Namen gegenuber den nummerischen Werten bevorzugt. Die Motivation fur das Hinzufugen von Zeitnamensraumen war es, monotonen und Systemstart-Uhren zu erlauben, uber 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 anfanglichen Zeitnamensraum: $ readlink /proc/$$/ns/time time:[4026531834] Weiter im anfanglichen 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 auszufuhren. Von der neuen Shell verwenden wir den eingebauten Befehl echo, um Datensatze in die Datei timens_offsets zu schreiben und den Versatz fur die Uhr CLOCK_MONOTONIC auf 2 Tage und den Versatz fur die Uhr CLOCK_BOOTTIME 7 Tage vorwarts 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 ausgefuhrt wurden. Damit wird sichergestellt, dass keine Kindprozesse von der Shell erstellt werden, bevor wir die Moglichkeit hatten, die Datei timens_offsets zu aktualisieren. Dann verwenden wir cat(1), um die Inhalte der Datei timens_offsets anzuzeigen. Die Ausfuhrung von cat(1) erstellt den ersten Prozess in dem neuen Zeitnamensraum, nachdem weitere Versuche, die Datei timens_offsets zu aktualisieren, zu Fehlern fuhren. 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 fuhren 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 konnen 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 anfanglichen 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 anfanglichen Zeitnamensraum zuruck, dann sehen wir, dass die monotone und die Systemstart-Uhr von den Anderungen 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 time_namespaces(7)