Обновление ядра без перезагрузки


В Linux существует два решения, позволяющих свести к минимуму количество аппаратных перезагрузок, — kexec и ksplice. Системный вызов kexec появился в mainline-версии ядра в июне 2005-го. Предназначается он для загрузки нового ядра прямо из существующего. Работает данная технология таким образом:

  • первым делом образ ядра копируется в память;
  • затем этот образ перемещается в динамическую память текущего ядра;
  • наконец, образ копируется на нужные страницы, и ему передается управление.

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

Для практического применения kexec необходимо ядро с включенной опцией (CONFIG_KEXEC=Y) и пакет kexec-tools. Ручная загрузка ядра (в случае с Ubuntu) осуществляется следующими двумя командами:

# kexec -l /vmlinuz --initrd=/initrd.img --reuse-cmdline
# kexec -e

Первая команда грузит ядро в память, а вторая передает ему управление. При этом используется текущая строка параметров ядра. Чтобы использовать свои параметры, задай их в опции –cmdline=””.

В Ubuntu можно также использовать kexec для быстрой перезагрузки — для этого установи параметр LOAD_KEXEC в файле /etc/default/kexec равным true, и после этого все стандартные процедуры перезагрузки будут осуществляться через него.

Конфигурирование kexec в Ubuntu

Ksplice же, по утверждениям его разработчиков, позволяет накладывать патчи безопасности на ядро на лету. При этом все работающие приложения работают по-прежнему, без необходимости их перезапускать. Проект был куплен Oracle, и для RHEL, из-за конкуренции фирм, патчи платные. Это, однако, ничуть не мешает раздавать патчи для Ubuntu. Качаем и устанавливаем пакет (для версии 12.04):

$ wget http://goo.gl/MHAZ6c
$ sudo dpkg -i ./ksplice-uptrack.deb
$ sudo apt-get -f install

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

$ sudo uptrack-upgrade -y

Для удаления же всех патчей используется команда

$ sudo uptrack-remove --all -y

В целом, технология эта работает достаточно стабильно — тот факт, что ее купила Oracle, говорит сам за себя. Тем не менее таким способом можно устанавливать только те заплатки, которые не вносят существенных изменений в структуры ядра.

Просмотр установленных обновлений ksplice