time_namespaces(7) Miscellaneous Information Manual time_namespaces(7) NAMN time_namespaces -- oversikt over Linux tidnamnrymder BESKRIVNING Tidnamnrymder virtualiserar varden for tva systemklockor: o CLOCK_MONOTONIC (och likaledes CLOCK_MONOTONIC_COARSE och CLOCK_MONOTONIC_RAW), en inte installbar klocka som representerar monoton tid sedan -- sasom beskrivs av POSIX -- "nagon ospecificerad punkt i det forgangna". o CLOCK_BOOTTIME (och likaledes CLOCK_BOOTTIME_ALARM), en inte installbar klocka som ar identisk med CLOCK_MONOTONIC, forutom att den aven inkluderar eventuell tid som systemet har varit vilande. Alltsa delar processerna i en tidnamnrymd varden per namnrymd for dessa klockor. Detta paverkar diverse API:er som mater mot dessa klockor, inklusive: clock_gettime(2), clock_nanosleep(2), nanosleep(2), timer_settime(2), timerfd_settime(2) och /proc/uptime. For narvarande ar det enda sattet 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. Istallet placeras den anropande processens sedermera skapade barn i den nya namnrymden. Detta gor att klockavstand (se nedan) for den nya namnrymden kan sattas fore den forsta processen placeras i namnrymden. Den symboliska lanken /proc/pid/ns/time_for_children visar tidnamnrymden i vilken barnen till en process kommer skapas. (En process kan anvanda en filbeskrivare som oppnas mot denna symboliska lank i ett anrop av setns(2) for att flytta in i namnrymden.) /proc/pid/timens_offsets Associerat med varje tidnamnrymd finns avstand, uttryckta med avseende pa den initiala tidnamnrymden, som definierar vardena for den monotona klockan och starttidsklockan i den namnrymden. Dessa avstand visas via filen /proc/pid/timens_offsets. Inom denna fil uttrycks avstanden som rader som bestar av tre blankavgransade falt: Klock-id ar en strang som identifierar klockan vars avstand visas. Detta falt ar antingen monotonic, for CLOCK_MONOTONIC, eller boottime, for CLOCK_BOOTTIME. De aterstaende falten uttrycker avstandet (sekunder plus nanosekunder) for klockan i denna tidnamnrymd. Dessa avstand uttrycks relativt klockvardena i den initiala tidnamnrymden. Vardet avstand-sek kan vara negativt, foremal for begransningarna som anges nedan; avstand-nanosek ar ett teckenlost varde. I den initiala tidnamnrymden ar innehallet i filen timens_offsets som foljer: $ cat /proc/self/timens_offsets monotonic 0 0 boottime 0 0 I en ny tidnamnrymd som inte har haft nagra medlemsprocesser kan klockavstanden andras genom att skriva nyradsavslutade poster med samma format till filen timens_offsets. Det gar att skriva till filen flera ganger, men efter att den forsta processen har skapats i eller gatt in i namnrymden kommer write(2) till denna fil att misslyckas med felet EACCES. For att skriva till filen timens_offsets maste en process ha formagan CAP_SYS_TIME i anvandarnamnrymden som ager tidnamnrymden. Skrivningar till filen timens_offsets kan misslyckas med foljande fel: EINVAL Ett varde pa avstand-nanosek storre an 999 999 999. EINVAL Ett varde pa klock-id som inte ar giltigt. EPERM Anroparen har inte formagan CAP_SYS_TIME. ERANGE Ett varde pa avstand-sek ar utanfor intervallet. Speciellt; o kan avstand-sek inte sattas till ett varde vilket skulle ge den aktuella tiden pa motsvarande klocka inuti namnrymden ett negativt varde; vidare o kan avstand-sek inte sattas till ett varde sa att tiden pa motsvarande klocka inuti namnrymden skulle overskrida halva vardet pa karnkonstanten KTIME_SEC_MAX (detta begransar klockvardet till ett maximum av ungefar 146 ar). I en ny tidnamnrymd skapad med unshare(2) arvs innehallet i filen timens_offsets fran tidnamnrymden hos den skapande processen. NOTERINGAR Anvandning av cgroup-namnrymder kraver en karna som ar konfigurerad med alternativet CONFIG_TIME_NS. Observera att tidnamnrymder inte virtualiserar klockan CLOCK_REALTIME. Virtualisering av denna klocka undveks pa grund av komplexitet och overhead inom karnan. For kompatibilitet med den ursprungliga implementationen kan, nar man skriver ett klock-id till filen /proc/pid/timens_offsets, de numeriska vardena av ID:n skrivas istallet for de symboliska namnen som visas ovan; d.v.s., 1 istallet for monotonic, och 7 istallet for boottime. For basta lasbarhet rekommenderas det att man anvander symboliska namn hellre an nummer. Motivationen for att lagga till tidnamnrymder var for att gora det mojligt att lata den monotona klockan och starttidsklockan behalla konsistenta varden under migrering av behallare och checkpunkt/aterstallning. EXEMPEL Foljande skalsession demonstrerar funktionen hos tidnamnrymder. Vi borjar med att visa inodsnumret for tidnamnrymden for 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 anvander exempelprogrammet clock_times som visas i clock_getres(2) for att visa vardet pa 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 anvander sedan unshare(1) for att skapa en tidnamnrymd och kora ett skal bash(1). Fran det nya skalet anvander vi det inbyggda kommandot echo for att skriva poster till filen timens_offsets och justera avstandet for klockan CLOCK_MONOTONIC framat 2 dagar och avstandet for klockan CLOCK_BOOTTIME framat 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 sa att inga uppstartsskript kors. Detta sakerstaller att inga barnprocesser skapas fran skalet fore vi har haft en chans att uppdatera filen timens_offsets. Vi anvander sedan cat(1) for att visa innehallet i filen timens_offsets. Att cat(1) kors skapar den forsta processen i den nya tidnamnrymden, varefter vidare forsok 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: Atkomst nekas Fortfarande i den nya namnrymden kor 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) Fran ovanstaende utskrift kan vi se att den monotona klockan och starttidsklockan har andra varden i den nya tidnamnrymden. Genom att undersoka de symboliska lankarna /proc/pid/ns/time och /proc/pid/ns/time_for_children ser vi att skalet ar 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 atervant till skalet i den initiala namnrymden ser vi att den monotona klockan och starttidsklockan ar opaverkade av andringarna 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 AVEN nsenter(1), unshare(1), clock_settime(2), setns(2), unshare(2), namespaces(7), time(7) OVERSATTNING Den svenska oversattningen av denna manualsida skapades av Goran Uddeborg Denna oversattning ar fri dokumentation; las GNU General Public License Version 3 eller senare for upphovsrattsvillkor. Vi tar INGET ANSVAR. Om du hittar fel i oversattningen av denna manualsida, skicka ett mail till . Linux man-pages 6.06 31 oktober 2023 time_namespaces(7)