файл kernel.img
При использовании ядра Linux kernel.imgфайл просто переименовывается linux/arch/arm/boot/Image. Также должно быть возможно (или, по крайней мере, это было возможно в прошлый раз, когда я проверял) использовать сжатую версию этого файла - zImage. Может содержать встроенный initramfs(ramdisk), но это не обязательно. Например, стандартный kernel.imgфайл не содержит initramfsпока kernel_emergency.img.
Примечание: Официальное руководство по компиляции ядра на вики-сайте eLinux предлагает использовать imagetool-uncompressed.pyинструмент для подготовки kernel.imgфайла. Это было необходимо в первые дни RaspberyPi, но в настоящее время загрузчик может обрабатывать обычные Imageи zImageфайлы.
Проблема с исходниками ядра
Что очень важно, так это то, что при сборке ядра для RaspberryPi вы не можете просто использовать любую его версию. Будет работать только специальная версия, портированная на RaspberryPi. К сожалению, текущая апстрим версия (найденная на kernel.orgсайте) не совместима с RaspberryPi. Кроме того, versatil_configэто не хорошо для RaspberryPi, вы должны использовать bcmrpi_defconfigвместо этого (можно найти в источниках ядра, совместимых с RaspberryPi) или bcmrpi_emergency_defconfigесли вы планируете использовать buildin initramfs.
Инструкции по сборке ядра
Лучшее место для получения исходных текстов ядра для RaspberryPi - это github . Вы также можете найти полезное объяснение того, как его получить и как скомпилировать, на официальной вики RasbperryPi . Вот моя небольшая упрощенная версия описанных шагов (ПРИМЕЧАНИЕ: я предполагаю, что вы хотите кросс-компилировать ядро. Это гораздо быстрее и должно давать те же результаты, но также возможно создание ядра на RaspberryPi):
Скачайте официальный набор инструментов для создания своего. Более того, я предполагаю, что он установлен в /usr/bin/arm-linux-gnueabi-*. Если у вас есть это в другом месте, вы должны изменить CROSS_COMPILEопцию во всех ваших makeкомандах.
Перейдите на https://github.com/raspberrypi/linux сайт, где вы можете найти официальные источники ядра RapsberryPi. Вы можете скачать код двумя способами:
- Как сжатый файл (для использования этой опции вам не нужно устанавливать
gitутилиту, и вы можете сделать это даже на самом RapsberryPi): Нажмите на ZIPиконку, чуть ниже Codeвкладки в верхней части сайта. Это должно позволить вам скачать последние исходные файлы в виде zipфайла. Вместо этого вы можете использовать git, но это (как описано в вики) потребует гораздо больше места и времени. Затем распакуйте файл, чтобы получить исходное дерево.
Использование gitутилиты (у меня это не сработало на RaspberryPi, так как, вероятно, небольшого объема ОЗУ, но на настольных системах должно работать нормально (обратите внимание на --depth 1аргумент, который не позволяет git загружать всю историю разработки (что огромно):
git clone --depth 1 git://github.com/raspberrypi/linux.git
Используйте конфигурацию по умолчанию, предоставляемую фундаментом:
cp arch/arm/configs/bcmrpi_defconfig .config
Запустите make oldconfigи ответьте на несколько вопросов (все будет в порядке, нажмите «Ввод» в каждом вопросе, оставляя ответ по умолчанию):
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
Скомпилируйте ядро:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
Скопируйте модули ядра в /tmp/modules:
make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
Использовать Imageфайл какkernel.img
Загрузите все модули из /tmp/modules/lib/modules/вашего компьютера в /lib/modules/каталог на вашем rootfs RaspberryPi.
Добавление initramfs
Это не дает инструкции о том, как создать initramfs, однако. Поскольку это очень широкая тема (по сути, вам нужно создать рабочую среду пользователя Linux, и нет никаких ограничений на ее сложность), я не буду сейчас останавливаться на этом. Отмечу только, что initramfsможно использовать в двух разных формах - автономной, где это отдельный файл, и в котором он встроен в файл образа ядра (как в kernel_emergency.img). Второй вариант должен поддерживаться загрузчиком RaspberryPi, но ходят слухи, что он не работает в текущей версии прошивки, поэтому вам, вероятно, следует использовать версию buildin.
Лучший способ начать - использовать работающий контент initramfs (который используется для kernel_emergency.img), загрузив его из другого хранилища фундамента github, и только после того, как вы сможете загрузить ядро с помощью этого iniramfsобраза, попробуйте собрать свой собственный. Все, что для этого нужно, - указать на параметр CONFIG_INITRAMFS_SOURCEконфигурации загруженного каталога .
Финальные заметки
Так что вы должны сделать это в 3 этапа:
- Попробуйте собрать и загрузить ядро без
initramfsфайла.
- Попробуйте добавить готовый
initramfsконтент в ваше ядро.
- Измените этот
initramfsконтент в соответствии с вашими потребностями.