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


14

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

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

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_V6CONFIG_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

...そして/rootinit=ブートパラメータをに変更して、イメージ内にコピーします/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 CPUであり、RPiのARM1176よりも古いため、Raspbianバイナリはエミュレートされていない他の機能を使用している可能性があります。unixmen.com/emulating-raspbian-using-qemuから、-cpu arm1176助けてくれますか?
ジル 'SO-悪である停止'

1
うーん。たぶんarmelツールチェーンを試してみませんか?(だけではなく、リレースタブのために、実行され続ける実際のプログラムのためにあなたはbusyboxの使用することができます- 。グラブDebianのはarmelからのbusybox-静的なバイナリを)
ジル「SO-停止されて悪」

回答:


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内にRaspbianとQEMUをインストールしました。

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

幸運を


1

それはやや高齢の質問であることは知っていますが、QEMUでRaspberry Piイメージをテストするための良い答えはまだないので、部分的な答えを投稿させてください。

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

その後からカーネルのqemu-4.4.34-ジェシーを使用して、ここで同じにつながっxenial画像/ rootfsのをあなたは持っている問題を「initは殺されました」。

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

「jessie」画像で機能するファイルをubuntu xenial画像にコピーした後でも、奇妙な「calling preinit:KE」エラーが発生しました。

ああ、Raspberry Pi用のカーネルのコンパイルを検討している人は、このサイトをチェックしてください。このサイトは、「公式」のdocs / howto を直接参照しています。


0

Linuxカーネルはinitを実行しなくなりました。代わりに、initに似たsystemdを実行しますが、unixの哲学に対してはsystemdが便利ですが、もう少し高度な機能と追加のマルチタスク機能があります。


これがどのように知られているかわからない
カシム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.