Kmorph для Linux: резервное ядро берёт управление после сбоя примерно за секунду, без перезагрузки
Разработчик Linux Cong Wang представил экспериментальный Kmorph: заранее запущенное второе ядро принимает управление после сбоя без перезагрузки и ставит плановые обновления ядра.

Разработчик Linux Cong Wang представил Kmorph — экспериментальный инструмент, в котором заранее запущенное второе ядро принимает управление системой после сбоя, не перезагружая машину, сообщает lomazoma.com. lomazoma.com
lomazoma.comlomazoma.comОткрыть источник ↗ По словам Wang, от обнаружения ошибки до работающего преемника проходит около одной секунды. В тестах подготовленный сервис Nginx снова отвечал на запросы в течение двух секунд после сбоя ядра. Kmorph требует ядра с расширениями multikernel и пока поддерживает x86-64 и ARM64.
Как происходит передача управления
Расширения multikernel позволяют запускать несколько ядер Linux параллельно на одной машине, у каждого свои процессоры, области памяти и устройства, гипервизор не нужен. Kmorph заранее запускает резервное ядро на нескольких свободно настраиваемых процессорах и части памяти. Работающий там демон следит за прежним ядром через vsock.
Если ответы несколько раз подряд не приходят, начинается передача управления. Сначала преемник останавливает процессоры прежнего ядра и подтверждает, что они действительно остановлены: так оба ядра не обращаются к одним и тем же ресурсам. Если процессор не удаётся надёжно остановить, преемник не продолжает. Затем он принимает устройства, по возможности сбрасывает их, восстанавливает сетевую конфигурацию и подключает остальные процессоры и память через hotplug.
По желанию Kmorph записывает совместимый с kdump файл vmcore с содержимым памяти, регистрами процессоров и VMCOREINFO упавшего ядра. В отличие от обычного kdump, после сбоя не нужно загружать отдельное ядро для снятия дампа. lomazoma.com
lomazoma.comlomazoma.comОткрыть источник ↗
Процессы прежнего ядра не продолжаются, поэтому пользовательское пространство обычно перезапускается. Выбранные сервисы можно вместо этого запустить в резервном ядре, например через standby = nginx.service. Такой сервис занимает порты до сбоя; при передаче управления резервное ядро получает сетевую карту, восстанавливает MAC-адрес, IP-адреса и маршруты и переключается на обычную корневую файловую систему через pivot_root. Остальные сервисы запускает systemd. Полностью непрерывную работу Wang называет целью разработки.
Ограничения и плановое обновление
Сервисы в резервном режиме сначала должны работать без дисков и доступа к сети и не должны записывать состояние, которое нужно сохранить. Сервисы с собственными пространствами имён монтирования, например через PrivateTmp= или ProtectSystem=, после переключения перезапускаются, если только отдельный файл настроек не ослабит их изоляцию.
Команда kmorph upgrade запускает передачу управления намеренно, пока прежнее ядро ещё работает: она заново передаёт сетевую конфигурацию, синхронизирует файловые системы, замораживает записываемые файловые системы на блочных устройствах и просит преемника принять управление. Так можно перейти на более новую версию ядра; дамп сбоя при этом не создаётся. lomazoma.com
lomazoma.comlomazoma.comОткрыть источник ↗
Clement Verna опубликовал на форуме проекта Fedora дополнительную проверку: образ Fedora 45 bootc с ядром multikernel и Kmorph. Записи терминала показывают передачу управления после сбоя, вызванного через SysRq, и переход на новый образ с новой версией ядра. Тест шёл в виртуальной машине KVM с двумя vCPU и 16 GB ОЗУ на машине Graviton3 при отключённом SELinux. В такой сборке возможно лишь одно переключение за загрузку. Verna называет её проверкой концепции и предостерегает от использования в production.



