Provided by: manpages-de_4.15.0-9_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 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  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.13  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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 ⟨debian-l10n-german@lists.debian.org⟩.