Luna trecuta, Steven J. Vaughan-Nichols, de la ZDNet, ne-a alertat ca Linux 4.0 va oferi asistenta pentru „patching no-reboot”. Sinteza: cand apare o corectie de securitate sau o alta actualizare critica a sistemului de operare, o puteti aplica fara repornire .

In timp ce patching-ul fara reboot este convenabil pentru toata lumea, este un schimbator de jocuri pentru unele aplicatii. De exemplu, serviciile de gazduire web si cloud necesita in mod normal clientilor sa experimenteze anumite perioade de oprire in timp ce infrastructura sistemului de operare este modernizata; cu patch-uri rebootless, actualizarile se intampla perfect. Sau, imaginati-va upgrade-uri la sisteme care gazduiesc baze de date in memorie: In momentul de fata, trebuie sa verificati DB pentru stocarea stabila, opriti sistemul, actualizati-l, reporniti-l, cititi datele din stocare stabila si reporniti serviciul. Doar controlul si re-citirea de pe disc ar putea dura zeci de minute. Cu patch-uri rebootless, aceasta perturbare este evitata; cf. Utilizarea Facebook a unei memcached modificate care accepta pastrarea starii in actualizari.

Sunt deosebit de incantat de acest anunt, deoarece am lucrat la problema generala a actualizarii software-ului rulant, pe care il numesc actualizare software dinamica (DSU), de aproape 15 ani. In acest post, co-autor cu doctorandul meu Luis Pina, arunc o privire mai atenta la provocarea pe care DSU o prezinta, aratand ca ceea ce va suporta Linux este inca destul de departe de ceea ce am putea spera, dar ca ideile comunitatii de cercetare promit sa ne apropiem de ideal, atat pentru sisteme de operare, cat si pentru multe alte aplicatii.

Actualizare software dinamica: Ce este?

Toti am experimentat actualizari software normale sau statice : descarcati noul cod, opriti programul afectat daca ruleaza, aplicati patch-ul si reporniti programul. Ceea ce face ca  actualizarile software dinamice sa fie diferite este faptul ca acestea evita partea de oprire si repornire, actualizand si starea de executie a programului rulant . Aceasta stare consta din date , cum ar fi structurile de arbori si lista legate, care stocheaza baza noastra de date in memorie si control , precum stivele de executie a firelor active. Codul de program presupune ca statul respecta un anumit format si invariante si, prin urmare, schimbarea codului in timpul rularii  necesita schimbarea starii de executie in mod corespunzator.

Actualizare software dinamica

Luati in considerare un exemplu. Daca in programul actualizat intrarile unui tabel hash sunt extinse cu un camp de timeout, atunci o actualizare dinamica trebuie sa converteasca intrari hashtable in memorie pentru a contine acum un camp de timeout; altfel, atunci cand codul actualizat va accesa acel camp, se va comporta imprevizibil. Sau, daca noul cod foloseste doua fire pentru a efectua unele functionalitati, care in versiunea veche necesita un singur fir, atunci trebuie sa mapam stiva thread-ului existent la unul echivalent pentru noul cod si sa incepem un thread nou pentru a gestiona extrasul. functionalitate. Modificari ale datelor din memorie, cum ar fi primul exemplu, numim migratii de date , in timp ce modificari ale controlului, precum al doilea exemplu, numim migratii control .

Patch rebootless in Linux 4.0

Suportul de reabilitare fara rebootless in Linux 4.0 este descendentul a doua propuneri existente, kpatch (de la RedHat) si kGraft (de la SUSE). 1 Acesti doi provin din cercetari anterioare, de catre Jeff Arnold si Frans Kaashoek, pe o solutie numita Ksplice, care a fost cumparata de Oracle in 2011.

Aceste solutii se concentreaza pe modificari dinamice ale codului. Abordarea de baza pentru actualizarea dinamica a unei functii f este sa rescrieti primele cateva instructiuni ale f curentului pentru a trece la noua versiune. Aceasta abordare are avantajul ca orice referinte la f in alta parte a codului sau datelor (adica, ca indicatoare functionale) vor functiona in continuare.

Verificarea activitatii in kpatch

Functia f nu poate fi executata atunci cand are loc aceasta modificare, din motive evidente. In plus, Kpatch necesita ca functiile schimbate sa nu fie active , adica sa nu fie trimise la referinta de niciun proces de apeluri la un moment in care se efectueaza o actualizare (pe care o verifica dupa intreruperea tuturor proceselor). De ce este util acest lucru? Presupunerea este ca starea de control a nucleului vechi si nou va fi aceeasi atunci cand nu sunt active functii schimbate. Ca atare, intarzierea actualizarii pana la indeplinirea acestei conditii inseamna ca starea de control a nucleului rulant este valabila pentru noul cod. Acest lucru il face mai usor pentru programator.

Din pacate, aceasta presupunere nu tine cont de efectele  executarii prealabile a functiilor schimbate asupra datelor programului, chiar daca rolul acestor date este acelasi intre versiuni. Luati in considerare urmatorul exemplu (distilat din activitatea noastra anterioara privind actualizarea dinamica a demoniilor OpenSSH):

Versiune veche:

void go () {setup (); / * actualizati aici * / handle (); } void setup () {} void handle () {global_ptr = init; x = (* global_ptr) .field; }

Versiune noua:

void setup () {global_ptr = init; } void handle () {x = (* global_ptr) .field; }

Luati in considerare faptul ca un proces executa functia go, care nu a fost patch, imediat dupa revenirea configuratiei functiei si inainte de a apela la handle handle. Aceasta inseamna ca a fost executata versiunea veche de configurare a functiei, care nu a setat variabila global_ptr. Dar dupa actualizare, se va executa noua versiune a manerului de functii, care va anula variabila globala si se va bloca. Un studiu de cercetare pe care l-am descoperit ca verificarea activitatii in stil kpatch   nu este suficienta pentru a asigura corectitudinea controlului si starea datelor si, in plus, poate fi destul de restrictiva.

Executie multi-versiune in kGraft

KGraft incearca sa abordeze aceasta problema asigurand coerenta versiunii . Adica, atunci cand efectuati un apel de sistem, kernelul fie executa cod vechi sau cod nou, dar nu si un amestec de ambele. KGraft aplica coerenta versiunii pe fiecare proces, astfel incat este posibil ca un proces sa execute noul cod in timp ce un alt proces executa codul vechi. Cand un proces efectueaza un apel de sistem dupa instalarea corectiei, kGraft stabileste un steag „nou univers” pe acel proces. Din acel moment, acel proces va folosi intotdeauna codul patched. KGraft foloseste un nivel suplimentar de indirectie numit „realitate-verificare” pentru a decide, la intrarea functiilor patched, ce cod sa execute pe baza indicatorului de proces. Dupa ce steagul este setat pe toate procesele, kGraft renunta la indirectia acum redundanta si sare direct la codul patched.

Problema cu executia cu mai multe versiuni este ca procesele care ruleaza doua versiuni de cod diferite ar putea interactiona, de exemplu, prin structuri de date comune si, prin urmare, pot incalca noi invariante (sau depasite). Aceasta problema ar fi deosebit de acuta daca vechea si noua versiune ar schimba formatul unei structuri de date. 2

(Lipsa) actualizari de date

Niciunul dintre aceste mecanisme de redare in direct a kernelului nu accepta actualizarea datelor, cel putin nu complet sau usor. Ksplice a propus actualizarea datelor utilizand structuri de date umbre (bazate pe DynAMOS de Makris si Ryu). Avand in vedere ca structura de date originala nu are spatiu pentru campuri noi, ideea este de a crea o structura de date separata doar pentru ei si de a rescrie codul binar original pentru a utiliza noua structura atunci cand manipulati campurile noi. Aceasta abordare, cu toate acestea, introduce o multime de complexitati (si oportunitati pentru bug-uri), deoarece codul este mentinut si patch mai departe, mergand inainte.

DSU cu caracteristici complete

Asistenta Linux 4.0 DSU este departe de a sustine speranta lui Vaughan-Nichols ca „Cu Linux 4.0, este posibil sa nu mai fiti nevoie sa va reporniti din nou sistemul de operare: ” pur si simplu nu este suficient de flexibil. Scopul DSU este evitarea opririi si repornirilor; astfel, in mod ideal, oricare actualizari ale unui program pe care le putem face in mod static, putem face si dinamic. Adica, ar trebui sa putem adauga noi functii, sa schimbam tipurile de functii (de exemplu, sa avem argumente noi sau diferite) sau sa modificam structurile de date, de exemplu, prin adaugarea de noi elemente de date, despartirea sau schimbarea tipurilor de elemente existente, adaugarea si inlaturarea indicatoarelor, etc. Dar suportul rebootless al Linux 4.0 reda flexibilitatea in scopul unei mai bune performante, compatibilitate inapoi si usurinta de utilizare de catre programatorul kernel, chiar daca acesta din urma nu este destul de satisfacator, asa cum am discutat: ironic , un „patch rebootless” ar putea duce la un accident, invingand punctul!

Comunitatea de cercetare se uita de mai multi ani acum la modul de sustinere a DSU extrem de flexibil. 3 Consideram  DSU cu proces intreg , pionierat de sistemul UpStare al lui Makris si Bazzi, ca cea mai promitatoare abordare a programelor spatiu pentru utilizatori, datorita flexibilitatii sale. In aceasta abordare, intregul cod nou este incarcat in memoria procesului de rulare si apoi controlul si migratiile de date actualizeaza direct starea de executie inainte sau chiar in combinatie cu executia ulterioara a acelui cod.

Kitsune si Rubah

Am dezvoltat doua sisteme care adopta abordarea intregului proces: Kitsune, pentru programele C si Rubah, pentru programele Java. Ambele sisteme sunt suficient de flexibile pentru a aplica in mod dinamic o valoare de ani de actualizari la nivel de lansare si au fost folosite pentru a actualiza dinamic aplicatii substantiale precum redis, memcached, snort, H2 si Voldemort. In afara de flexibilitatea lor, aceste sisteme nu impun nicio depasire masurabila pentru executia normala.

porno anastasia lux http://construquimicos.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno batrine http://drugsafetyinstitute.info/__media__/js/netsoltrademark.php?d=adult66.net/
porno elefant http://windermeretruth.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno xxx romanesti http://wierz.org/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/amatori
google porno http://rewolucjarecords.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/anal
porno grandma mom http://end-diverticulitis.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/asiatice
fime porno rominesti http://prufunds.biz/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/beeg
mature sex porno http://sexybits.org/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/blonde
jocuri cu porno http://luvuwater.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brazzers
filme porno cu cur mare http://nsfas.org/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brunete
filme porno cu asistente http://johnhessburg.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/chaturbate
zoofilie porno http://ameribill.biz/__media__/js/netsoltrademark.php?d=adult66.net/minora-dornica-de-sex-e-penetrata-profund-in-pizda-si-in-cur-de-un-actor-de-filme-porno
filme porno nelly kent http://fernandofernandezmassage.com/__media__/js/netsoltrademark.php?d=adult66.net/pustoaica-lipsita-de-inhibitii-se-masturbeaza-cu-vibratorul-pe-on-banca-retrasa-din-parc-si-e-filmat
granny porno http://embroiderysoftwareonline.net/__media__/js/netsoltrademark.php?d=adult66.net/adolescenta-dulce-si-inocenta-e-dezvirginata-de-unu-mai-mare-ca-ea-si-pacalita-sa-faca-sex-oral-aces
filme porno cu femei plinute http://mosquitofreebackyard.com/__media__/js/netsoltrademark.php?d=adult66.net/chinezoaica-focoasa-e-fututa-nebuneste-de-unu-care-o-fute-ca-un-animal-pe-la-spate
moms porno http://www.bernieyoungentertainment.net/__media__/js/netsoltrademark.php?d=adult66.net/doua-pustoaice-se-freaca-una-de-alta-de-plictiseala-pana-cand-au-orgasm-simultan
filme porno romantic http://aasaanhaina.com/__media__/js/netsoltrademark.php?d=adult66.net/lesbiene-sexy-si-frumoase-isi-etaleaza-accesoriile-apoi-incep-sa-se-linga-si-sa-si-dea-limbi-in-pizd
actrite porno romania http://d-saatvemucevherat.com/__media__/js/netsoltrademark.php?d=adult66.net/pustoaica-mica-si-jucausa-ia-face-sex-oral-prietenului-ei-apoi-se-fute-cu-el-pana-cand-are-orgasm
porno ukraina http://ecosculptures.com/__media__/js/netsoltrademark.php?d=adult66.net/lesbiene-isi-fac-de-cap-cu-o-partida-de-sex-in-pozitia-69-si-isi-dau-limbi-in-pizda
film porno alina plugaru http://therapeutic-hypothermia.com/__media__/js/netsoltrademark.php?d=adult66.net/amatori-de-filme-pono-fac-o-partide-de-sex-hardcore-pana-la-epuizare-apoi-se-filmeaza-cu-web-ul

Acest lucru se datoreaza faptului ca abordarea intregului proces permite codul optimizat pe plan intern – astfel de optimizari ar fi inhibate de nivelurile adaugate de indirectie (precum tramboline) si non-local spatiale comune in abordarile de actualizare pe functii. 4

Dezavantajul ambelor abordari este munca suplimentara a programatorului in sprijinirea controlului si a migrarii datelor.

In primul rand, ei solicita programatorului sa adauge puncte de actualizare la program. Acestea sunt puncte la care programul sondeaza pentru a vedea daca este disponibila o actualizare dinamica si, daca da, va incepe aplicarea acesteia. De obicei, programele au doar o serie de puncte de actualizare si sunt plasate in mod natural la inceputul buclelor care ruleaza de lunga durata, cand sunt stabilite invariante si / sau evenimentele au fost gestionate complet.

In al doilea rand, programatorul trebuie sa defineasca functiile de transformare a starii  care indica modul in care datele dintr-o versiune veche a unui tip / clase ar trebui utilizate pentru initializarea versiunii actualizate. De exemplu, transformatorul de stare poate furniza valoarea implicita pentru un camp nou. Din fericire, procesul de gasire si actualizare a valorilor actualizate ale datelor este automatizat. Kitsune actualizeaza toate datele simultan, folosind un mecanism de colectare a gunoiului. Rubah poate actiona in mod similar, dar accepta si migratia de date in zbor, actualizand fiecare obiect depasit atunci cand noul cod il acceseaza prima data dupa actualizare. Ambele sisteme ofera o automatizare simpla si pentru transformatoarele de scriere, dar uneori programatorul trebuie sa se implice.

In al treilea rand, programatorul trebuie sa modifice programul pentru a sprijini migrarea fluxului de control intre versiuni. Kitsune si Rubah incep sa ruleze noul program din punctele de intrare a firelor echivalente (dupa ce datele sunt migrate sau initiate in cazul on-the-flly). Pentru a evita reluarea codului de initializare, programul il poate omite, conditionat sa fie in modul de actualizare ; acest mod este dezactivat odata ce punctul de actualizare echivalent este atins in noul program. Constatam ca modificarea migratiei controlului catre program este relativ simpla, deoarece punctele de actualizare tind sa fie superficiale in graficul fluxului de control, iar codul de initializare este adesea omis in masa. De exemplu, redisarea a necesitat doar 2 LOC in plus, iar memcache-ul a necesitat 9 LOC. Si mai bine, acest cod se schimba rar, deci este practic un efort unic, mai degraba decat un efort per actualizare.

In final, aceasta lucrare se ridica la doar sute de linii de cod (in comparatie cu zeci sau sute de mii de linii dintr-o aplicatie), iar o mare parte a lucrarii se face o singura data. Iar beneficiul este actualizari dinamice complete, cu performante excelente.

Ce urmeaza?

Este posibil sa se aplice tehnicile de la DSU cu proces intreg pe nucleul de sistem? O posibilitate este de a aplica actualizari „intregi masini virtuale” – masinile virtuale sunt pentru monitoarele de masini virtuale (VMM) care sunt procesele pentru sistemele de operare. Intr-adevar, o critica recenta asupra suportului pentru Linux 4.0 DSU indica aceasta directie: „In loc sa incercati sa remediati un kernel care ruleaza … in partea de sus a noului kernel? “

Ideea de functionare non-stop este atragatoare in afara programelor utilizatorilor independenti si a nucleelor ​​OS. Dar despre actualizarea elementelor unui sistem distribuit intr-un mod in care protocolul de comunicare este schimbat? Sau, cum ramane cu actualizarea schemei si continutului unei baze de date (asa-numita „migrare a schemelor”) in timpul migrarii aplicatiilor care o folosesc (de exemplu, si a evita timpul de oprire de 22 de ore experimentat de Mediawiki)? De asemenea, ne putem imagina actualizarea aplicatiilor web bazate pe cloud – actualizarile pot fi transmise in tacere catre utilizatori chiar si in timp ce aplicatiile sunt utilizate. Toate aceste modificari ar facilita aplicarea mai gata a imbunatatirii functionalitatii sau a performantei si a corectiilor de securitate.