3

組み込みシステム ( Banana PI D1 )用に、Buildroot を使用して基本的なルート ファイルシステムを構築しようとしています。

SoC ベンダーが提供する SDK のカーネルを使用しています。このリポジトリから、src/kernel にあるカーネルのみを使用しています。

Buildroot の構成には特筆すべき点はありません。エラーなしでビルドされ、結果として得られるルート ファイルシステムには、期待どおりのものがすべて含まれているように見えます。

ファイルシステムを zImage 内に埋め込まれた initramfs として構築するように構成しました。

カーネルは正しく起動しているように見えますが、init をロードできず、パニックになります。

Booting Linux on physical CPU 0
Linux version 3.4.35 (harmic@penski.harmic.moo.org) (gcc version 4.8.4 (Buildroot 2015.02) ) #7 Sat Mar 21 22:59:18 AEDT 2015
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
...
Kernel command line: root=/dev/mtdblock1 ro init=/sbin/init mem=64M console=ttySAK0,115200
...
Freeing init memory: 4632K
Failed to execute /init
Failed to execute /sbin/init.  Attempting defaults...
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SDHC card at address 0007
mmcblk0: mmc0:0007 SD08G 7.42 GiB 
 mmcblk0: p1
Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.

いくつかのトラブルシューティング手順を試しました。

  1. このミニルート プロジェクトを使用してルート ファイルシステムを構築しました(かなり古くなっているため、多少の作業が必要でした)。buildroot ルート fs で使用しようとしているのと同じカーネルを使用して、正常に起動しました。

  2. uClibc と eglibc の両方を使用してみました

  3. Buildroot 独自のクロスツールと SoC ベンダーが提供するクロスツールを使用してみました

  4. ビルドされた rootfs に /init が含まれていることを確認しました (含まれています!)。

ここには、buildroot 構成、カーネル ブート ログのコピー、および生成されたファイル システムの内容のリストを含む要点があります。

これをさらにトラブルシューティングするには、どのような手順を実行できますか?

アップデート:

  1. 生成された rootfs.cpio.gz の重量は 2139200 バイトです。使用できる initramfs の最大サイズがあることを読みましたが、ハード リミットが文書化されている場所を見つけることができませんでした。

  2. 生成されたルート ファイルシステムのリストを、上記のリンクの要旨に添付しました。

  3. ホストで rootfs を解凍し、検査しました。/init には以下が含まれます。

    #!/bin/sh
    # devtmpfs does not get automounted for initramfs
    /bin/mount -t devtmpfs devtmpfs /dev
    exec 0</dev/console
    exec 1>/dev/console
    exec 2>/dev/console
    exec /sbin/init $*
    

    /sbin/init は、/bin/busybox へのシンボリック リンクです。

    /bin/busybox は動的にリンクされています:

    $ file busybox
    busybox: setuid ELF 32-bit MSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped
    $ ../../../host/usr/bin/armeb-buildroot-linux-gnueabi-readelf -a busybox | grep "Shared library:"
     0x00000001 (NEEDED)                     Shared library: [libc.so.6]
    

    libc.so.6 は /lib にあります。/lib32 は /lib へのシンボリック リンクです。

  4. デバイスには 64M の RAM があります。

  5. ベンダーのクロス ツールと buildroot クロス ツールの両方が eabi 用にセットアップされています。

4

1 に答える 1

3

@sawdust が示唆したように、問題は CPU がビッグ エンディアン モードで実行されることになっていないことでした。

ターゲットを 'ARM (リトル エンディアン)' に変更し、クリーニングして再構築した後、正しく起動するようになりました。

振り返ってみると、これは明らかだったはずです-ベンダーのカーネルイメージを調べます:

$ file zImage
zImage: Linux kernel ARM boot executable zImage (little-endian)
于 2015-03-25T10:43:22.537 に答える