rootfs image is not initramfs (junk in compressed archive); looks like an initrd

文章描述了在尝试使用cpio格式的initrd启动时遇到的错误,涉及`unpack_to_rootfs`函数的解压失败。问题在于initrd大小与实际大小不匹配导致的。通过添加内核调试信息,发现必须确保initrd大小精确到字节,以避免解压错误引发的Kernelpanic。
摘要由CSDN通过智能技术生成

内核启动cpio格式的initrd显示错误log如下

...

Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (junk in compressed archive); looks like an initrd
Freeing initrd memory: 81920K

...

RAMDISK: Couldn't find valid RAM disk image starting at 0.
List of all partitions:
0100          262144 ram0
 (driver?)
0101          262144 ram1
 (driver?)
0102          262144 ram2
 (driver?)
0103          262144 ram3
 (driver?)
0104          262144 ram4
 (driver?)
0105          262144 ram5
 (driver?)
0106          262144 ram6
 (driver?)
0107          262144 ram7
 (driver?)
0108          262144 ram8
 (driver?)
0109          262144 ram9
 (driver?)
010a          262144 ram10
 (driver?)
010b          262144 ram11
 (driver?)
010c          262144 ram12
 (driver?)
010d          262144 ram13
 (driver?)
010e          262144 ram14
 (driver?)
010f          262144 ram15
 (driver?)
1f00            1024 mtdblock0
 (driver?)
1f01            1024 mtdblock1
 (driver?)
1f02            1024 mtdblock2
 (driver?)
1f03            1024 mtdblock3
 (driver?)
1f04            1024 mtdblock4
 (driver?)
1f05            1024 mtdblock5
 (driver?)
1f06            1024 mtdblock6
 (driver?)
1f07            5120 mtdblock7
 (driver?)
1f08            2048 mtdblock8
 (driver?)
1f09            1024 mtdblock9
 (driver?)
1f0a            1024 mtdblock10
 (driver?)
NOHZ: local_softirq_pending 80
1f0b            1024 mtdblock11
 (driver?)
1f0c            1024 mtdblock12
 (driver?)
1f0d            1024 mtdblock13
 (driver?)
1f0e            1024 mtdblock14
 (driver?)
1f0f            1024 mtdblock15
 (driver?)
1f10            1024 mtdblock16
 (driver?)
1f11            1024 mtdblock17
 (driver?)
1f12            5120 mtdblock18
 (driver?)
1f13            2048 mtdblock19
 (driver?)
1f14            1024 mtdblock20
 (driver?)
1f15            1024 mtdblock21
 (driver?)
1f16             512 mtdblock22
 (driver?)
1f17             512 mtdblock23
 (driver?)
1f18            1024 mtdblock24
 (driver?)
103:00000   78150744 nvme0n1
 (driver?)
  103:00001   15617024 nvme0n1p1 2c947a97-01

  103:00002   46874624 nvme0n1p2 2c947a97-02

  103:00003    1953792 nvme0n1p3 2c947a97-03

  103:00004      62464 nvme0n1p4 2c947a97-04

No filesystem could mount root, tried:
 ext3
 ext4
 ext2
 vfat
 msdos

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.14.67+ #46
Hardware name: Fujitsu ARM-SVP Board (DT)
Call trace:
[<ffff000008089990>] dump_backtrace+0x0/0x1d0
[<ffff000008089b84>] show_stack+0x24/0x30
[<ffff000008897494>] dump_stack+0xb0/0xf0
[<ffff0000080d16d4>] panic+0x124/0x288
[<ffff0000090013fc>] mount_block_root+0x1c0/0x22c
[<ffff000009001690>] mount_root+0x100/0x118
[<ffff000009001840>] prepare_namespace+0x198/0x1a8
[<ffff000009000eb0>] kernel_init_freeable+0x1f0/0x230
[<ffff0000088a6a5c>] kernel_init+0x18/0x108
[<ffff0000080846d0>] ret_from_fork+0x10/0x18
SMP: stopping secondary CPUs
Kernel Offset: disabled
CPU features: 0x1802000
Memory Limit: none
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

确认了内核对cpio格式initrd配置项

CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y

不知道为什么解压会出现问题,看了下内核源码,最终定位到函数unpack_to_rootfs解压错误,

static int __init populate_rootfs(void)
{
	...
	if (initrd_start && !IS_ENABLED(CONFIG_INITRAMFS_FORCE)) {
#ifdef CONFIG_BLK_DEV_RAM
		int fd;
		printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n");
		err = unpack_to_rootfs((char *)initrd_start,
			initrd_end - initrd_start);
		if (!err) {
			free_initrd();
			goto done;
		} else {
			clean_rootfs();
			unpack_to_rootfs(__initramfs_start, __initramfs_size);
		}
		printk(KERN_INFO "rootfs image is not initramfs (%s)"
				"; looks like an initrd\n", err);
		...
		}
	done:
		...
#else
		printk(KERN_INFO "Unpacking initramfs...\n");
		err = unpack_to_rootfs((char *)initrd_start,
			initrd_end - initrd_start);
		if (err)
			printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err);
		free_initrd();
#endif
	}
    ...
}

通过添加内核调试信息,发现启动指定的initrd大小必须与烧写initrd显示的大小需要保持一致,即精确到字节数。否则函数unpack_to_rootfs 中while (!message && len)会触发上面的错误。最终正常启用了initrd。

initrdrootfsinitramfs是在Linux系统中用于引导和初始化的概念,它们之间有一些区别和作用。 1. initrdInitial RAM Disk)是一个临时的根文件系统,它是在系统引导过程中由内核加载到内存中的。它通常包含一些必要的驱动程序和工具,用于在真正的根文件系统(rootfs)加载之前进行一些初始化操作。initrd最初是为了解决早期Linux系统在引导过程中无法识别硬件的问题而设计的。它的作用是提供一个临时的根文件系统,以便在引导过程中加载必要的驱动程序和模块,从而能够识别和访问硬件设备。 2. rootfsRoot File System)是Linux系统中的根文件系统,它是系统中所有其他文件系统的基础。rootfs包含了操作系统的核心文件和目录结构,它是系统引导后的第一个文件系统。在引导过程中,initrd会被加载到内存中,然后解压缩到rootfs中。一旦rootfs加载完成,系统将切换到rootfs作为根文件系统,并执行init程序来完成系统的初始化和启动。 3. initramfsInitial RAM File System)是initrd的一种改进版本,它是一个压缩的文件系统映像,也是在系统引导过程中由内核加载到内存中的。与initrd不同,initramfs不需要解压缩到内存中的临时文件系统中,而是直接在内存中解压缩并挂载为根文件系统。initramfs的作用与initrd类似,它提供了一个临时的根文件系统,用于在引导过程中加载必要的驱动程序和模块。 总结: - initrd是早期Linux系统中使用的临时根文件系统,用于在引导过程中加载必要的驱动程序和模块。 - rootfsLinux系统中的根文件系统,包含了操作系统的核心文件和目录结构。 - initramfsinitrd的改进版本,它是一个压缩的文件系统映像,直接在内存中解压缩并挂载为根文件系统。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值