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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核启动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。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值