сборка образа ядра (.img), включая ramdisk

12

Я собрал ядро ​​Linux (3.0.1) для Raspberry Pi, выполнив следующие шаги:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

У меня вопрос, как я могу собрать kernel.img? Я думаю, что он содержит zImage + ramdisk, но как я могу это построить?

Кто-нибудь может подсказать мне сделать ramdisk и упаковать их в файл kernel.img? Я хочу загрузить это ядро ​​на моем Raspberry Pi.

Шантану Банерджи
источник
Это отличный вопрос, который я удивлен, еще не задан.
Jivings
Почему вы используете ядро ​​3.0.1? Это ванильное ядро ​​найдено на kernel.orgсайте?
Кшиштоф Адамски
да, я нашел это на kernel.org
Шантану Банерджи
Я добавил новый вопрос о qemu и кросс-скомпилированном ядре raspberry pi-2 с busybox в initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4

Ответы:

8

файл 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):

  1. Скачайте официальный набор инструментов для создания своего. Более того, я предполагаю, что он установлен в /usr/bin/arm-linux-gnueabi-*. Если у вас есть это в другом месте, вы должны изменить CROSS_COMPILEопцию во всех ваших makeкомандах.

  2. Перейдите на 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
      
  3. Используйте конфигурацию по умолчанию, предоставляемую фундаментом:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Запустите make oldconfigи ответьте на несколько вопросов (все будет в порядке, нажмите «Ввод» в каждом вопросе, оставляя ответ по умолчанию):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Скомпилируйте ядро:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Скопируйте модули ядра в /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Использовать Imageфайл какkernel.img

  8. Загрузите все модули из /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 этапа:

  1. Попробуйте собрать и загрузить ядро ​​без initramfsфайла.
  2. Попробуйте добавить готовый initramfsконтент в ваше ядро.
  3. Измените этот initramfsконтент в соответствии с вашими потребностями.
Кшиштоф Адамски
источник
1
Отлично пишите, но вы не должны использовать zip; gitэффективно передает файлы, и вы можете использовать, depth=1чтобы предотвратить загрузку истории (я думаю).
Алекс Чемберлен
Да, это правда, но попытка сделать это на самом RaspberryPi не очень хорошая идея. С другой стороны, загрузка zip работает отлично. Я добавлю короткую заметку об использовании git тоже.
Кшиштоф Адамски
Сборка ядра на Raspberry Pi сама по себе ужасная идея.
Алекс Чемберлен
@AlexChamberlain: Это действительно медленно, но определенно возможно (я сделал это сам). Это займет одну ночь, так что это не так уж и плохо. Кроме этого, почему это так ужасно?
Кшиштоф Адамски
если я использую bcmrpi_emergency_defconfig, он будет содержать initramfs ??
Шантану Банерджи
0

Если вы используете одну и ту же версию Debian на обеих, используя X-Apt, dpkg-cross и т. Д., И инструменты emdebian могут работать очень хорошо.

Источник: используется для разработки приложений на c ++ для встроенных систем ARM, работающих под управлением emdebian.

Джеймс Беннет
источник