побудова зображення ядра (.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.


Це чудове запитання, яке я здивований, його ще не задавали.
Відхилення

Для чого ви використовуєте ядро ​​3.0.1? Чи знайдено це ядро ​​ванілі на kernel.orgсайті?
Кшиштоф Адамський

так, я знайшов це з kernel.org
Шантану Банерджі

Я додав нове запитання про qemu та перекладене ядро ​​малинового пі-2 з малиною для
завантаження

Відповіді:


8

файл kernel.img

При використанні ядра Linux kernel.imgфайл просто перейменований linux/arch/arm/boot/Image. Також має бути можливість (або принаймні це можна було востаннє перевірити) використовувати стиснуту версію цього файлу - zImage. Він може містити інтегрований initramfs(ramdisk), але це не потрібно. Наприклад, kernel.imgфайл акцій не містить initramfsдоки kernel_emergency.img.

Примітка. Офіційний посібник зі збирання ядра на wiki 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/каталог на ваших коренях RaspberryPi.

Додавання initramfs

Однак це не дає інструкцій щодо створення initramfs. Оскільки це дуже широка тема (в основному, ви повинні створити працююче середовище користувальницького простору користувача, а насправді немає обмежень щодо того, наскільки це може бути складно), я зараз не буду висвітлювати це. Зауважу лише, що initramfsйого можна використовувати у двох різних формах - окремій, де це окремий файл та buildin, де він інтегрований з файлом зображення ядра (як у ньому 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.