Linux(カーネル3.10)を実行し、ストレージ用のNANDメモリを備えた組み込みARMデバイスに取り組んでいます。独自のパーティションに常駐し、メインファームウェアの更新を実行する最小限のLinuxを構築しようとしています。
カーネルは、ramfsに格納されている非常に最小限のルートfsを使用します。ただし、起動できません。次のエラーが発生します。
[ 0.794113] List of all partitions:
[ 0.797600] 1f00 128 mtdblock0 (driver?)
[ 0.802669] 1f01 1280 mtdblock1 (driver?)
[ 0.807697] 1f02 1280 mtdblock2 (driver?)
[ 0.812735] 1f03 8192 mtdblock3 (driver?)
[ 0.817761] 1f04 8192 mtdblock4 (driver?)
[ 0.822794] 1f05 8192 mtdblock5 (driver?)
[ 0.827820] 1f06 82944 mtdblock6 (driver?)
[ 0.832850] 1f07 82944 mtdblock7 (driver?)
[ 0.837876] 1f08 12288 mtdblock8 (driver?)
[ 0.842906] 1f09 49152 mtdblock9 (driver?)
[ 0.847928] No filesystem could mount root, tried: squashfs
[ 0.853569] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
[ 0.861806] CPU: 0 PID: 1 Comm: swapper Not tainted 3.10.73 #11
[ 0.867732] [<800133ec>] (unwind_backtrace+0x0/0x12c) from [<80011a50>] (show_stack+0x10/0x14)
(...etc)
ルートfsは、以下を使用してビルドプロセスによってビルドされます(わかりやすくするために簡略化されています)。
# [Copy some things to $(ROOTFS_OUT_DIR)/mini_rootfs]
cd $(ROOTFS_OUT_DIR)/mini_rootfs && find . | cpio --quiet -o -H newc > $(ROOTFS_OUT_DIR)/backup.cpio
gzip -f -9 $(ROOTFS_OUT_DIR)/backup.cpio
これにより、$(ROOTFS_OUT_DIR)/backup.cpio.gzが作成されます
次に、カーネルは次のように構築されます。
@$(MAKE) -C $(LINUX_SRC_DIR) O=$(LINUX_OUT_DIR) \
CONFIG_INITRAMFS_SOURCE="$(ROOTFS_OUT_DIR)/backup.cpio.gz" \
CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0
これは、メインファームウェア(他の場所で構築されたもの)と同じ構成を使用するが、CONFIG_INITRAMFS_SOURCEを使用して最小限のramfsイメージを提供することを意味すると思います。
よりKernel.Org、ramfsは常にとにかく構築され、そしてCONFIG_INITRAMFS_SOURCEは使用にあらかじめ用意されたルートファイルシステムを指定するために必要なものをすべてです。ramfsの作成に問題があることを示すビルドエラーはなく、結果のカーネルのサイズはほぼ適切に見えます。backup.cpio.gzは約3.6MBです。最終的なzImageは6.1MBです。イメージは、サイズが8MBのパーティションに書き込まれます。
このイメージを使用するために、(カスタム)ブートローダーが使用するいくつかのフラグを設定して、最小パーティションから起動するように指示します。また、カーネルに別のコマンドラインを設定します。起動に使用するコマンドラインは次のとおりです。
console=ttyS0 rootfs=ramfs root=/dev/ram rw rdinit=/linuxrc mem=220M
最小ルートfsには「/ linuxrc」が含まれていることに注意してください。これは実際には/ bin / busyboxへのリンクです。
lrwxrwxrwx 1 root root 11 Nov 5 2015 linuxrc -> bin/busybox
なぜこれが起動しないのですか?なぜ「squashfs」ファイルシステムを試しているのですか?これは間違っていますか?
解決しました!(カスタム)ビルドシステムで使用されるファイル名が更新の一部として変更されたため、正しいカーネルイメージがファームウェアパッケージに配置されていなかったことが判明しました。私は実際に「rootfs = ramfs」パラメータを使用して間違ったカーネルを起動しようとしていました。これにはramfsがありませんでした。
したがって、今後の参照のために、「rootfs = ramfs」を指定したが、カーネルが組み込みのrootfsで構築されていない場合にこのエラーが発生します(CONFIG_INITRAMFS_SOURCE = ...指定なし)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加