2015-03-24 11 views
1

Я пытаюсь создать базовую корневую файловую систему с помощью Buildroot для встроенной системы (Banana PI D1).Не удалось выполнить/init

Я использую ядро ​​из SDK supplied by the SoC vendor. Из этого репо я использую только ядро, найденное в src/kernel.

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

Я сконфигурировал его для создания файловой системы как initramfs, встроенной в zImage.

Ядро появляется, чтобы начать правильно, но не может загрузить инициализации, а затем паники:

Booting Linux on physical CPU 0 
Linux version 3.4.35 ([email protected]) (gcc version 4.8.4 (Buildroot 2015.02)) #7 Sat Mar 21 22:59:18 AEDT 2015 
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177 
... 
Kernel command line: root=/dev/mtdblock1 ro init=/sbin/init mem=64M console=ttySAK0,115200 
... 
Freeing init memory: 4632K 
Failed to execute /init 
Failed to execute /sbin/init. Attempting defaults... 
mmc0: host does not support reading read-only switch. assuming write-enable. 
mmc0: new SDHC card at address 0007 
mmcblk0: mmc0:0007 SD08G 7.42 GiB 
mmcblk0: p1 
Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance. 

Я пытался несколько шагов по устранению неполадок:

  1. Я построил корневую файловую систему используя this miniroot project (сделал некоторые действия, поскольку он совсем устарел). Он загрузился нормально, используя то же ядро, которое я пытаюсь использовать с корнем buildroot.

  2. Я попытался использовать как uClibc и eglibc

  3. Я попытался с помощью Buildroot собственных кросс-инструментов, а также кросс-инструменты, поставляемые SoC поставщика

  4. Я подтвердил, что встроенный корневые файловая система действительно включают/инициализации (это делает!)

Существует сущность here содержащей конфигурацию Buildroot, копию журнала загрузки ядра, а также перечень содержимого родов ted файловой системы.

Какие шаги можно предпринять для устранения этой проблемы?

Update:

  1. Сформированный rootfs.cpio.gz весит 2139200 байт. Я прочитал, что максимальный размер initramfs вы можете использовать, но я не смог найти, где документирован жесткий лимит.

  2. Я приложил список созданной корневой файловой системы к gist, указанному выше.

  3. Я распаковал rootfs на хосте и осмотрел его./init содержит следующее:

    #!/bin/sh 
    # devtmpfs does not get automounted for initramfs 
    /bin/mount -t devtmpfs devtmpfs /dev 
    exec 0</dev/console 
    exec 1>/dev/console 
    exec 2>/dev/console 
    exec /sbin/init $* 
    

    /sbin/init символическая ссылка на/bin/busybox.

    /бен/BusyBox динамически связаны между собой:

    $ file busybox 
    busybox: setuid ELF 32-bit MSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped 
    $ ../../../host/usr/bin/armeb-buildroot-linux-gnueabi-readelf -a busybox | grep "Shared library:" 
    0x00000001 (NEEDED)      Shared library: [libc.so.6] 
    

    libc.so.6 присутствует в/Lib./lib32 символическая ссылка на/lib для хорошей меры.

  4. Устройство имеет 64M RAM.

  5. Оба Поперечные инструменты поставщика и поперечные Buildroot инструменты созданы для EABI

+0

Ваш вопрос не ясен. Вы хотите, чтобы buildroot создавал файл инициализации или вы хотите иметь запущенную систему? –

+0

поставьте 'ignore_loglevel' в свою командную строку ядра и загрузите. Это может показаться немного больше. – 0andriy

+0

Если у вас есть рабочий qemu для вашей целевой архитектуры (или какой-либо другой механизм удаленной отладки - JTAG?), Вы можете использовать это, чтобы прикрепить отладчик к ядру и посмотреть, что происходит близко. Оверкилл иногда, конечно, но перебор не всегда является плохим. –

ответ

2

Как было предложено @sawdust, проблема заключалась в том, что процессор не должен был быть запущен в режиме большой Endian.

После изменения цели на «ARM (Little Endian)», очистка и восстановление, он теперь корректно загружается.

В ретроспективе это должно быть очевидно - инспектирование образ ядра вендора:

$ file zImage 
zImage: Linux kernel ARM boot executable zImage (little-endian) 
Смежные вопросы