Provided by: manpages-sv_4.21.0-2_all bug

NAMN

       time_namespaces — översikt över Linux tidnamnrymder

BESKRIVNING

       Tidnamnrymder virtualiserar värden för två systemklockor:

       •  CLOCK_MONOTONIC  (och  likaledes  CLOCK_MONOTONIC_COARSE  och CLOCK_MONOTONIC_RAW), en inte inställbar
          klocka som representerar monoton tid sedan — såsom beskrivs av POSIX — ”någon  ospecificerad  punkt  i
          det förgångna”.

       •  CLOCK_BOOTTIME  (och  likaledes  CLOCK_BOOTTIME_ALARM),  en inte inställbar klocka som är identisk med
          CLOCK_MONOTONIC, förutom att den även inkluderar eventuell tid som systemet har varit vilande.

       Alltså delar processerna i en tidnamnrymd värden per namnrymd för dessa klockor. Detta  påverkar  diverse
       API:er  som  mäter  mot  dessa  klockor,  inklusive:  clock_gettime(2), clock_nanosleep(2), nanosleep(2),
       timer_settime(2), timerfd_settime(2) och /proc/uptime.

       För närvarande är det enda sättet att skapa en  tidnamnrymd  genom  att  anropa  unshare(2)  med  flaggan
       CLONE_NEWTIME.  Detta  anrop skapar en ny tidnamnrymd men placerar inte den anropande processen i den nya
       namnrymden. Istället placeras den anropande processens sedermera skapade barn i den nya namnrymden. Detta
       gör att klockavstånd (se nedan) för den nya namnrymden kan sättas före den första  processen  placeras  i
       namnrymden. Den symboliska länken /proc/pid/ns/time_for_children visar tidnamnrymden i vilken barnen till
       en process kommer skapas. (En process kan använda en filbeskrivare som öppnas mot denna symboliska länk i
       ett anrop av setns(2) för att flytta in i namnrymden.)

   /proc/PID/timens_offsets
       Associerat med varje tidnamnrymd finns avstånd, uttryckta med avseende på den initiala tidnamnrymden, som
       definierar  värdena  för  den monotona klockan och starttidsklockan i den namnrymden. Dessa avstånd visas
       via filen /proc/PID/timens_offsets. Inom denna fil  uttrycks  avstånden  som  rader  som  består  av  tre
       blankavgränsade fält:

           <klock-id> <avstånd-sek> <avstånd-nanosek>

       Klock-id  är en sträng som identifierar klockan vars avstånd visas. Detta fält är antingen monotonic, för
       CLOCK_MONOTONIC, eller boottime, för CLOCK_BOOTTIME. De återstående fälten uttrycker avståndet  (sekunder
       plus  nanosekunder)  för  klockan i denna tidnamnrymd. Dessa avstånd uttrycks relativt klockvärdena i den
       initiala tidnamnrymden. Värdet avstånd-sek kan vara  negativt,  föremål  för  begränsningarna  som  anges
       nedan; avstånd-nanosek är ett teckenlöst värde.

       I den initiala tidnamnrymden är innehållet i filen timens_offsets som följer:

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

       I  en  ny tidnamnrymd som inte har haft några medlemsprocesser kan klockavstånden ändras genom att skriva
       nyradsavslutade poster med samma format till filen timens_offsets. Det går att skriva  till  filen  flera
       gånger,  men efter att den första processen har skapats i eller gått in i namnrymden kommer write(2) till
       denna fil att misslyckas med felet EACCES. För att skriva till filen timens_offsets måste en  process  ha
       förmågan CAP_SYS_TIME i användarnamnrymden som äger tidnamnrymden.

       Skrivningar till filen timens_offsets kan misslyckas med följande fel:

       EINVAL Ett värde på avstånd-nanosek större än 999 999 999.

       EINVAL Ett värde på klock-id som inte är giltigt.

       EPERM  Anroparen har inte förmågan CAP_SYS_TIME.

       ERANGE Ett värde på avstånd-sek är utanför intervallet. Speciellt;

              •  kan  avstånd-sek  inte sättas till ett värde vilket skulle ge den aktuella tiden på motsvarande
                 klocka inuti namnrymden ett negativt värde; vidare

              •  kan avstånd-sek inte sättas till ett värde så att tiden på motsvarande klocka inuti  namnrymden
                 skulle  överskrida  halva  värdet  på kärnkonstanten KTIME_SEC_MAX (detta begränsar klockvärdet
                 till ett maximum av ungefär 146 år).

       I en ny tidnamnrymd skapad med unshare(2) ärvs innehållet i filen timens_offsets från  tidnamnrymden  hos
       den skapande processen.

NOTERINGAR

       Användning av cgroup-namnrymder kräver en kärna som är konfigurerad med alternativet CONFIG_TIME_NS.

       Observera  att  tidnamnrymder  inte  virtualiserar klockan CLOCK_REALTIME. Virtualisering av denna klocka
       undveks på grund av komplexitet och overhead inom kärnan.

       För kompatibilitet med den ursprungliga implementationen kan, när man skriver  ett  klock-id  till  filen
       /proc/pid/timens_offsets,  de  numeriska  värdena  av  ID:n skrivas istället för de symboliska namnen som
       visas ovan; d.v.s., 1  istället  för  monotonic,  och  7  istället  för  boottime.  För  bästa  läsbarhet
       rekommenderas det att man använder symboliska namn hellre än nummer.

       Motivationen  för att lägga till tidnamnrymder var för att göra det möjligt att låta den monotona klockan
       och   starttidsklockan   behålla    konsistenta    värden    under    migrering    av    behållare    och
       checkpunkt/återställning.

EXEMPEL

       Följande  skalsession  demonstrerar  funktionen hos tidnamnrymder. Vi börjar med att visa inodsnumret för
       tidnamnrymden för ett skal i den initiala tidnamnrymden:

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

       Fortfarande i  den  initiala  tidnamnrymden  visar  vi  systemets  uppetid  med  uptime(1)  och  använder
       exempelprogrammet clock_times som visas i clock_getres(2) för att visa värdet på olika klockor:

           $ 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)

       Vi  använder sedan unshare(1) för att skapa en tidnamnrymd och köra ett skal bash(1). Från det nya skalet
       använder vi det inbyggda kommandot echo för att skriva  poster  till  filen  timens_offsets  och  justera
       avståndet  för  klockan  CLOCK_MONOTONIC framåt 2 dagar och avståndet för klockan CLOCK_BOOTTIME framåt 7
       dagar:

           $ 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

       Ovan startar vi skalet bash(1) med flaggan --norc så att inga uppstartsskript  körs.  Detta  säkerställer
       att inga barnprocesser skapas från skalet före vi har haft en chans att uppdatera filen timens_offsets.

       Vi  använder  sedan  cat(1)  för  att  visa innehållet i filen timens_offsets. Att cat(1) körs skapar den
       första processen i den nya tidnamnrymden, varefter vidare försök att uppdatera filen  timens_offsets  ger
       ett fel.

           ns2# cat /proc/$$/timens_offsets
           monotonic      172800         0
           boottime       604800         0
           ns2# echo "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets
           bash: echo: skrivfel: Åtkomst nekas

       Fortfarande i den nya namnrymden kör vi uptime(1) och exempelprogrammet clock_times:

           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)

       Från  ovanstående utskrift kan vi se att den monotona klockan och starttidsklockan har andra värden i den
       nya tidnamnrymden.

       Genom att undersöka de symboliska länkarna /proc/pid/ns/time och  /proc/pid/ns/time_for_children  ser  vi
       att skalet är medlem av den initiala tidnamnrymden, men dess barn skapas i den nya namnrymden.

           ns2# readlink /proc/$$/ns/time
           time:[4026531834]
           ns2# readlink /proc/$$/ns/time_for_children
           time:[4026532900]
           ns2# readlink /proc/self/ns/time   # Skapar en barnprocess
           time:[4026532900]

       Efter  att  ha  återvänt  till  skalet  i  den  initiala  namnrymden  ser vi att den monotona klockan och
       starttidsklockan är opåverkade av ändringarna av timens_offsets som gjordes i den andra tidnamnrymden:

           $ 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)

SE ÄVEN

       nsenter(1), unshare(1), clock_settime(2), setns(2), unshare(2), namespaces(7), time(7)

ÖVERSÄTTNING

       Den svenska översättningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>

       Denna översättning är  fri  dokumentation;  läs  GNU General Public License Version 3  eller  senare  för
       upphovsrättsvillkor. Vi tar INGET ANSVAR.

       Om du hittar fel i översättningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se.

Linux man-pages 6.03                             5 februari 2023                              time_namespaces(7)