从0开始,制作一个无业务的rootfs镜像


:rocket: 实战:构建与运行 AArch64 最小化 Rootfs

本手册涵盖了从 RTOS 核心理论到在 Hi1711 模拟平台上部署 Rootfs 的全过程。


一、 核心理论:RTOS 与 Rootfs 的协作

在嵌入式系统中,内核与文件系统各司其职:

  • RTOS 内核(指挥官)

  • 任务调度:基于优先级的抢占式调度,确保“救护车”级任务永远不被阻塞。

  • 确定性:操作具有明确的最坏情况执行时间(WCET),拒绝响应波动。

  • 核心组件:由内核、信号量(Mutex)和消息队列(Queue)构成的微型生态。

  • Rootfs(物质基础)

  • 本质:内核启动后挂载的第一个文件系统镜像。

  • 职责:提供用户态的第一个进程(init/linuxxrc)、库文件(.so)和设备映射(/dev)。


二、 镜像制作:从文件夹到 Initramfs

假设你已从 OpenUBMC SDK 中解压出 rootfs 目录,请在根目录下执行以下封装指令:

1. 封装命令

find . | cpio -o -H newc | gzip > rootfs.cpio.gz

2. 参数深度解析

  • find .:递归检索当前路径下的所有文件元数据。
  • cpio -o -H newc:将文件流转为归档格式。-H newc 是关键,它采用 SVR4 格式标准,是 Linux 内核识别 initramfs 的唯一标准协议。
  • gzip:执行压缩,减小镜像体积以加速内核加载速度。

三、 模拟环境:使用 QEMU 引导启动

我们将长命令按功能模块进行了拆解,你可以直接复制下方完整命令到终端运行:

1. 完整启动指令

./qemu-system-aarch64 \
    -machine hi1711 \
    -nographic \
    -smp 4 \
    -m 8G \
    -kernel ./zImage_openUBMC \
    -dtb ./hi1711_9p8c.dtb \
    -initrd ./rootfs.cpio.gz \
    -append "root=/dev/ram0 ip=dhcp console=ttyS0 rdinit=/linuxxrc memmap=1886M@0x87200000 ramdisk_size=30720 earlycon=serial-mm,0x08710000 printk.time=y ignore_loglevel" \
    -netdev user,id=vnet0,hostfwd=tcp::10022-:22,hostfwd=tcp::10023-:23 \
    -device virtio-net-device,netdev=vnet0 \
    -monitor telnet::4444,server,nowait

2. 参数分类说明卡片

模块 关键参数 作用描述
硬件模拟 -machine hi1711 模拟海思 Hi1711 芯片环境(4核/8G内存)。
引导镜像 -kernel / -dtb 加载内核压缩镜像及设备树文件(硬件拓扑说明)。
文件系统 -initrd 核心点:加载我们手动制作的 rootfs.cpio.gz 镜像。
内核参数 rdinit=/linuxxrc 指定 Rootfs 中第一个被拉起的进程名称。
(-append) root=/dev/ram0 告知内核根目录位于内存盘(RAMDisk)中。
网络转发 hostfwd=tcp::10022-:22 允许宿主机通过 ssh localhost -p 10022 访问虚拟机。
系统监控 -monitor telnet::... 开启监控后台,可通过 telnet 4444 端口热管理虚拟机。

四、 关键排错 checklist

  1. 内核崩溃(Panic):检查 -H newc 是否正确使用,或者 rdinit 路径是否在 Rootfs 中真实存在。
  2. 黑屏无输出:确认 -append 里的 console=ttyS0 是否匹配了硬件的物理串口地址。
  3. 内存不足:Hi1711 模拟对内存有硬性要求,建议 -m 保持在 4G 以上。
    4.ssh报错:如果遇到有ssh报错的地方, 在制作cpio镜像的时候,把
2 个赞