time namespaces(7)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

time_namespaces(7) — Linux Manual Page

Namn

time_namespaces - översikt av Linux tidsnamnrymder

Beskrivning

Tidsnamnrymder (time namespaces) virtualiserar värdena för två systemklockor:

  • CLOCK_MONOTONIC (och motsvarande CLOCK_MONOTONIC_COARSE samt CLOCK_MONOTONIC_RAW), en icke-justerbar klocka som representerar monoton tid sedan—enligt POSIX—"en obestämd punkt i det förflutna".
  • CLOCK_BOOTTIME (och motsvarande CLOCK_BOOTTIME_ALARM), en icke-justerbar klocka som är identisk med CLOCK_MONOTONIC, men som också inkluderar tid då systemet har varit suspenderat.

Processer i en tidsnamnrymd delar värden för dessa klockor inom sin namnrymd. Detta påverkar olika API:er som mäter mot dessa klockor, inklusive: clock_gettime(2), clock_nanosleep(2), nanosleep(2), timer_settime(2), timerfd_settime(2) och filen /proc/uptime.

Den enda metoden att skapa en tidsnamnrymd i nuläget är genom att anropa unshare(2) med flaggan CLONE_NEWTIME. Detta anrop skapar en ny tidsnamnrymd men placerar inte den anropande processen i den nya namnrymden. Istället placeras processen efterföljande barnprocesser i den nya namnrymden. Detta gör att klockförskjutningar (se nedan) kan ställas in innan den första processen placeras i namnrymden. Den symboliska länken /proc/pid/ns/time_for_children visar tidsnamnrymden där en process barnsprocesser kommer att skapas. (En process kan använda en filbeskrivare för att öppna denna symboliska länk i ett anrop till setns(2) för att flytta sig till namnrymden.)

/proc/pid/timens_offsets

Varje tidsnamnrymd har förskjutningar som uttrycks relativt den initiala tidsnamnrymden. Dessa förskjutningar definierar värdena för de monotona och uppstartsklockorna i namnrymden. Dessa förskjutningar exponeras via filen /proc/pid/timens_offsets. Filens innehåll består av rader med tre fält separerade med mellanslag:

<klock-id> <förskjutning-sekunder> <förskjutning-nanosekunder>
  • klock-id är en sträng som identifierar vilken klocka förskjutningen gäller. Den kan vara antingen monotonic för CLOCK_MONOTONIC eller boottime för CLOCK_BOOTTIME.
  • De två övriga fälten beskriver förskjutningarna (sekunder och nanosekunder) för klockan i namnrymden. Dessa förskjutningar uttrycks relativt klockvärdena i den initiala tidsnamnrymden.

I den initiala tidsnamnrymden är filens innehåll följande:

$ cat /proc/self/timens_offsets
monotonic           0         0
boottime            0         0

I en ny tidsnamnrymd som inte har några medlemmar kan klockförskjutningarna modifieras genom att skriva rader i samma format till filen timens_offsets. Filen kan skrivas till flera gånger, men när den första processen har skapats i eller gått in i namnrymden kommer alla ytterligare skrivningar till filen att misslyckas med felet EACCES.

För att skriva till filen måste processen ha kapabiliteten CAP_SYS_TIME i användarnamnrymden som äger tidsnamnrymden.

Felkoder vid skrivning till /proc/pid/timens_offsets

  • EINVAL: Värdet för förskjutning-nanosekunder är större än 999,999,999.
  • EINVAL: Ett ogiltigt klock-id har angetts.
  • EPERM: Anropande process saknar kapabiliteten CAP_SYS_TIME.
  • ERANGE: Förskjutning-sekunder är utanför tillåtet intervall:
 ** Förskjutning-sekunder får inte sättas till ett värde som gör att klockan i namnrymden blir negativ.
 ** Förskjutning-sekunder får inte sättas till ett värde som gör att klockans tid överstiger hälften av värdet av kärnkonstanten KTIME_SEC_MAX (ungefär 146 år).

Anmärkningar

  • Tidsnamnrymder kräver att kärnan är konfigurerad med CONFIG_TIME_NS.
  • Tidsnamnrymder virtualiserar inte klockan CLOCK_REALTIME för att undvika komplexitet och ökad belastning i kärnan.
  • Symboliska namn rekommenderas över numeriska värden när man skriver till timens_offsets.

Exempel

Följande exempel visar hur tidsnamnrymder fungerar:

1. Visa inode-numret för den aktuella tidsnamnrymden:

$ readlink /proc/$$/ns/time
time:[4026531834]

2. Visa systemets uptime och klockvärden med ett exempelskript:

$ uptime --pretty
up 21 hours, 17 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)

3. Skapa en ny tidsnamnrymd med unshare och ändra förskjutningarna:

$ 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

4. Visa innehållet i timens_offsets:

ns2# cat /proc/$$/timens_offsets
monotonic      172800         0
boottime       604800         0

5. Kör uptime och klockvärden i den nya namnrymden:

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)

Se även

Colophon

Den här sidan är en del av Linux manualprojekt. För mer information, se [1].

Sidslut

Orginalhemsidan på Engelska :https://www.man7.org/linux/man-pages/man7/time_namespaces.7.html


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till Datorhjälp som har sponsrat Linux.se med webbhotell.