Почему ядро ​​не может запустить init?

14

Я скачал изображение Распбиана на этой странице . Я пытаюсь скомпилировать ядро, которое можно использовать для загрузки образа в qemu.

Я скачал исходный код ядра Linux с kernel.org и запустил:

make versatile_defconfig
make menuconfig

Затем я добавил следующие функции в ядро:

  • Поддержка PCI (CONFIG_PCI)
  • Поддержка устройств SCSI (CONFIG_SCSI)
  • Поддержка дисков SCSI (CONFIG_BLK_DEV_SD)
  • Поддержка SCSI SYM53C8XX версии 2 (CONFIG_SCSI_SYM53C8XX_2)
  • Расширенная 3 (ext3) файловая система (CONFIG_EXT3_FS)
  • Расширенная 4 (ext4) файловая система (CONFIG_EXT4_FS)

Я также замонтировал образ диска и:

  • закомментировал /etc/ld.so.preload
  • приспособлен /etc/fstabдля использования /dev/sda1и/dev/sda2

Затем я размонтировал образ и попытался запустить машину с:

qemu-system-arm \
    -M versatilepb \
    -m 256 \
    -kernel linux-4.3/arch/arm/boot/zImage \
    -hda 2015-09-24-raspbian-jessie.img \
    -serial stdio \
    -append "root=/dev/sda2 rootfstype=ext4 rw console=ttyAMA0"

Ядро смогло смонтировать файловую систему, но сразу столкнулось с некоторыми проблемами:

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

CPU: 0 PID: 1 Comm: init Not tainted 4.3.0 #1
Hardware name: ARM-Versatile PB
[<c001b5c0>] (unwind_backtrace) from [<c0017e18>] (show_stack+0x10/0x14)
[<c0017e18>] (show_stack) from [<c0069860>] (panic+0x84/0x1ec)
[<c0069860>] (panic) from [<c0025b98>] (do_exit+0x81c/0x850)
[<c0025b98>] (do_exit) from [<c0025c5c>] (do_group_exit+0x3c/0xb8)
[<c0025c5c>] (do_group_exit) from [<c002dfcc>] (get_signal+0x14c/0x59c)
[<c002dfcc>] (get_signal) from [<c001bf28>] (do_signal+0x84/0x3a0)
[<c001bf28>] (do_signal) from [<c0017a94>] (do_work_pending+0xb8/0xc8)
[<c0017a94>] (do_work_pending) from [<c0014f30>] (slow_work_pending+0xc/0x20)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

Сначала я задавался вопросом, не связано ли это с SELinux. Я попытался загрузить ядро ​​с:

selinux=0 enforcing=0

... но это не имело никакого значения.

Что я делаю неправильно? И что означает эта ошибка?

Обновления

Я также попробовал следующее, но не повезло:

  • Я попытался скомпилировать с CONFIG_VFPвключенным и без
  • Я добавил CONFIG_DEVTMPFSиCONFIG_DEVTMPFS_MOUNT
  • Применяя этот патч и позволяет CPU_V6, CONFIG_MMC_BCM2835, &CONFIG_MMC_BCM2835_DMA
  • Использование gcc-linaro-arm-linux-gnueabihf-raspbianцепочки инструментов
  • Компиляция простой программы на C с помощью цепочки инструментов и последующая передача ее пути к ядру с помощью init=работ - наводит меня на мысль, что существует несоответствие между двоичными форматами

    • file <sample program>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.26, BuildID[sha1]=e5ec8884499c51b248df60aedddfc9acf72cdbd4, not stripped
      
    • file <file from the image>:

      ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3e92423821f3325f8cb0ec5d918a7a1c76bbd72c, stripped`
      
    • разница заголовка ELF

Я скомпилировал эту простую программу на C с помощью набора инструментов:

<path>/arm-linux-gnueabihf-gcc --static simple.c -o simple

... и скопировал его /rootв образ, изменив init=параметр загрузки на /root/simple. Это дает мне следующее при загрузке:

Starting bash...
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000004

Кажется, задыхается от execv()звонка.

Натан Осман
источник
3
Я бы сказал, что это проблема жесткой поддержки с плавающей запятой. У вас есть CONFIG_VFP = y?
Александр Беллони
@AlexandreBelloni cat .config | grep CONFIG_VFPуступает CONFIG_VFP=y- похоже, он включен.
Натан Осман
@AlexandreBelloni Я попробовал ядро ​​с и без, CONFIG_VFPи это не имеет значения.
Натан Осман
1
Я думаю, что Александр на правильном пути, но VFP не является проблематичным. versatilepbэто процессор ARM926, который старше, чем ARM1176 RPi, поэтому двоичные файлы Raspbian могут использовать другие функции, которые не эмулируются. С unixmen.com/emulation-raspbian-using-qemu , -cpu arm1176помогает?
Жиль "ТАК - перестань быть злым"
1
Хммм. Может быть, попробовать Armel Toolchain? (Для действующей программы, которая продолжает работать, а не только для заглушки реле. Вы можете использовать busybox - получить двоичный файл busybox-static из debian armel.)
Gilles 'SO- перестань быть злым'

Ответы:

1

Я также попытался загрузить изображения ARM с QEMU, но безуспешно. Мне жаль говорить, что вам придется использовать настоящее оборудование для работы с ОС ARM или терпеливо ждать, пока разработчики сделают более надежный эмулятор для ARM.

Его декабрь 2018 года, и все еще есть проблемы с qemu-system-arm.

Я смог загрузить Raspbian Jessie на эмуляторе QEMU, используя только что установленный Ubuntu 18 Bionic, однако он не был стабильным для моей работы, поэтому мне пришлось оставить его для реального оборудования. Это будет часто замерзать.

qemu-system-arm не работал на моей ОС, поэтому я использовал Virtualbox для установки Ubuntu Bionic, а внутри Bionic я установил Raspbian с QEMU.

Я следовал этому руководству: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

Удачи

Ascari Gh
источник
1

Я знаю , что это несколько лет вопрос, но так как есть еще нет хороших ответов для тестирования Raspberry Pi изображений с QEMU, позвольте мне внести частичный ответ.

Я хотел использовать образ Ubuntu 16.04 raspi3 с QEMU. Скачал, распаковал, смонтировал загрузочный раздел, получил файл vmlinuz и файл initrd, и ... qemu-system-arm -M blabla -cpu ... -kernel ... не работает. Черный экран.

Затем , используя ядро-4.4.34 для QEMU-Jessie из здесь с изображением / дружественный корневой файловой системы привели к тому же «INIT убит» проблема у вас есть.

Но так как я использую известное хорошее ядро, и поскольку ваша простая статически связанная программа на C работает, вероятно, проблема возникает только тогда, когда используется динамический компоновщик. (И компоновщик не особенно чувствителен к ядрам, потому что ld-2.24 из последнего raspbian на основе debian9 (stretch) отлично работает на ядре 4.4 debian8 (jessie).)

Даже после копирования файлов, которые работают с / с изображением "jessie" в образе ubuntu xenial, я получил только странную ошибку "call preinit: KE".

Да, и любой, кто ищет компиляцию ядра для Raspberry Pi, должен посетить этот сайт, который напрямую ссылается на « официальные » документы / инструкции.

PAStheLoD
источник
0

Ядро linux больше не запускает init, вместо этого он запускает systemd, который похож на init, но немного более продвинутые функции и дополнительные возможности многозадачности, хотя против философии unix полезна systemd.

Касим
источник
не уверен, если это знать, как быть
Касим