time_namespaces(7) Miscellaneous Information Manual time_namespaces(7) NUME time_namespaces - prezentare generala a spaiilor de nume de timp Linux DESCRIERE Spaiile de nume de timp virtualizeaza valorile a doua ceasuri de sistem: o CLOCK_MONOTONIC (i, de asemenea, CLOCK_MONOTONIC_COARSE i CLOCK_MONOTONIC_RAW), un ceas care nu poate fi reglat i care reprezinta timpul monoton de la - aa cum este descris de POSIX - ,,un punct nespecificat din trecut". o CLOCK_BOOTTIME (i, de asemenea, CLOCK_BOOTTIME_ALARM), un ceas nereglabil care este identic cu CLOCK_MONOTONIC, cu excepia faptului ca include, de asemenea, orice timp in care sistemul este suspendat. Astfel, procesele dintr-un spaiu de nume de timp impart valorile pentru fiecare spaiu de nume pentru aceste ceasuri. Acest lucru afecteaza diverse API-uri care masoara in funcie de aceste ceasuri, inclusiv: clock_gettime(2), clock_nanosleep(2), nanosleep(2), timer_settime(2), timerfd_settime(2) i /proc/uptime. In prezent, singura modalitate de a crea un spaiu de nume de timp este prin apelarea unshare(2) cu fanionul CLONE_NEWTIME. Acest apel creeaza un nou spaiu de nume de timp, dar nu plaseaza procesul apelant in noul spaiu de nume. In schimb, copiii procesului de apelare creai ulterior sunt plasai in noul spaiu de nume. Acest lucru permite ca decalajele de ceas (a se vedea mai jos) pentru noul spaiu de nume sa fie stabilite inainte ca primul proces sa fie plasat in spaiul de nume. Legatura simbolica /proc/pid/ns/time_for_children arata spaiul de nume temporal in care vor fi creai copiii unui proces; (un proces poate utiliza un descriptor de fiier deschis pe aceasta legatura simbolica intr-un apel la setns(2) pentru a se muta in spaiul de nume). /proc/pid/timens_offsets Fiecarui spaiu de nume de timp ii sunt asociate decalaje, exprimate in raport cu spaiul de nume de timp iniial, care definesc valorile ceasurilor monotonice i de pornire din acel spaiu de nume. Aceste decalaje sunt expuse prin intermediul fiierului /proc/pid/timens_offsets. In cadrul acestui fiier, decalajele sunt exprimate ca linii formate din trei campuri delimitate prin spaii: clock-id este un ir de caractere care identifica ceasul ale carui decalaje sunt afiate. Acest camp este fie monotonic, pentru CLOCK_MONOTONIC, fie boottime, pentru CLOCK_BOOTTIME. Campurile ramase exprima decalajul (secunde plus nanosecunde) pentru ceasul din acest spaiu de nume de timp. Aceste decalaje sunt exprimate in raport cu valorile ceasului din spaiul de nume de timp iniial. Valoarea offset-secs poate fi negativa, sub rezerva restriciilor menionate mai jos; offset-nanosecs este o valoare fara semn. In spaiul de nume al timpului iniial, coninutul fiierului timens_offsets este urmatorul: $ cat /proc/self/timens_offsets monotonic 0 0 boottime 0 0 Intr-un nou spaiu de nume de timp care nu a avut niciun proces membru, decalajele ceasului pot fi modificate prin scrierea de inregistrari cu terminaie de linie noua de aceeai forma in fiierul timens_offsets. Fiierul poate fi scris de mai multe ori, dar dupa ce primul proces a fost creat in spaiul de nume sau a intrat in spaiul de nume, scrierea write(2) pe acest fiier eueaza cu eroarea EACCES. Pentru a putea scrie in fiierul timens_offsets, un proces trebuie sa aiba capacitatea CAP_SYS_TIME in spaiul de nume al utilizatorului care deine spaiul de nume al timpului. Scrierile in fiierul timens_offsets pot eua cu urmatoarele erori: EINVAL O valoare offset-nanosecs este mai mare de 999,999,999. EINVAL O valoare clock-id nu este valida. EPERM Apelantul nu dispune de capacitatea CAP_SYS_TIME. ERANGE O valoare offset-secs este in afara intervalului. In particular; o offset-secs nu poate fi fixat la o valoare care ar face ca ora curenta a ceasului corespunzator din interiorul spaiului de nume sa fie o valoare negativa; i o offset-secs nu poate fi fixat la o valoare astfel incat ora ceasului corespunzator din interiorul spaiului de nume sa depaeasca jumatate din valoarea constantei KTIME_SEC_MAX a nucleului (aceasta limiteaza valoarea ceasului la un maxim de aproximativ 146 de ani). Intr-un nou spaiu de nume de timp creat de unshare(2), coninutul fiierului timens_offsets este motenit de la spaiul de nume de timp al procesului de creare. NOTE Utilizarea spaiilor de nume de timp necesita un nucleu care este configurat cu opiunea CONFIG_TIME_NS. Reinei ca spaiile de nume de timp nu virtualizeaza ceasul CLOCK_REALTIME. Virtualizarea acestui ceas a fost evitata din motive de complexitate i de suprasolicitare in cadrul nucleului. Pentru compatibilitate cu implementarea iniiala, atunci cand se scrie un clock-id in fiierul /proc/pid/timens_offsets, valorile numerice ale ID-urilor pot fi scrise in locul numelor simbolice prezentate mai sus; de exemplu, 1 in loc de monotonic i 7 in loc de boottime. Pentru uurina de citire, se prefera utilizarea numelor simbolice in locul celor numerice. Motivaia pentru adaugarea de spaii de nume de timp a fost aceea de a permite ceasurilor monotonice i de pornire sa menina valori consecvente in timpul migrarii containerului i al punctului de verificare/restaurare. EXEMPLE Urmatoarea sesiune shell demonstreaza funcionarea spaiilor de nume de timp. Incepem prin afiarea numarului nodului-i al spaiului de nume de timp al unui shell in spaiul de nume de timp iniial: $ readlink /proc/$$/ns/time time:[4026531834] Continuand in spaiul de nume al timpului iniial, vom afia timpul de funcionare a sistemului folosind uptime(1) i vom folosi programul de exemplu clock_times prezentat in clock_getres(2) pentru a afia valorile diferitelor ceasuri: $ 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) Apoi folosim unshare(1) pentru a crea un spaiu de nume de timp i pentru a executa un shell bash(1). Din noul shell, folosim comanda incorporata echo pentru a scrie inregistrari in fiierul timens_offsets, ajustand decalajul pentru ceasul CLOCK_MONOTONIC inainte cu 2 zile i decalajul pentru ceasul CLOCK_BOOTTIME inainte cu 7 zile: $ 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 Mai sus, am pornit shell-ul bash(1) cu opiunea --norc, astfel incat sa nu fie executat niciun script de pornire. Acest lucru asigura faptul ca niciun proces-copil nu este creat din shell inainte de a avea ansa de a actualiza fiierul timens_offsets. Apoi folosim cat(1) pentru a afia coninutul fiierului timens_offsets. Executarea lui cat(1) creeaza primul proces in noul spaiu de nume de timp, dupa care alte incercari de actualizare a fiierului timens_offsets produc o eroare. ns2# cat /proc/$$/timens_offsets monotonic 172800 0 boottime 604800 0 ns2# echo "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets bash: echo: eroare de scriere: Permisiune refuzata Continuand in noul spaiu de nume, vom executa uptime(1) i programul de exemplu 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) Din rezultatul de mai sus, putem vedea ca ceasurile monotonic i de pornire au valori diferite in noul spaiu de nume al timpului. Examinand legaturile simbolice /proc/pid/ns/time i /proc/pid/ns/time_for_children, vedem ca shell-ul este membru al spaiului de nume timp iniial, dar copiii sai sunt creai in noul spaiu de nume. ns2# readlink /proc/$$/ns/time time:[4026531834] ns2# readlink /proc/$$/ns/time_for_children time:[4026532900] ns2# readlink /proc/self/ns/time # Creeaza un proces-copil time:[4026532900] Revenind la shell-ul din spaiul de nume de timp iniial, vedem ca ceasurile monotonic i de pornire nu sunt afectate de modificarile timens_offsets care au fost facute in celalalt spaiu de nume de timp: $ 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) CONSULTAI I nsenter(1), unshare(1), clock_settime(2), setns(2), unshare(2), namespaces(7), time(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.9.1 2 mai 2024 time_namespaces(7)