You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto(Petalinux)构建镜像中替换/抢占/sbin/init的标准方法

Yocto/Petalinux双分区Overlay Rootfs启动优化方案

以下是几种比独立定制ramfs更简洁、标准的实现方式:

1. 基于Yocto原生initramfs添加preinit钩子

Yocto/Petalinux支持直接定制initramfs的启动逻辑,无需单独构建独立ramfs镜像:

  • 在自定义Yocto层中,创建recipes-core/initramfs/files/preinit-overlay.sh脚本,写入分区检测、overlay挂载逻辑
  • 通过BB文件将脚本安装到initramfs的/scripts/init-top/目录(dracut框架对应路径为/usr/lib/dracut/modules.d/99myoverlay/)
  • 在petalinux-config中启用CONFIG_INITRAMFS,确保自定义脚本被包含进initramfs
  • 脚本执行完成后自动移交控制权给后续init流程,无需手动替换/sbin/init

2. 利用sysvinit的preinit阶段

由于你使用的是sysvinit,它本身支持优先级最高的preinit脚本:

  • 在Yocto rootfs构建中,添加自定义脚本到/etc/preinit.d/S00-select-overlay(S00前缀确保是第一个执行的脚本)
  • 脚本内实现:检测启动条件,卸载临时root,挂载目标分区为overlay rootfs,最后调用switch_root切换到新根
  • 这种方式无需依赖initramfs,直接对接现有sysvinit启动流程,改动最小

3. U-Boot cmdline参数+initramfs判断

把启动条件判断放到U-Boot,initramfs仅负责挂载:

  • 在U-Boot中根据启动场景设置cmdline参数,比如overlay_part=/dev/mmcblk0p2
  • 在Yocto的initramfs默认脚本中添加逻辑:读取cmdline的overlay_part参数,挂载对应分区为overlay rootfs
  • 这种方式耦合度低,后期调整启动条件无需修改rootfs或initramfs,只需调整U-Boot变量

核心挂载命令示例

挂载overlay并切换根的关键代码:

# 假设目标分区为/dev/mmcblk0pX,work分区为/dev/mmcblk0pY
mount /dev/mmcblk0pX /mnt/lower
mount /dev/mmcblk0pY /mnt/work
mount -t overlay overlay -o lowerdir=/mnt/lower,upperdir=/mnt/work/upper,workdir=/mnt/work/work /newroot
switch_root /newroot /sbin/init

内容的提问来源于stack exchange,提问作者Douglas B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:55:53