Hotpatching: как обновить ядро Linux без перезагрузки системы

Присылаем лучшие статьи раз в месяц

Шаг Проверка установленной версии ядра

Когда мы устанавливаем дистрибутив, он включает определенную версию ядра Linux. Чтобы показать текущую версию, установленную в нашей системе, мы можем сделать:

# uname -sr

На следующем рисунке показан результат выполнения вышеуказанной команды на сервере CentOS 7:

Проверка версии ядра в CentOS 7

Если теперь перейти на , мы увидим, что на момент написания этой версии последняя версия ядра — (другие версии доступны с того же сайта).

Важно учесть жизненный цикл версии ядра — если версия, которую вы используете в настоящее время, подходит к концу, никаких исправлений ошибок после этой даты не будет. Для получения дополнительной информации см. Страницу Release Releases.

Настраиваемые параметры ядра

Системное ядро Linux разрабатывалось таким образом, чтобы всегда была возможность его максимально гибко (впрочем, как и всё в системах UNIX и Linux) настроить, адаптируя его к требуемым условиям эксплуатации и аппаратному окружению. Причём так, чтобы это было возможно динамически на готовой сборке ядра. Другими словами, системные администраторы могут в любой момент времени вносить корректирующие параметры, влияющие на работу как самого ядра, так и его отдельных компонентов.

Для реализации этой задачи между ядром и программами пользовательского уровня существует специальный интерфейс, основанный на информационных каналах. Через эти каналы и направляются инструкции, задающие значения для параметров ядра.

Но как и всё в системах UNIX и Linux, настройка параметров ядра по информационным каналам завязана на файловой системе. Чтобы просматривать конфигурацию ядра и управлять ею, в файловой системе в каталоге /proc/sys существуют специальные файлы. Это обычные файлы, но они играют роль посредников в предоставления интерфейса для динамического взаимодействия с ядром. Однако документация, касающаяся этого аспекта, в частности об описании конкретных параметров и их значений довольно скудна. Одним из источников, из которого можно почерпнуть некоторые сведения по этой теме, является подкаталог Documentation/sysent в каталоге с исходными кодами ядра.

Читайте также:  Вышел Jailbreak Unc0ver 5.0.0 для iOS 13.5: как его установить

Для наглядности стоит рассмотреть небольшой пример, показывающий, как через параметр ядра настроить максимальное число одновременно открытых файлов в системе:

$ cat /рrос/sys/fs/file-max 34916 $ sudo sh -c «echo 32768 > /proc/sys/fs/file-max»

Как можно видеть, к такому приёму можно довольно быстро привыкнуть и это не будет казаться чем-то очень сложным. Такой метод хоть и удобен, однако изменения не сохраняются после перезапуска системы.

Также можно использовать специализированную утилиту sysctl. Она позволяет получить значения переменных прямо из командной строки, либо список пар вида переменная=значение из файла. На этапе начальной загрузки утилита считывает начальные значения некоторых параметров, которые заданы в файле /etc/ Более подробную информацию об утилите sysctl можно найти на страницах man-руководства.

В следующей таблице приводятся некоторые настраиваемые параметры ядра:

Условные обозначения: F — /proc/sys/fs, N — /proc/sys/net/ipv4, К — /proc/sys/kernel, С — /proc/sys/dev/cdrom.

Пример:

$ sudo sysctl _forward=0

В результате выполнения этой команды будет отключено перенаправление IP-пакетов. Есть одна особенность для синтаксиса этой команды: символы точки в «_forward» заменяют символы косой черты в пути к файлу ip_forward.

Установка ядра

Перед обновлением ядра, необходимо обновить саму систему:

yum update

После стоит перезагрузить систему:

shutdown -r now

Далее у нас на выбор два способа обновления ядра — с использованием репозитория или вручную, скачав исходник с

С помощью yum

Самый быстрый и безопасный способ обновить ядро CentOS — воспользоваться автоматической установкой из репозитория. Минусом тут является то, что можно установить только ту версию, которая имеется в наличие в данном репозитории.

Последняя версии ядра для CentOS находится в репозитории ELRepo (не путать с EPEL). Сначала устанавливаем его.

Переходим на веб-страницу и копируем ссылку на последнюю версию репозитория для нашей версии операционной системы, например:

Импортируем ключ репозитория:

rpm —import

Воспользовавшись ссылкой, устанавливаем сам репозиторий:

yum install

* список установленных репозиториев можно посмотреть командой yum repolist.

Теперь можно установить ядро:

yum —enablerepo=elrepo-kernel install kernel-ml

Ручное обновление

Чаще всего, администратор пользуется встроенными в сборку Linux инструментами (как описано выше) — это безопаснее и проще. Однако, если нужной версии ядра нет в репозитории или мы хотим установить тестовую версию, необходима ручная установка.

Читайте также:  BASH скрипт резервного копирования WEB сервера

Ручная установка неадаптированного для определенной сборки Linux ядра — потенциальный риск для системы. Обновление стоит проводить сначала в тестовой среде, а также выполнить резервное копирование всех важных данных.

Для начала переходим на сайт и копируем ссылку на нужную версию ядра Linux:

* в данном примере мы скопировали ссылку на нестабильную версию ядра 5.0.

Воспользовавшись ссылкой, скачиваем ядро на компьютер с Linux:

wget

* если система вернет ошибку, нужно установить wget — yum install wget.

Распаковываем скачанный архив:

tar -xvf -C /usr/src

* в данном примере мы распаковываем архив в каталог /usr/src.

Переходим в каталог, куда распаковали исходник ядра:

cd /usr/src/

Устанавливаем инструменты для компиляции пакетов:

yum groupinstall "Development Tools"

yum install ncurses-devel openssl-devel bc

Создаем свою конфигурацию для ядра:

make menuconfig

Или используем текущую конфигурацию для ядра:

make oldconfig

На все вопросы, которые задает система можно отвечать нажатием Enter, чтобы принимать значения по умолчанию.

Компилируем ядро:

make

* процедура может занять много времени.

После устанавливаем ядро и модули:

make modules_install install

Сборка Ядра

Теперь, когда мы сконфигурировали ядро, мы готовы к его сборке. Если вы не знаете, каково состояние дерева для сборки, прежде чем приступать к конфигурированию нового ядра выполните make clean. Для более полной очистки выполните make mrproper (при этом — make mrproper — будет удален файл .config, а также некоторые другие файлы, используемые в процессе сборки).

В ходе пробы конфигурирования, желательно дать новому ядру специальное название, которое позволит вам легко его идентифицировать. Чтобы сделать это, необходимо установить значение Local version и активировать опцию Automatically append version information to the version string в соответствующей строке раздела General setup.

В принципе, для сборки ядра не требуются полномочия root, несмотря на то, что для установки нового ядра эти полномочия необходимы.

Чтобы начать сборку ядра 2.6, необходимо выполнить make.

Чтобы начать сборку ядра 2.4, необходимо выполнить 3 команды: make dep make bzImage make modules Первая создает файлы необходимых зависимостей. Вторая собирает ядро. И последняя собирает модули.

Читайте также:  Для чего нужен и как узнать основной шлюз

…и kGraft + kpatch

Две практически одинаковые реализации одной проблемы в ядре — это многовато. Поэтому, столкнувшись с рядом проблем, разработчики kpatch и kGraft решили объединить свои усилия в новом универсальном проекте, названном livepatch, особенность которого — возможность использования патчей обоих типов. Разработки kpatch и kGraft фактически забросили, в Git ядра Linux последние изменения зафиксированы полгода назад. Сам livepatch при этом предоставляет лишь базовый интерфейс для регистрации и активации патчей в ядре и реализован в форме управляющего модуля

По аналогии с другими проектами в livepatch есть замены функций в ядре целиком и перенаправления на новую функцию при помощи штатной подсистемы ftrace. Патч оформляется в виде модуля ядра, который выполняет необходимую подстановку кода функций. Из областей, которые еще требуют доработки, отмечается обеспечение целостности системы при применении патча. Для работы livepatch потребуется ядро версии 4.4 и выше (поэтому старые дистрибутивы не поддерживаются).

В октябре этого года технология livepatches стала официально доступной пользователям Ubuntu , обеспечивая установку патчей Ubuntu Security Notices (USN) и CVE. Пока только для x86_64, но в будущем планируется внедрить поддержку POWER8, s390x и ARM64. x86-системы непопулярны на серверах и не получат такой возможности, как и релизы без долгосрочной поддержки тоже не смогут работать с livepatch, поскольку они тестовые и не ориентированы на бесперебойно работающие системы. Обычные пользователи без платной подписки UA могут получать обновления только на три компьютера. Однако стоит учесть, что патчи будут тестироваться в первую очередь как раз на тех, кто получил обновления бесплатно, а пользователи с платной техподдержкой получат обновления только после тщательного тестирования.

Исходный код модулей livepatch доступен на , код клиента canonical-livepatch — коммерческое ПО и часть продукта по управлению системами Landscape. Использование livepatch в Ubuntu выглядит очень простым. Регистрируемся на и получаем токен.

...и kGraft + kpatch

Для использования livepatch в Ubuntu необходимо зарегистрироваться

Устанавливаем snap-пакет:

$ sudo snap install canonical-livepatch

Включаем livepatch:

$ sudo canonical-livepatch enable 043eca…….560b04da3

Это все. Теперь демон будет каждые четыре часа проверять наличие обновлений и устанавливать. Статус можно посмотреть, введя

$ sudo canonical-livepatch status —verbose

Чтобы временно отключить canonical-livepatch, достаточно просто запретить установку новых модулей:

...и kGraft + kpatch

$ echo 1 | sudo tee /proc/sys/kernel/modules_disabledИспользование canonical-livepatch