Одна из удобных особенностей *nix-систем — компьютер не нужно перезагружать после установки, удаления и обновления программ. Именно поэтому серверы в сети могут спокойно работать годами, хотя ПO постоянно обновляется администраторами. Единственное исключение из правила представляет обновление ядра ОС: здесь уже без перезагрузки точно не обойтись. Хотя в Linux это уже тоже не обязательно.

 

Проекты

В самой перезагрузке в общем ничего плохого нет. Если это домашний ПК или отдельный VDS, то минута-другая в ночное время вряд ли будет проблемой для пользователей. К тому же некоторые дистрибутивы из коробки поддерживают механизм kexec (появился в Linux с версии 2.6.27), позволяющий загрузить новое ядро из текущего окружения без физической перезагрузки сервера, что обеспечивает минимальный простой.

Другое дело, что во время повальной виртуализации на физическом сервере могут работать десятки виртуальных машин — в этом случае перезагрузка очень даже проблематична. А еще есть системы реального времени, различные симуляторы, работающие месяцами, и многое другое. Обновление ядра Linux на лету для таких систем, критичных ко времени простоя, сегодня очень востребовано, и поэтому неудивительно, что в разное время стартовало несколько проектов, относящихся к классу dynamic software updating: Ksplice от Oracle, KernelCare от CloudLinux, kGraft от SUSE, kpatch от Red Hat и livepatch. Все они похожи по общему принципу работы, но отличаются в деталях реализации.

 

Ksplice

Самый старый проект. Начат приблизительно в 2006 году как магистерская диссертация в MIT одного из пяти разработчиков Джеффа Арнольда (Jeff Arnold). Идея создать технологию, позволяющую безопасно обновлять ОС без перезагрузки, возникла после неудачного обновления серверов MIT, когда процедура готовилась неделю, но в итоге из-за ошибки оказалась проблемной. Проведенный разработчиками анализ патчей безопасности за период с 2005 по 2008 год показал, что в 87% случаев патч только добавлял проверку некоторых параметров, а поэтому такие исправления можно применять без остановки работы. Это и послужило толчком к старту проекта.

Изначально поддерживалась только x86/x64 Linux, но, по заявлениям разработчиков, код написан таким образом, что его очень легко можно перенести на Mac и Win (хотя этого до сих пор никто не сделал). В 2009 году проект привлек внимание инвесторов, получив премию в 100 тысяч долларов. В это же время разработчики организовали компанию Ksplice, Inc.

Ksplice первоначально был ограничен патчами, не использовавшими семантические изменения в структурах данных, что присуще многим (но не всем) патчам безопасности. Сегодня возможно применить Ksplice и при изменении семантики, но в автоматическом режиме генерировать такие патчи невозможно, поскольку это потребует дать Ksplice дополнительные инструкции. А вот четких указаний, как составить такие инструкции, у разработчиков нет, да и для этого требуются специфические знания, поэтому вряд ли сисадмин или пользователь будет этим заниматься. Кроме того, сборку патча нужно производить ровно в таком же окружении, как у используемого ядра. Разные версии GCC генерируют разный код, предсказать, как будет выглядеть бинарный патч в таком случае, невозможно. Именно поэтому разработчики основой технологии считали специальный сервис обновления Ksplice Uptrack, упрощавший все операции, так как все необходимые патчи готовились и проверялись на работоспособность специальной командой.

Первым дистрибутивом, официально поддерживающим технологию, стал Ubuntu, пользователи которого при помощи Ksplice Uptrack могли устанавливать критические обновления ядра в дистрибутиве Ubuntu 9.04 без перезагрузки и остановки работы системы. Позже к ним присоединилась и Fedora Linux, коммерческую поддержку Ksplice получили RHEL, CentOS, CloudLinux, Ubuntu Server и Debian GNU/Linux.

В 2011 году Ksplice, Inc. была выкуплена Oracle, и теперь это основной компонент всех Oracle Linux. Компания сразу закрыла доступ к разработке. Сегодня можно скачать и свободно использовать для своих сборок лишь старую версию 0.9.9.1. Поддержка для RHEL была прекращена, но остался доступным 30-дневный пробный период. С 2015 года бесплатная поддержка доступна для Ubuntu Desktop (а настоящее время 12.04, 14.04, 16.04, 16.10) и Fedora 23 и 24. Чтобы начать работать, достаточно установить пакет с сайта разработчика. Метод получения обновлений не изменялся — они по-прежнему загружаются из стандартных репозиториев Ubuntu, а затем транслируются в представление, подходящее для использования в Ksplice.

Ksplice универсален, так как не требует специальной модификации ядра и теоретически может работать с любым. Необходимо лишь установить пакет, содержащий модуль ядра и пользовательские утилиты, а также оформить файл изменений, который будет спроецирован на работающее ядро. Обновление ядра производится в два этапа. На первом шаге специальная утилита ksplice-create собирает ядро, используя исходные тексты и патч к ядру, и сравнивает получившийся образ со старым ядром. В результате генерируется модуль ядра, содержащий код измененных функций.

Ksplice доступен для подписчиков
Ksplice доступен для подписчиков

Установка обновлений при помощи Ksplice Uptrack в Ubuntu
Установка обновлений при помощи Ksplice Uptrack в Ubuntu

На втором этапе модуль ядра ksplice.ko получает бинарный патч и после анализа необходимых изменений меняет адреса текущих функций ядра на адреса новых функций, указанных в патче, передавая им управление, плюс изменяются данные и структуры в памяти. Для этого на какой-то миг замораживается выполнение всех программ и проверяется, что текущие процессы не используют функции, требующие изменения. Затем выполнение процессов возобновляется. Время заморозки системы зависит от количества изменений, хотя оно все равно измеряется миллисекундами и точно гораздо меньше, чем перезагрузка системы, и главное, что фактически работа сервера и программ не прерывается.

Откат, при необходимости, делается в таком же порядке (утилитой ksplice-undo). Если модуль содержит патч для не загруженного в данный момент объекта, он не делает ничего, информация обновится, как только он будет запущен. Некоторые основные системные функции, постоянно используемые ядром, обновить при помощи Ksplice не получится.

Ksplice изначально позволял применять исправления только к ядру Linux, но новые возможности Ksplice, реализованные в Oracle Linux 7 и чуть позже для 6, позволяют вносить изменения в разделяемые библиотеки без необходимости перезапуска связанных с ними работающих процессов. Применение исправлений также производится на лету и позволяет избавиться от необходимости планового перезапуска длительно работающих приложений. На сегодня user space возможность обновления реализована для glibc и OpenSSL.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Как Apple обходит стандарты, заставляя тебя платить. Колонка Олега Афонина

Иногда сложные вещи начинаются с простых: планшет iPad Pro 10.5 вдруг перестал заряжаться …