time namespaces(7)
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.