International conference of developers
and users of free / open source software

kexecboot - Linux как bootloader

LVEE 2012

Юрий Бушмелев, Ульяновск, Russia

Kexecboot is Linux-as-a-Bootloader implementation. It’s a C program able to scan the partitions on available devices, offering a graphical framebuffer menu and allowing user to select from which one to boot. Typically kexecboot resides together with kexec in an initramfs, embedded in a custom-tailored kernel compiled with support for initramfs and kexec system call. Both binaries are built static, linked against klibc to optimize size. Kexecboot may be linked against other *libc (glibc, eglibc, uclibc) and may be used as standalone binary as well.

Современные загрузчики операционных систем (grub, u-boot), по сути, сами по себе являются своеобразной операционной системой. В них есть драйвера для дисковых контроллеров, для файловых систем, для устройств ввода/вывода. И все это нужно только для того, чтобы загрузить ядро пользовательской операционной системы и передать ему управление. Причем, если на архитектуре PC есть более-менее стандартные интерфейсы BIOS и EFI, то в сфере embedded hardware ситуация куда более плачевная, что приводит к бесчисленным форкам загрузчиков со всеми вытекающими неприятностями.

Kexecboot — это реализация идеи «Linux как bootloader». Сама идея не нова, она появилась в виде ответа разработчиков на вышеописанную ситуацию. Предполагается иметь простой минимальный загрузчик, который умеет только загружать ядро Linux из определенного фиксированного места и передавать ему управление. Дальнейшие действия по инициализации оборудования и работе с периферией выполняет уже само ядро. Для, собственно, загрузки с других носителей применяется системный вызов kexec, который загружает следующее ядро в память и передает ему управление.

Изначально kexecboot был разработан для КПК Sharp Zaurus. Проблема с данными КПК была в том, что под ядро ОС в штатной схеме разметки NAND был выделен раздел размером всего 1.2Mb. Прошло несколько лет и ядро Linux со всеми желаемыми функциями перестало входить в этот лимит. Нужно было либо менять загрузчик, либо придумывать пути обхода. Но с другой стороны, в старых моделях Sharp Zaurus объем NAND был всего 16Mb, что накладывало ограничения и на содержимое «прошивки». Требовался загрузчик, который способен запустить систему с SD или CF-карты. Причем, желательно, с возможностью выбора, откуда и что загружать. Так появился kexecboot.

Сам по себе, kexecboot — это программа, которая сканирует устройства и отображает в виде меню список ядер, которые могут быть загружены. Чтобы элемент появился в списке, должны быть выполнены следующие условия:
- на устройстве находится файловая система, которую kexecboot может идентифицировать, а ядро может смонтировать;
- на файловой системе есть файл конфигурации /boot/boot.cfg, который удалось распарсить, либо на файловой системе есть один из файлов /zImage, /boot/zImage (или uImage).

Также в общем меню присутствует системное меню, где можно запустить повторное сканирование устройств, посмотреть некоторую отладочную информацию, а также перезагрузить или выключить устройство. Меню может быть графическим (framebuffer) или текстовым. На данный момент, выбор может быть произведен только аппаратными клавишами устройства.

После выбора элемента в меню, kexecboot формирует строку запуска для утилиты kexec, чтобы сначала загрузить ядро (kexec -l), а потом передать ему управление (kexec -e).

На параметры загружаемого ядра можно влиять при помощи файла конфигурации. В нем можно задать название и иконку, которые будут отображены в меню, а также путь к ядру и параметры его командной строки.

Кexecboot можно использовать как отдельную программу, так и вместо init в составе initramfs. Во втором случае ядро компонуется вместе с образом initramfs, где находятся необходимые каталоги и два исполнимых файла — kexecboot и kexec. На данный момент нам удается держать размер образа ядра с initramfs в пределах 1Mb. Частично это удается за счет более тонкой настройки конфигурации ядра, частично – за счет использования lzma для сжатия образа.

К сожалению, узким местом при использовании kexecboot остается неработоспособность kexec на многих аппаратных платформах. Тем не менее, на данный момент известно о фактах успешного использования kexecboot на всей линейке КПК Sharp Zaurus, на некоторых моделях КПК iPAQ, на нетбуках Toshiba AC100 и некоторых планшетах Archos. Пакеты для произвольных архитектур можно подготовить с помощью систем сборки OpenEmbedded или OpenWRT.

В будущем планируется добавление альтернативных методов загрузки — switch_root, losetup+switch_root и nfs+switch_root. Это позволит использовать kexecboot даже на системах, где kexec (пока) не работает.

Подробности о проекте можно узнать на сайте kexboot.org

Лицензия Creative Commons
Текст тезисов доступен под лицензией Creative Commons Attribution-ShareAlike 3.0.