Kernelcare: патчим ядро «на лету»

Сервер, на котором установлена и надлежащим образом настроена Linux-система, можно не выключать и не перезагружать месяцами. Однако рано или поздно это делать все равно приходится: например, для установки обновлений ядра. Эта процедура зачастую представляет собой отдельную головную боль для системного администратора. Для перезагрузки нужно выбрать время, когда пользовательская активность минимальна. Всем пользователям нужно предварительно разослать письма-предупреждения. Кроме того, всегда есть риск возникновения внештатной ситуации, из-за которой даунтайм серверов может затянуться.

Существуют специальные программные решения, с помощью которых можно устанавливать патчи и обновления ядра без перезагрузок. В качестве примера нужно в первую очередь привести Ksplice — продукт компании Oracle, распространяемый под лицензией GPL v.2. Он поддерживает следующие дистрибутивы Linux: Oracle, Linux, RHEL, Ubuntu (только десктопные версии) и Fedora. В целом Ksplice вполне справляется с возлагаемыми на него задачами, но у него есть один минус: он может работать далеко не со всеми существующими патчами безопасности.

В начале 2014 года разработчики RedHat Enterpise Linux предложили свое решение — Kpatch. Продукт распространяется под лицензией GPL2; его исходный ход размещен на GitHub. К сожалению, на сегодняшний день он находится в крайне «сыром» состоянии и не может быть рекомендован к использованию. То же самое пока что можно сказать и о kGraft — решении, разрабатываемом создателями SUSE.

Совсем недавно наши партнеры из компании CloudLinux (об их главной разработке — одноименной операционной системе — мы уже писали) предложили свой инструмент, с помощью которого можно устанавливать в ядро патчи безопасности и обновления, связанные с критическими ошибками, «на лету», не перезагружая сервер. Он называется KernelCare.

Разработчики CloudLinux внимательно отслеживают все информацию об уязвимостях ядра. Как только обнаруживаются «слабые места» в любом из поддерживаемых ядер, они готовят патч, с помощью которого их можно устранить. Патчи (каждый из них специально «заточен» под ядро конкретного дистрибутива) размещаются на серверах распространения. Агент KernelCare, установленный на клиентском сервере, периодически связывается с серверами распространения, загружает и устанавливает все новые патчи. Все это происходит в фоновом режиме; сервер перезагружать не нужно.
Первые статьи-анонсы о KernelCare появились в Интернете в начале 2014 года. Начиная с текущего месяца продукт распростраеняется только по платной подписке, но любой желающий может бесплатно установить тестовую версию. Срок действия тестовой лицензии составляет 15 дней.

В настоящее время поддерживаются следующие дистрибутивы Linux (KernelCare работает только с 64-битными ОС):

  • RedHat 6.x;
  • CentOS 6.x;
  • CloudLinux 6.x.

С апреля этого года поддерживаются и ядра OpenVZ. К июлю запланировано реализовать поддержку Debian и Ubuntu.

Тестируем KernelCare

/Тестирование было проведено на ОС CentOS 6/

Установим тестовую версию kernelcare при помощи следующей команды:

# rpm -i http://patches.kernelcare.com/kernelcare-latest.el6.x86_64.rpm

Сразу же после установки KernelCare автоматически загружает и применяет необходимые обновления. После этого на консоль выводится сообщение вида:

Downloading updates
Patch Level 9 applied
Kernel is safe

Просмотреть список примененных патчей можно при помощи команды:

# /usr/bin/kcarectl --info

kpatch-state: patch is applied
kpatch-for: Linux version 2.6.32-358.23.2.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Wed Oct 16 18:37:12 UTC 2013
kpatch-build-time: Mon May 12 23:50:58 2014
kpatch-description: 9

С подробной информацией обо всем, что делает KernelCare, можно также с помощью команды dmesg:

# dmesg|grep 'kcare'

kcare: registered device with node 10:57
kcare: allocated 278112 bytes for patch at ffffc900005c4000
kcare: verifying patch...
kcare: verified successfully
kcare: allocating memory in module space...
kcare: allocated 278112 bytes at ffffffffa0207000
kcare: 865 relocations to fixup...
kcare: fixed 865 relocations
kcare: jumping to ffffffffa020d9a0
kcare: registered device with node 10:57
kcare: allocated 278112 bytes for patch at ffffc900005c4000
kcare: verifying patch...
kcare: verified successfully
kcare: allocating memory in module space...
kcare: allocated 278112 bytes at ffffffffa0207000
kcare: 865 relocations to fixup...
kcare: fixed 865 relocations

KernelCare проводит проверку на наличие новых патчей каждые 4 часа. Все патчи загружаются и применяются автоматически. Автоматическое обновление можно отключить. Для этого нужно открыть конфигурационный файл /etc/sysconfig/kcare. Файл содержит один-единственный параметр — AUTO_UPDATE. Его значение следует изменить с True на False:

AUTO_UPDATE = False

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

/usr/bin/kcarectl --update

Updates already downloaded
Patch Level 9 applied
Kernel is safe

Все примененные изменения можно откатить назад с помощью команды:

kcaretl --unload

Updates already downloaded
KernelCare protection disabled, kernel might not be safe

Заключение

KernelCare представляет собой действительно удобный и полезный инструмент. К числу его несомненных достоинств следует отнести:

  • простоту установки и настройки;
  • быстроту загрузки и применения патчей;
  • отсутствие какого-либо влияния на производительность системы;
  • возможность отката внесенных изменений назад.

Разработчики CloudLinux улучшают и совершенствуют продукт, и есть все основания надеяться, что в ближайшее время он получит более широкое распространение и обретет вполне заслуженную популярность среди системных администраторов.