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

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

А компанія Canonical зовсім недавно представила сервіс Canonical Livepatch Service. за допомогою якого можна патчить без перезавантаження ядро ​​Ubuntu.

Більш докладно про деякі сучасні інструменти для додавання патчів ми розповімо в цій статті.

Найпростіший приклад: 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:

висновок

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

Завантажуються модулі виправляють проблеми, завантажені модулі беруть роботу з необхідними функціями на себе, замість старого уразливого коду.
Поки обкачую канонікаловскій варіант на своєму особистому сервері, дуже задоволений тим, що без ребут проблеми в ядрі виправлені.

Час вказано в тому часовому поясі, який встановлений на вашому телефоні.