Как да обновя ядрото на системата, без да рестартирате услугата (инструкции стъпка по стъпка)

Какво си мислиш колко всъщност отидете на машината на SSH, актуализация на системата, стартира новото ядро ​​и да остане в същата SSH сесия. Сега там е модерен движение по актуализацията на ядрото в движение (ksplice, KernelCare, ReadyKernel и т.н.), но този метод има много ограничения. Първо, тя не позволява да приложите промените, които променят структурата на данните. На второ място, в обектите на паметта може вече да съдържа неверни данни, които могат да причинят проблеми в бъдеще. Има повече от "справедлив" начин за актуализиране на ядрото ще бъде описана. В действителност, много метода Отдавна е известно [1]. и стойността на тази статия е, че можем да направим всички подробности за истински пример, разбирам колко е лесно или трудно, и какво да очакваме от такива експерименти.

Травис CI - един от най-популярните системи за непрекъснато интеграция, която работи добре с Github. Service се развива бързо, и ако преди няколко години, той се осигурява само на контейнерите с не много пресни дистрибуции, но днес има възможност за избор между контейнерите и vmkami, има подкрепа не само на Linux системи и др.

Ние започнахме да използваме Травис-CI в нашия проект CRIU (КПП / restrore в потребителското пространство) преди няколко години и винаги са взети от службата най-много. Започнахме чрез проверка за съставяне на x86_64, а сега Травис-CI започва нашите тестове, проверява компилация за всички архитектури с различни компилатори и дори тестване на съвместимостта с по-нови ядки, включително най-нестабилна и напреднали клон на Linux-Next.

Най-важното тук е, че всеки разработчик може да използва всичко това за свои цели и не е необходимо нищо локално да се създаде, Крауч, се прескача.

И сега до точката, дами и господа ...

Но днес искам да ви кажа, не е за това как се тества criu и един интересен вариант на неговото използване. Представете си, че на входа имаме виртуална машина, която работи върху процеса на SSH. Тъй като ние се зареди ядрото си, така че процесът не забеляза? Това е точно ситуацията, че трябва да Травис-CI.

Външен достъп до virtualke ние нямаме, а ако Травис процес по някаква причина умира (завършен), услугата завърши задачата и премахва VM. Съгласете се, малък проблем, честно казано, не е лесно. Ние дори направи надолу вот - Zoom, ако дойдете веднага в съзнанието на решението или не.

Но ние сме направили по следния начин: вземат criu, самосвали SSH сесия Травис, заредете новото ядро ​​и възстановяване процеси се изпълняват. Нещо като това, помислих си, когато той реши да се позабавляваме след вечеря и да се покаже как ще се лети.

Актуализация - по-малката от злини, решен на няколко отбора:

Но след това става много по-забавно. На първо място, има тема, където да започне на сметището? Второ, как ние се възстанови? Ако нещо се обърка, как можем да знаем какво точно? От замразени помощ Травис не трябва да чакаме.

Така че нека да започнем да разбираме себе си. Очакваме в дървото на процеса и да разберат, че сметището трябва да започва с процеса на SSHD, който обработва нашия SSH сесия.

Ходим на всички родители, като се започне със себе си, и да вземе втория процес SSHD от първоначален-като:

Сега ние знаем кой сметището и е необходимо да се реши кой ще го направя. Добре е да отбележим, че CRIU не позволява "отреже клона, на който той се намира", така че трябва да се създаде процес на трета страна:

Това е време, за да напишете команда, за да се отърват. Ако мислите, че това не е трудно, много греши. В CRIU naroslo има толкова много възможности, че не всички разработчици могат веднага да ги разберат. Но в действителност, нещата не са толкова лоши, ако се вгледате. Ред код вече е твърде кратък.

Ако можем да го преведе на български, екип е нещо подобно: "CRIU, да ни накара да зареже поддървото като се започне с процеса на $ PID, всички данни Събирай директорията / изобр, освен трупи да подаде dump.log, да ми каже по-подробно за всичко, което правите, и също така ви позволяват да запишете TCP-гнезда, Unix-гнезда, свързани с външния свят, файлови брави, дръжки на изтрити файлове. "

Изглежда, че всичко е ясно с изключение на изтрити файлове - от къде идват? Но това е достатъчно, за да се помни, че ние сме създали голямо обновяване на системата и това означава, че надстройката почти всичко, включително библиотеки и изпълними. В този случай, нашият процес не се рестартира и продължава да използва старите версии на тези файлове. Тя е за тях сме дали опцията --link-оставам.

Тук възниква друг проблем. Между опазване и възстановяване обработва трафика в мрежата трябва да бъдат блокирани, в противен случай няма гаранция, че връзките на TCP оцелеят операцията. CRIU добавя към това няколко правила Iptables и нашата задача - да се възстанови на правилата след стартирането на новото ядро, но преди да се случи, и мрежовите настройки. Тук имах малко работа с Google, но като цяло също решаване на проблема, не е твърде трудно.

възстановяване

По този начин, процесите се съхраняват, а времето е дошло време да се подготви този, който ще ги възстанови. Тук трябва да се напише една малка услуга.

Изглежда всичко е готово и можете да се свали. Ключът е да се започне.

Така че ние излетял, но като SpaceX, за първи път не можа да седне. Но ние не може, тъй като платформа за кацане е някой вече е заета. Но сериозно, проблемът е, че може да се възстанови само CRIU процесите с едни и същи идентификатори, че те са били в момента на сметището. Ние рестартира в новата система, където systemd (.), Както и процесът се е превърнал в малко повече. Този проблем отдавна е изследван от науката, а след това ще помогне да се контейнери, по-точно, им е само една малка част, наречена на името на пространството на процес (PID пространство от имена) на.

Нека се опитаме да се свали, и отново ни кораб не се свържете. До този момент няма никакви идеи за проблема и трябва да по някакъв начин да получите трупи. Тук беше решено да не мисли дълго и да вземат и да ги изсипва се в един от най-популярните съхранение на различни отпадъци.

При камерите пистолет губим друг кораб и ние разбираме, че шегата е свършено. По това време ние се оплакват DBUS гнездо, т.е. тя е такава връзка, състоянието на които не е достъпно за нас, тъй като има само DBUS-демон. От друга страна, това, което се нуждае от това SSHD гнездо? Със сигурност той иска да се следи състоянието на мрежата и други глупости. Ние ще направим всичко, което не е (или по-скоро, че всички ние сме направили), така че нека просто да се възстанови този контакт по някакъв начин и да отидете по-далеч.

В действителност, ние направихме нашата собствена кръпка за CRIU. Това може да бъде решен по-елегантно, с помощта на плъгини, но това е по-бързо. Отново изпълваме промени и очакваме с нетърпение следващата есен. По това време, че има проблем с псевдо: необходим брой вече се използва от някого. Бихме могли да монтирате devpts с newinstance, но тази опция е по-скоро не работи.

- newinstance планината Опцията продължава да бъде прието, но сега е
Игнорирани. // Ерик W. Biederman

Изглежда, че е време да влезе в образа на процеса и малко докосване до тяхната база данни. Оставете ги да промените броя на псевдо и добавяне на представката 1. Беше терминал номер 1, ще бъде с номер 11. За да направите това, е възможно да се преформатира CRIU образ в Json формат и обратно. Тя изглежда така:

Отново и тичам напред. Време е дълъг следобед и цялата идея е ясно много по-забавен. Рутинно получите съобщение за грешка - този път, че някои FIFO файлове от / цикъл / systemd / сесии не могат да бъдат възстановени. Разберете какви файлове нямам никакво желание, така че преди възстановяване просто ги създават и ще се движат по.

Изглежда достатъчно, за да направи друг кръпка до criu и златната ключът е в джоба ни.

заключение

Това, което трябва да се докаже? Първо, изберете няколко приложения, и второ, показа, че CRIU - това е инструмент много ниско ниво, а дори и по-проста задача може да изисква по-задълбочени познания на системата. Но усилията се компенсират от власт, гъвкавост и възможности. Въпреки, че няма гаранция, че няма да се налага да воюват с бъгове.

Успех в шир на космоса!