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


14

Я завантажив зображення Raspbian на цю сторінку . Я намагаюся скласти ядро, яке можна використовувати для завантаження зображення в межах qemu.

Я завантажив джерело ядра Linux з kernel.org і побіг:

make versatile_defconfig
make menuconfig

Потім я додав наступні функції до ядра:

  • Підтримка PCI (CONFIG_PCI)
  • Підтримка пристроїв SCSI (CONFIG_SCSI)
  • Підтримка диска SCSI (CONFIG_BLK_DEV_SD)
  • SYM53C8XX Версія 2 Підтримка SCSI (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/emulating-raspbian-using-qemu , чи -cpu arm1176допомагає?
Жил 'SO- перестань бути злим'

1
Хммм. Може спробувати ланцюжок з інструментами armel? (Для фактичної програми, яка продовжує працювати, а не лише для ретрансляції. Ви можете використовувати busbox - схопіть статичний бінарний файл busbox з debian armel.)
"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/

Удачі


1

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

Я хотів використовувати зображення Ubuntu 16.04 raspi3 з QEMU. Завантажили його, витягли його, встановили завантажувальний розділ, отримали файл vmlinuz та файл initrd, і ... qemu-system-arm -M blabla -cpu ... -kernel ... не працює. Чорний екран.

Тоді використання kernel-qemu-4.4.34-jessie звідси із зображенням xenial / rootfs призвело до тієї ж проблеми, що у вас "init kill".

Але оскільки я використовую добре відоме ядро, і оскільки ваша проста статично пов'язана програма C працює, ймовірно, проблема виникає лише тоді, коли використовується динамічний лінкер. (І лінкер не є особливо чутливим до ядер, тому що ld-2,24 з останнього розповсюдження на основі debian9 (стретч) працює чудово на ядрі 4.4.4 debian8 (jessie).)

Навіть після копіювання файлів, які працюють на / із зображенням "jessie", на зображення xbual ubuntu, у мене з’явилася лише дивна помилка "виклику": KE ".

О, і кожен, хто дивиться на компіляцію ядра для Raspberry Pi, повинен перевірити цей сайт, де безпосередньо посилаються на " офіційні " документи / хау.


0

Ядро Linux більше не працює в init, а замість нього працює systemd, що є як init, але трохи більш вдосконалені функції та додаткові багатозадачні можливості, хоча проти філософії Unix systemd корисно.


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