2016-09-14 114 views
2

我正在使用运行Linux(内核3.10)的嵌入式ARM设备,使用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大小的分区。

要使用此映像,我设置了一些由(自定义)引导加载程序使用的标志,告诉它从最小分区引导,并为内核设置不同的命令行。下面是用来启动命令行:

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

注意,nimimal根文件系统包含 “/ linuxrc文件”,这实际上是为/ bin/busybox的链接:

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

为什么没有按”这引导?为什么它尝试“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

已解决!事实证明,(自定义)构建系统使用的文件名已作为更新的一部分进行更改,因此它没有将正确的内核映像放入固件包中。我实际上试图用“rootfs = ramfs”参数引导错误的内核,其中没有ramfs。

所以,以供将来参考,如果您指定“根文件系统= RAMFS”但你的内核没有内置任何根文件系统内置出现此错误(CONFIG_INITRAMFS_SOURCE = ...不指定)

相关问题