Provided by: manpages-de_4.13-4_all bug

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 Uhren 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) 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 numerischen 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  den  Optionen  --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)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  5.10  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

Ü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                                             9. Juni 2020                                TIME_NAMESPACES(7)