Cum să actualizați nucleul în sistem fără a reporni serviciul (instrucțiuni pas cu pas)

Ce crezi că de fapt, cât de multe du-te la masina pe ssh, actualizați sistemul, porniți noul kernel și să rămână în aceeași sesiune ssh. Acum există o mișcare de modă pe actualizarea kernel-ului pe zbor (Ksplice, KernelCare, ReadyKernel, etc.), dar această metodă are multe limitări. În primul rând, nu permite să se aplice modificările care modifică structura datelor. În al doilea rând, în obiectele de memorie pot conține deja date incorecte, care pot provoca probleme în viitor. Există mai mult mod „corect“ pentru a actualiza kernel-ul va fi descris. De fapt, a fost mult timp cunoscut foarte metoda [1]. iar valoarea acestei lucrări este că putem face toate detaliile pe un exemplu real, să înțeleagă cât de mult este ușor sau dificil, și ce să se aștepte de la astfel de experimente.

Travis CI - una dintre cele mai populare sisteme de integrare continuă, care funcționează bine cu Github. Serviciul se dezvoltă rapid, iar în cazul în urmă cu câțiva ani, el oferă doar containerele cu distribuții nu foarte proaspete, dar astăzi există posibilitatea de a alege între containere și vmkami, există un sprijin nu numai de sisteme Linux și mai mult.

Am început folosind Travis-CI în proiectul nostru CRIU (punct de control / restrore în spațiul utilizator a) în urmă cu câțiva ani și au luat întotdeauna de la serviciul cel mai mult. Am început prin verificarea compilația pe x86_64, iar acum Travis-CI începe testele noastre, verifică o compilație pe toate arhitecturile cu diferite compilatoare și chiar testarea compatibilității cu nucleele mai noi, inclusiv ramura cea mai instabilă și avansat al Linux-Next.

Și cel mai important lucru este că orice dezvoltator poate utiliza toate acestea pentru propriile lor scopuri și nu are nevoie de nimic la nivel local pentru a configura, Crouch, sari.

Și acum la punct, doamnelor și domnilor ...

Dar astăzi vreau să vă spun nu este despre modul în care ne-am testat criu, și o variantă interesantă a utilizării sale. Imaginați-vă că la intrare avem o mașină virtuală, care se execută asupra procesului de ssh. Așa cum am încărca kernel-ul dvs., astfel încât procesul nu a observat? Aceasta este exact situația pe care trebuie să-Travis CI.

Acces extern la virtualke nu avem, iar în cazul în care procesul de Travis un motiv sau altul moare (finalizat), serviciul finalizează activitatea și elimină VM. Sunt de acord, o mică problemă, destul de sincer, nu este ușor. Am făcut chiar și un vot în jos - Zoom, dacă vii imediat în minte decizia sau nu.

Dar am făcut următorul mod: să ia criu, benă ssh-sesiune Travis, incarca noul kernel, și de a restabili procesele se execută pe. Ceva de genul asta, m-am gândit, când a decis să se distreze după cină și arată modul în care va zbura.

Update - cea mai mică dintre rele, rezolvat câteva echipe:

Dar apoi devine mult mai distractiv. În primul rând, există un subiect în cazul în care pentru a începe groapa de gunoi? În al doilea rând, modul în care ne-am recupera? Dacă ceva nu merge bine, cum știm ce anume? De la un ajutor Travis înghețat nu trebuie să aștepte.

Deci, să înceapă să înțeleagă propria lor. Ne uităm la arborele de proces și să înțeleagă că groapa ar trebui să înceapă cu procesul de sshd care se ocupă de nostru SSH-sesiune.

Mergem la toți părinții, începând cu tine însuți, și să ia de-al doilea proces de sshd ca init-:

Acum știm cine groapa de gunoi și este necesar să se decidă cine va face. Este demn de remarcat faptul că CRIU nu permite „taie ramura pe care stă,“ așa că trebuie să creeze un proces de terță parte:

Este timpul pentru a scrie o comandă să-și arunce. Dacă credeți că acest lucru nu este dificil, foarte greșit. În CRIU naroslo au atât de multe opțiuni, încât nu toți dezvoltatorii le pot înțelege imediat. Dar, în realitate, lucrurile nu sunt atât de rău, dacă te uiți. Linia de cod este deja prea scurt.

Dacă am traduce în limba română, o echipa merge ceva de genul: „CRIU, să ne facă să arunce subarbore începând cu procesul de $ pid, toate datele Adună directorul / imag, salvați jurnalele la dosar dump.log, spune-mi în detaliu despre tot ceea ce faci, și de asemenea, vă permit să salvați tcp-prize, unix-prize în legătură cu lumea exterioară, încuietori de fișiere, mânere pentru fișierele șterse ".

Se pare că totul este clar, cu excepția fișierelor șterse - în cazul în care acestea provin de la? Dar este suficient să ne amintim că am stabilit un update major asupra sistemului, și aceasta înseamnă că upgrade-ul doar despre tot, inclusiv bibliotecile și executabilele. În acest caz, procesul nostru nu este repornit și este încă utilizați versiuni mai vechi ale acestor fișiere. Este pentru ei ne-am dat opțiunea --Conectați-REMAP.

Aici apare o altă problemă. Între conservarea și restaurarea proceselor de trafic în rețea trebuie să fie blocate, în caz contrar nu există nici o garanție că conexiunile TCP supraviețui operației. CRIU adaugă la aceasta o pereche de reguli Iptables, iar sarcina noastră - pentru a restabili regulile după pornirea noului kernel, dar înainte ca acestea să se întâmple, și setarea de rețea. Aici am avut un pic de Googling, dar, în general, de asemenea, problema rezolvată nu este prea dificil.

recuperare

Astfel, procesele sunt stocate, și a venit în momentul în care timp pentru a pregăti cel care le va restaura. Aici avem de a scrie un mic serviciu.

Se pare că totul este pregătit și puteți decola. Cheia este de a începe.

Așa că am luat off, dar, ca SpaceX, prima dată nu a putut sta jos. Dar nu am putut, pentru că platforma de aterizare a fost cineva deja ocupat. Dar serios, problema este că CRIU poate recupera doar procesele cu aceiași identificatori pe care le au la momentul haldei. Noi repornită în noul sistem, în cazul în care systemd (.), Iar procesul a devenit un pic mai mult. Această problemă a fost mult timp studiată de știință, iar apoi vom ajuta la containere, mai precis, lor este doar o mică parte numită spațiul de nume al procesului (spațiul de nume pid).

Să încercăm să decoleze, și din nou nava noastră nu a intra în contact. În acest moment nu există idei cu privire la problema și au nevoie pentru a obține într-un fel jurnalele. Aici sa decis să nu se gândească mult și să ia și să le toarnă într-una dintre cele mai populare depozitarea deșeurilor diferite.

Sub camerele de luat vederi arma pierdem o altă navă și înțelegem că gluma a fost de peste. În acest moment se plâng socket DBus, adică este o astfel de legătură, al căror statut nu este disponibil pentru noi, deoarece are doar DBus-demon. Pe de altă parte, ce are nevoie de acest soclu sshd? Cu siguranță că vrea să monitorizeze starea rețelei și alte prostii. Vom face tot ceea ce nu este (sau, mai degrabă, am făcut toate), așa că hai să restabiliți această priză într-un fel și merge mai departe.

De fapt, ne-am făcut propriul nostru de patch-uri pentru CRIU. Acest lucru ar putea fi rezolvate mai elegant, cu ajutorul plug-in-uri, dar a fost mai rapid. Din nou, ne umplem modificările noastre și așteptăm cu nerăbdare să toamna viitoare. În acest moment, există o problemă cu pseudo: numărul necesar deja utilizat de cineva. Am putea monta devpts cu newinstance, dar această opțiune este mai recent, nu a funcționat.

- Opțiunea newinstance mount continuă să fie acceptată, dar este acum
Ignorat. // Eric W. Biederman

Se pare că e timpul pentru a intra în imaginea de proces și un pic retuș dosarul lor. Lăsați-i să schimbe numărul de pseudo și adăugați prefixul 1. A fost numărul terminalului 1, va fi cu numărul 11. Pentru a face acest lucru, este posibil să se reformata imagine CRIU în format JSON și înapoi. Se pare ca acest lucru:

Din nou, și a alerga înainte. Timpul are după-amiază lungă, și întreaga idee este în mod clar mult mai întârziată. obține o eroare de rutină - de data aceasta că unele fișiere FIFO din / run / systemd / sesiuni nu pot fi restaurate. Înțelegeți ce fel de fișiere nu au nici o dorință, astfel încât înainte de restaurarea doar a le crea și va rula pe.

Se pare suficient pentru a face un alt patch-uri pentru criu, iar cheia de aur este în buzunarul nostru.

concluzie

Ce suntem noi pentru a dovedi? În primul rând, alege un cuplu de aplicații, iar pe de altă parte a arătat că CRIU - aceasta este o instrumente de nivel scăzut foarte, chiar și o sarcină simplă poate necesita cunoștințe în profunzime a sistemului. Dar eforturile sunt compensate de putere, flexibilitate și caracteristici. Deși nu există nici o garanție că nu va trebui să război cu bug-uri.

Mult noroc la întindere de spațiu!