![带 initramfs 的 Raspberry Pi 2 自定义内核](https://linux22.com/image/83818/%E5%B8%A6%20initramfs%20%E7%9A%84%20Raspberry%20Pi%202%20%E8%87%AA%E5%AE%9A%E4%B9%89%E5%86%85%E6%A0%B8.png)
我正在尝试让自编译内核与 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 后,它就工作了。