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