Як пропатчити ядро ​​без перезавантаження livepatch, kpatch і canonical livepatch service,

Найпростіший приклад: livepatch

Почнемо з дуже простого експерименту. Для цього нам знадобиться будь-який дистрибутив Linux c ядром версії 4.0 або вище (в нашому випадку це Ubuntu 16.04; тут і далі всі приклади команд наводяться саме для цього дистрибутива). У нових версіях ядра функція додавання патчів «на льоту» (вона так і називається - livepatch) включена за замовчуванням.
Щоб перевірити, як вона працює, нам буде потрібно, по-перше, встановити заголовки ядра:

Далі встановимо налагоджувальні символи ядра:

При виконанні цієї команди в Ubuntu 16.04 може бути видано наступне повідомлення про помилку:

Після цього попередня команда буде виконуватися без помилок.

До експерименту все готово, можна починати:

Ми завантажили код модуля ядра, який вносить зміни в основний ядерний код і модифікує висновок команди cat / proc / cmdline. Тепер цей самий модуль потрібно зібрати. Для цього створимо наступний make-файл:

Зберемо модуль і вставимо його в ядро:

Подивимося, що вийшло. Виконаємо:

Замість стандартної інформації про параметри ядра ми побачимо ось такий текст:

Як бачимо, патч був успішно застосований.

Вся інформація про завантажені патчах зберігається в директорії / sys / kernel / livepatch:

Деактивувати патч можна за допомогою команди:

Почнемо з установки необхідних залежностей:

Для повноцінної роботи з kpatch також бажано встановити ccache.

Ось і все, залежно встановлені. Можна встановлювати kpatch:

У нашому експерименті ми будемо патчить вихідні ядра. Клонуємо репозиторій з вихідним кодом нашої поточної версії Ubuntu:

По завершенні клонування скопіюємо вихідні в директорію ubuntu-xenial-kpatch (це потрібно, щоб вносити зміни в початковий код і потім створювати на основі цих змін патчі):

Відкриємо файл ubuntu-xenial-kpatch / ubuntu-xenial / fs / proc / version.c і внесемо в нього такі зміни:

Cоздадім патч за допомогою команди:

Патч являє собою звичайний текстовий файл, в якому перераховані внесені зміни:

Щоб додати патч в ядро, виконаємо:

Як видно з тільки що наведеного виведення, на виході ми отримуємо модуль ядра. Щоб застосувати патч, потрібно просто додати цей модуль стандартним способом:

Подивимося, що вийшло в результаті:

Canonical Livepatch Service

Кілька місяців тому компанія Canonical запустила офіційний сервіс Canonical LivePatch Service, який дозволяє патчить ядро ​​«на льоту» за допомогою найпростіших команд. Цей сервіс орієнтований в першу чергу на користувачів enterprise-рівня, і тому є платним.
Але пересічні користувачі теж можуть оперативно отримувати всі свіжі оновлення ядра. Для цього потрібно зареєструватися на Ubuntu One і отримати токен. Токен дає можливість встановити на 3 машини програму canonical-livepatch, яка завантажує і додає патчі.

Подивимося, як працює Canonical Livepatch Service. Перейдемо за посиланням вище, отримаємо токен, а далі виконаємо:

По завершенні установки вийдемо з системи, потім увійдемо знову і виконаємо:

Якщо все було зроблено правильно, ми отримаємо наступне повідомлення:

Далі виконаємо команду:

Висновок показує, що сanonical-livepatch працює, і в ядро ​​встановлені всі останні оновлення. Більш детальну інформацію можна отримати, скориставшись опцією --verbose:

Також інформацію про встановлені патчах можна отримати, заглянувши в уже згадану вище директорію / sys / kernel / livepatch:

Kpatch_livepatch_Ubuntu_4_4_0_47_68_generic_14 - це і є останній завантажений патч. Останні цифри в імені патча (14) збігаються з номером версії, зазначеним у висновку команди canonical-livepatch status (див. Вище).

Переконатися, що новий патч був доданий, можна і за допомогою команди lsmod:

висновок

А якщо ви хочете вивчити тему більш глибоко, зверніть увагу на наступні посилання: