2016-09-14 12 views
2

私は、Linux用のARMメモリ(カーネル3.10)とストレージ用のNANDメモリを使っています。私は独自のパーティションに常駐し、メインファームウェアの更新を実行する最小限のLinuxを構築しようとしています。組み込みデバイスでramfsを使用したカーネルパニック:ファイルシステムなしでルートをマウントすることはできません

カーネルは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 

私は、これはそれが同じCONFIを使用することを意味だと思いますgをメインファームウェアとして(他の場所に構築されています)、CONFIG_INITRAMFS_SOURCEを使用して最小ramfsイメージを提供します。

Kernel.Orgから、ramfsは常に作成され、CONFIG_INITRAMFS_SOURCEは、使用する既定のルートfsを指定するために必要なすべてです。 ramfsを作成する際に問題があることを示すビルドエラーはなく、結果として得られるカーネルのサイズは正しいと思われます。 backup.cpio.gzは約3.6 MBです。最終的なzImageは6.1 MBです。イメージは8 MBのサイズのパーティションに書き込まれます。

このイメージを使用するには、最小限のパーティションからブートするように指示する(カスタム)ブートローダによって使用されるフラグをいくつか設定し、カーネルには別のコマンドラインを設定します。ここでは、ブートに使用するコマンドラインです:nimimalルートfsが実際にビン/ busyboxの/へのリンクである "ファイル/ linuxrcを"、含んでいること

console=ttyS0 rootfs=ramfs root=/dev/ram rw rdinit=/linuxrc mem=220M 

注:

lrwxrwxrwx 1 root root 11 Nov 5 2015 linuxrc -> bin/busybox 

なぜdoesnの」このブートは?どうして "squashfs"ファイルシステムを試しているのですか?これは間違っていますか?

+0

PS:私はこれを読んで:http://www.linuxquestions.org/questions/linux-embedded-and-single-board-computer-78/no-filesystem-could-mount-root-873864/、CONFIG_BLK_DEV_INITRD = yとCONFIG_RD_GZIP = yであることを確認しました設定で設定されます。 – Jeremy

+0

コマンドラインで 'rootfs ='を指定する必要はありません。適切に設定されたカーネルは、常に正しく接続されたinitramfsを使用します( 'rootfs ='パラメータは無視します)。 cpioアーカイブはzImageで再び圧縮されるので、圧縮する必要はありません。私は手作業でinitramfsを作り、それをカーネルとマージして以来、ずっとずっと続いています。 Buildrootがあるので、私はこれを使用しています。 – sawdust

+0

@sawdust私はcmdlineパラメータから "rootfs = ramfs"を削除しましたが、同じエラーが表示されます。 – Jeremy

答えて

0

SOLVED!(カスタム)ビルドシステムで使用されるファイル名が更新の一部として変更されたため、正しいカーネルイメージをファームウェアパッケージに入れていないことが判明しました。私は実際にramfsを持たない "rootfs = ramfs"パラメータで間違ったカーネルをブートしようとしていました。

だから、あなたは「rootfsのを=のramfs」を指定した場合、今後の参考のために、このエラーが発生するが、あなたのカーネルが(CONFIG_INITRAMFS_SOURCE = ...指定されていない)に建てられた任意のrootfsので構築されていなかった

関連する問題