带 initramfs 的 Raspberry Pi 2 自定义内核

带 initramfs 的 Raspberry Pi 2 自定义内核

我正在尝试让自编译内核与 initramfs 一起运行。它适用于旧的树莓派,但不知何故我无法让它运行。

我正在尝试做的事情是:加载内核,“运行”initramfs,然后执行一些检查(系统更新等),最后安装一个 squashfs 映像并在所述系统上调用 switch_root 。

但内核以某种方式拒绝运行 initramfs 的 init。我尝试了cmdline.txt/中的各种设置config.txt,但似乎都不起作用,内核总是等待某些 root 可用(或失败VFS: unable to mount root fs on unknown block)。我假设我缺少一些命令行设置(可能是正确的root=....root=/dev/ram0不起作用)或内核标志。我当前的命令行:dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait,config.txt:initramfs initramfs.gz followkernel

当我添加root=/dev/mmcblk0p6 roottype=ext4整个系统启动时(我添加到一些 test-linux 中以验证内核本身是否有效)。

我检查了内核是否使用 initramfs 支持进行编译 ( BLK_DEV_INITRD=y),遗憾的是,将 initramfs 编译到内核映像中并不是一个选项。内核(4.1 稳定版)是使用 buildroot 编译的。内核二进制格式是zImage(似乎不适用于vmlinux,屏幕保持黑色)。

答案1

我从头开始,经过几个小时的反复试验,我找到了问题的根源,这基本上只是一些愚蠢的错误:我的构建脚本生成了带有绝对路径的 initramfs (即不是,例如,lib/libc.so但是相反~/Work/project/target/lib/libc.so),这显然会导致内核找不到初始的init。

我学到的一个有趣的教训是:嵌入式 initramfs 显然与外部 initramfs 的行为略有不同,即当存在嵌入式 initramfs 时,init 脚本中的 echo 命令等不会被打印。在修改外部 initramfs 时,我忘记删除嵌入的 initramfs,导致外部 init 被执行(并且只有那个),但不打印任何内容。当我删除嵌入的 initramfs 后,它就工作了。

相关内容