嵌入式设备上带有 ramfs 的内核恐慌:没有文件系统可以挂载 root
Kernel Panic with ramfs on embedded device: No filesystem could mount root
我正在开发嵌入式 ARM 设备 运行 Linux(内核 3.10),使用 NAND 内存进行存储。我正在尝试构建一个最小的 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 是指定要使用的预制根 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
注意最小根fs包含"/linuxrc",其实是link到/bin/busybox:
lrwxrwxrwx 1 root root 11 Nov 5 2015 linuxrc -> bin/busybox
为什么不启动?为什么要尝试 "squashfs" 文件系统,这是错误的吗?
已解决!结果是(自定义)构建系统使用的文件名作为更新的一部分发生了变化,因此它没有放入正确的内核映像进入固件包。我实际上试图用 "rootfs=ramfs" 参数引导错误的内核,一个没有 ramfs 的内核。
因此,为了将来参考,如果您指定 "rootfs=ramfs" 但您的内核不是使用任何内置的 rootfs 构建的(CONFIG_INITRAMFS_SOURCE=... 未指定)
我正在开发嵌入式 ARM 设备 运行 Linux(内核 3.10),使用 NAND 内存进行存储。我正在尝试构建一个最小的 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 是指定要使用的预制根 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
注意最小根fs包含"/linuxrc",其实是link到/bin/busybox:
lrwxrwxrwx 1 root root 11 Nov 5 2015 linuxrc -> bin/busybox
为什么不启动?为什么要尝试 "squashfs" 文件系统,这是错误的吗?
已解决!结果是(自定义)构建系统使用的文件名作为更新的一部分发生了变化,因此它没有放入正确的内核映像进入固件包。我实际上试图用 "rootfs=ramfs" 参数引导错误的内核,一个没有 ramfs 的内核。
因此,为了将来参考,如果您指定 "rootfs=ramfs" 但您的内核不是使用任何内置的 rootfs 构建的(CONFIG_INITRAMFS_SOURCE=... 未指定)