ReadyKernel — инструментарий и сервис обновления ядра без перезагрузки на основе kpatch (Денис Силаков, OSSDEVCONF-2017)
Материал из 0x1.tv
- Докладчик
- Денис Силаков
Обновление ядра в Linux сопряжено с перезагрузкой системы, а следовательно — с временной недоступностью ее сервисов. Инструментарий kexec снижает время перехода на новое ядро, однако и при его использовании время недоступности системы может достигать десятков секунд. Для ряда пользователей даже десять секунд — достаточно заметное время простоя, которого хочется избежать. При этом ядро обновлять все-таки необходимо, но часто не для получения каких-то новых возможностей, а для исправления ошибок и уязвимостей. Подобные исправления обычно носят локальный характер и могут быть применены к работающему ядру «на лету» с помощью соответствующих инструментов. Пионером в этой области был ksplice, ныне принадлежащий Oracle, однако в последние годы развиваются полностью открытые альтернативы — kpatch, kGraft и livepatch.
Данный доклад посвящен основанному на kpatch инструментарию ReadyKernel и одноименному сервису, используемым в Virtuozzo для установки критических обновлений клиентам без перезагрузки их систем.
Содержание
Видео
Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.
Презентация
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:57 Comments:4