Provided by: manpages-sv_4.21.0-2_all 

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)