简记initramfs使用
网上都是各种介绍,流程咋走咋走,rootfs怎么做怎么做
但用起来是真没跑起来(虽然不是我自己弄,但是我看了一圈下来也是晕)
最后负责弄的同学倒腾出来了,发现不太像网上说的那么回事,甚至源码也觉得怪怪的
大概是没有通读代码流程就想自己折腾一下initramfs
总之简单记录一下
注意点:
1. 使用的项目有打包rootfs,自己额外做反而因为动态库啥的放得不对跑不起来
2. 编译期间以为要打开选项CONFIG_BLK_DEV_RAM,结果并不需要
实际只要打开initramfs/initrd支持,然后指定rootfs文件夹,还有cpio的压缩就好了
目前cpio压缩只验证了xz能用,gz不知为啥解压失败,提示什么padding有问题
3. 之前一直弄不出来,看流程都以为第一步 unpack_to_rootfs(__initramfs_start, __initramfs_size);
是解压initramfs,然后第二步 unpack_to_rootfs((char *)initrd_start,initrd_end - initrd_start);是解压cpio
甚至代码内解压失败都是提示你这不像initramfs,像initrd,具体原因是junk in compressed
archive
结果不是,第一步的unpack_to_rootfs已经解压好根文件系统了,后面的操作就是确认initrd在这个initramfs里还是需要怎么使用
像目前使用的项目,只会编译initramfs_data.cpio.xz,没有initrd,那只要第一步就可以了
而代码流程进入到第二步完全是意外:同学在dts里指定了chosen: linux:initrd-start
这个地址,它被内核导入为initrd_start了;这个地址实际不该使用。
好想和Linux项目提issue……太混淆了
附自己加点log的initram.c部分代码
static int __init populate_rootfs(void)
{
char *err = unpack_to_rootfs(__initramfs_start,
__initramfs_size);
if (err)
panic("%s",
err);
if (initrd_start) {
#ifdef CONFIG_BLK_DEV_RAM
int fd;
printk(KERN_INFO "Trying to unpack rootfs image as
initramfs...__initramfs_start=%p, initrd_start=%p
initrd_end=%p\n",
__initramfs_start,
(void*)initrd_start, (void*)initrd_end);
err = unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start);
// err =
unpack_to_rootfs(__initramfs_start, __initramfs_size);
if (!err) {
free_initrd();