Найпростіший приклад: 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:
висновок
А якщо ви хочете вивчити тему більш глибоко, зверніть увагу на наступні посилання: