GNU/Linux >> Linux の 問題 >  >> Linux

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

このページでRaspbian画像をダウンロードしました。 qemu内でイメージを起動するために使用できるカーネルをコンパイルしようとしています。

Linuxカーネルソースをkernel.orgからダウンロードして実行しました:

make versatile_defconfig
make menuconfig

次に、カーネルに次の機能を追加しました。

  • PCIサポート(CONFIG_PCI)
  • SCSIデバイスのサポート(CONFIG_SCSI)
  • SCSIディスクのサポート(CONFIG_BLK_DEV_SD)
  • SYM53C8XXバージョン2SCSIサポート(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()で窒息しているようです 電話してください。

承認された回答:

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

関連:パス名に特定の順序なしで複数の単語が含まれているファイルを検索しますか?

2018年12月ですが、qemu-system-armにはまだ問題があります 。

新しくインストールしたUbuntu18Bionicを使用してQEMUエミュレーターでRaspbianJessieを起動できましたが、作業が安定していなかったため、実際のハードウェアに任せなければなりませんでした。頻繁にフリーズします。

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

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

頑張ってください


Linux
  1. Linuxカーネルの継続的インテグレーションテスト

  2. カーネルがパケットをドロップするのはなぜですか?

  3. Linux –カーネルメーリングリストに参加していますか?

  1. Linux で Xcode を実行できますか?

  2. Linuxカーネルコードで__initはどういう意味ですか?

  3. Linux カーネルの pr_debug が何も出力しないのはなぜですか?

  1. root ユーザーから Linux カーネルを保護するのはなぜですか?

  2. Linux NFS サーバーがユーザー空間ではなくカーネルに実装されているのはなぜですか?

  3. UserMode Linux (UML) を実行したい理由