ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017)

Материал из 0x1.tv

Докладчик
Денис Силаков.jpg
Денис Силаков

Обновление ядра в Linux сопряжено с перезагрузкой системы, а следовательно — с временной недоступностью ее сервисов. Инструментарий kexec снижает время перехода на новое ядро, однако и при его использовании время недоступности системы может достигать десятков секунд. Для ряда пользователей даже десять секунд — достаточно заметное время простоя, которого хочется избежать. При этом ядро обновлять все-таки необходимо, но часто не для получения каких-то новых возможностей, а для исправления ошибок и уязвимостей. Подобные исправления обычно носят локальный характер и могут быть применены к работающему ядру «на лету» с помощью соответствующих инструментов. Пионером в этой области был ksplice, ныне принадлежащий Oracle, однако в последние годы развиваются полностью открытые альтернативы — kpatch, kGraft и livepatch.

Данный доклад посвящен основанному на kpatch инструментарию ReadyKernel и одноименному сервису, используемым в Virtuozzo для установки критических обновлений клиентам без перезагрузки их систем.

Видео

on youtube


Презентация

ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017).pdf

Thesis

Технология

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

Реализации

Закрытые: Ksplice, KernelCare. Открытые: Kpatch (RHEL), kGraft (SUSE), Livepatch (объединение идей Kpatch и kGraft, добавляется в апстрим начиная с 4.0, используется в Ubuntu).

ReadyKernel — сервис, основанный на kPatch с небольшими изменениями. Штатное средство доставки критических обновлений в ядрах Virtuozzo 7. Опробован также на CentOS, RHEL и Ubuntu. В перспективе рассматривается переход на Livepatch.

Модели целостности

Как выбрать момент для подмены, чтобы не нарушить целостность работающих процессов? Есть несколько моделей целостности:


  • «Никакая» (Livepatch в ядре 4.0) — не делаем никаких проверок.Быстро, работает для одиночных функций.
  • «Clean cut» (Kpatch) — получаем набор активных процессов (в kpatch — через stop_machine), изучаем их стеки вызовов и проверяем — нет ли там целевых функций, которые надо патчить. Недостатком является вызов stop_machine, но эта модель позволяет пропатчить несколько взаимосвязанных функций.
  • «Per-task» (kGraft, Livepatch в ядре 4.12) — реализация принципа RCU (Read-Copy-Update). Для каждого потока поддерживается флаг, индицирующий — старую или новую реализацию функции он должен использовать. Переключение на новую происходит в момент выхода в userspace. Позволяет учитывать рекурсивные вызовы, но не наборы функций.
  • «Hybrid» (Livepatch в будущем) — объединение предыдущих моделей, использующая проверку стека, но для каждого процесса в отдельности.

Подготовка патчей

Патчи оформляются как модули ядра. Подготовка патчей автоматизирована, однако результат требует обязательной проверки человеком.

Использование на практике

Для любого механизма обновления ядра на лету самое главное — своевременная подготовка патчей. Ввиду трудоемкости подготовки, в настоящее время патчи предоставляются только в рамках коммерческих сервисов, появление или исчезновение которых определяется наличием спроса. В частности, сервисы обновления ядра «на лету», основанные на открытых инструментах, предоставляются в рамках подписок Virtuozzo, SUSE и Ubuntu. RedHat предоставляет kPatch в статусе Technical Preview (при этом в RHEL 7.4 вошел kpatch 0.4.0, включивший, помимо прочего, правки от Virtuozzo).

ReadyKernel для Virtuozzo мы считаем коммерчески оправданным — в течение года с момента выпуска Virtuozzo 7 он позволяет нам избегать незапланированных обновлений ядра. SUSE и Ubuntu также начали продвижение своих сервисов относительно недавно, и на данный момент считают их перспективными. В конце концов, востребованность проприетарных Ksplice и KernelCare позволяет надеяться, что в целом подобные сервисы будут пользоваться спросом достаточным для того, чтобы коммерческие компании вкладывались в развитие открытой альтернативы в апстриме.


Примечания и ссылки


Plays:34   Comments:2