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