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

カーネルが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プログラムをコンパイルし、Worksを介してそのパスをカーネルに渡すと、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()

答え1

また、安定した成功なしにQEMUを使用してARMイメージを起動しようとしました。残念ながら、ARM OSで作業するには、実際のハードウェアを使用する必要があります。または、開発者がより安定したARM用のエミュレータを作成するまで、忍耐を持って待つ必要があります。

もう2018年12月なのにqemu-system-arm..

新しくインストールされたUbuntu 18 Bionicを使用してQEMUエミュレータからRaspbian Jessieを起動できましたが、作業に十分安定していないため、実際のハードウェアに任せる必要がありました。凍結することが多いです。

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

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

幸運を祈る

答え2

私はこれが少し古い質問であることを知っていますが、まだQEMUを使ってRaspberry Pi画像をテストするのに良い答えはありません。いくつかの答えを提供できるようにしてください。

使いたいUbuntu 16.04 raspi3 イメージQEMUで。ダウンロードして解凍し、ブートパーティションをマウントし、vmlinuzファイルとinitrdファイルをインポートしてから... qemu-system-arm -M blabla -cpu... -kernel...が機能しません。黒い画面。

次に、以下でkernel-qemu-4.4.34-jessieを使用します。ここxenial image / rootfsを使用すると、あなたと同じ「initが終了しました」という問題が発生しました。

しかし、私は既知の良いカーネルを使用しており、単純な静的にリンクされたCプログラムが動作するので、問題はおそらく動的リンカーを使用している場合にのみ発生します。 (リンカーはカーネルに特に敏感ではありません。最新のdebian9(stretch)ベースのld-2.24は4.4 debian8(jessie)ベースのカーネルでうまく動作するためです。)

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

ああ、そしてRaspberry Pi用のカーネルをコンパイルしたい人はこれをチェックする必要があります。これ「を直接引用するウェブサイト公式「文書/方法。

答え3

正しいクロスコンパイラを使用していますか?

私の場合は、以下のリンクをたどり、それを使用したときに終了コード0x00000004と同じエラーが発生しました。ARM-Linux-gnueabihf-(つまり、ハード浮動小数点)gccコンパイラ。

https://www.zachpfeffer.com/single-post/Build-the-Linux-kernel-and-Busybox-and-run-on-QEMU

すべてを再コンパイルするときARM-Linux-gnueabi-、カーネルが正常に起動します。これが問題を解決していることを確認してください。

答え4

Linuxカーネルはもはやinitを実行しません。代わりにinitに似ていますが、より高度な機能と追加のマルチタスク機能を備えたsystemdを実行します。 UNIXの哲学とは異なり、systemdは非常に便利です。

関連情報