web-dev-qa-db-ja.com

カーネルがinitを実行できないのはなぜですか?

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()呼び出しが窒息しているようです。

14
Nathan Osman

ARM QEMUを使用したイメージの起動も試みましたが、信頼できる成功はありませんでした。ARMを使用するには、実際のハードウェアを使用する必要があります= OS、または開発者がARM向けのより信頼性の高いエミュレータを作成するまで辛抱強く待ちます。

2018年12月、まだqemu-system-arm

新しくインストールしたUbuntu 18 Bionicを使用して、QEMUエミュレーターでRaspbian Jessieを起動できましたが、動作が安定していなかったため、実際のハードウェアに残したままにしました。それは頻繁にフリーズします。

qemu-system-armは私のOSでは動作しなかったので、Virtualboxを使用してUbuntu Bionicをインストールし、Bionicの内部にRaspbianをQEMUとともにインストールしました。

私はこのチュートリアルに従いました: https://azeria-labs.com/emulate-raspberry-pi-with-qemu/

幸運を

1
Ascari Gh

少し古い質問であることはわかっていますが、まだQEMUでRaspberry Piイメージをテストするための良い答えはないので、部分的な答えを提供することができます。

buntu 16.04 raspi3 image をQEMUで使用したかった。それをダウンロードし、抽出し、ブートパーティションをマウントし、vmlinuzファイルとinitrdファイルを取得しました... qemu-system-arm -M blabla -cpu ... -kernel ...が機能しません。黒い画面。

次に、xenial image/rootfsで here のkernel-qemu-4.4.34-jessieを使用すると、同じ「init killed」問題が発生しました。

しかし、私は既知の優れたカーネルを使用しているため、静的にリンクされた単純なCプログラムが機能するため、動的リンカーを使用したときにのみ問題が表面化する可能性があります。 (また、最新のdebian9(ストレッチ)ベースのraspbianのld-2.24が4.4 debian8(jessie)ベースのカーネルで正常に動作するため、リンカーはカーネルに特に敏感ではありません。

「jessie」イメージ上で動作するファイルをUbuntuのxenialイメージにコピーした後でも、奇妙な「calling preinit:KE」エラーが発生しました。

おお、そしてRaspberry Piのカーネルのコンパイルを検討している人は、「 official "docs/howtoを直接参照する this サイトを確認する必要があります。

1
PAStheLoD

Linuxカーネルは、代わりにinitを実行しません。代わりに、initのようなsystemdを実行しますが、UNIXの哲学systemdに対しては有用ですが、もう少し高度な機能と追加のマルチタスク機能を備えています。

0
Qasim