简介:面向 X86 架构的 OpenHarmony 引导程序资源包,专为需要在 PC、服务器和物联网设备上启动开源鸿蒙系统的开发者设计。它作为硬件与操作系统之间的桥梁,帮助用户解决启动加载、GRUB 配置、EFI 安全引导等基础问题,同时为国产化替代和嵌入式教学提供参考。压缩包共 311 个文件,以 265 个 mod 模块文件为主,搭配 png 图标、lst 模块依赖清单、pf2 字体、efi 引导程序以及 cfg 配置脚本,整体仅 4.43MB,结构紧凑、分类清晰,便于按需取用和排查问题。已有 1683 人学习下载,适合具备一定系统开发基础的读者。资源内附 readme 说明、sh 安装脚本和示例配置,不仅提供现成的启动文件,还展示了 bootloader 与内核加载、硬件抽象层(HAL)配置的协作关系;通过 lst 和 cfg 文件,可以进一步理解模块依赖顺序与启动参数设置。开发者可据此掌握启动流程,并利用 OpenHarmony 的模块化特性,针对不同硬件进行裁剪或增强,从而提升系统启动的稳定性与兼容性。
1. OpenHarmony 上 X86 这条路:为什么引导程序是第一个拦路虎
以前做 OpenHarmony 移植,默认就是 ARM 板子,直到有一天要在 X86 电脑上跑起来,才发现引导程序才是第一个拦路虎。这份 X86 引导程序资源解决的就是从按下电源键到内核真正跑起来这一段:EFI 固件怎么找到内核、ramdisk 跟 rootfs 怎么对上、双系统怎么共存、崩了之后怎么拉起来。适合手里有 X86 开发机或旧 PC、想跑 OpenHarmony 标准系统的人,也适合正在做 OHOS X86 适配、需要参考引导链路和分区方案的工程师。我会从启动链路讲起,把部署步骤、参数含义和踩过的坑一次说清,照着做基本上能进桌面。
2. 先搞懂 X86 引导链路:内核、ramdisk、fstab 三者的关系
对做惯了 ARM 的人来讲,X86 的引导链路确实像个黑匣子:明明有 GRUB 菜单,内核就是不起来,日志也不知道去哪看。其实 X86 上引导 OpenHarmony 的原理并不复杂,只是跟 ARM 那套 fastboot + boot.img 的流程完全不同。这一章先把链路拆开,让你知道每个环节在干什么,后面部署时才知道参数为什么要那么写。
2.1 OpenHarmony 标准系统启动分几个阶段
OpenHarmony 标准系统从通电到进桌面,大致走四个阶段。每个阶段出了问题,表现都不一样,排查范围也比内容窄得多。
| 阶段 | 行为 | 关键产物 | 失败典型表现 |
|---|---|---|---|
| 固件 | UEFI 初始化硬件,扫描启动设备,加载 EFI 应用 | 启动菜单、BootOrder | 找不到启动盘 |
| Bootloader | 从 ESP 分区读取 GRUB,加载内核和 ramdisk | grubx64.efi、grub.cfg | 黑屏、花屏、卡在 GRUB |
| 内核 | 解压触发,初始化 PCI/存储/显示驱动,解压 initramfs | vmlinuz、cmdline | 内核打印后卡死 |
| Init 与用户态 | 解析 fstab,挂载 system/vendor/userdata,启动服务 | ramdisk 里的 init、fstab | 反复重启、进 updater |
这里最容易被忽略的是第二阶段和第四阶段的边界。很多人看到 GRUB 菜单出来了,就以为引导没问题,结果卡在 init 挂分区上,还回头去折腾 GRUB,方向完全错了。我判断问题在哪一阶段,一般就看两个信号:一是有没有内核打印,二是有没有进入 OpenHarmony 开机动画。
2.2 X86 与 ARM 引导的关键差异:从哪里加载内核和 ramdisk
ARM 平台上有 DTB 描述硬件,boot.img 把内核、DTB、ramdisk 打包成一个镜像,fastboot 一条命令刷进去,引导链路由 SoC 厂商的 Bootloader 固定好。X86 完全不是这套玩法:CPU 不看 DTB,固件只按 UEFI 规范去找 EFI 分区里的 .efi 文件,至于这个文件是 GRUB 还是 Windows Boot Manager,它不关心。
所以 X86 上跑 OpenHarmony,常见做法是走 GRUB2 或 EFISTUB。我一般用 GRUB2,因为可以在 grub.cfg 里随时改内核 cmdline,调试阶段这个灵活性非常值钱。整个 X86 引导链路就是:UEFI 读 ESP 分区 → GRUB 加载 vmlinuz 和 ramdisk.img → 内核靠 cmdline 里 root 参数找到根分区 → ramdisk 里的 init 解析 fstab 挂载 system/vendor。ESP 分区必须是 FAT32,这是 UEFI 规范写死的,格成 ext4 的话固件直接不认。
2.3 引导程序资源包里都有什么
这份资源按常见的打包方式,会包含以下几个文件。部署之前先对一遍,缺哪个补哪个,不要等开机了才发现 ramdisk 没拷全。
| 文件 | 作用 | 部署位置 |
|---|---|---|
| vmlinuz | OpenHarmony 内核,X86 编译版 | /EFI/OHOS/ |
| ramdisk.img | initramfs,内置 init 与 fstab | /EFI/OHOS/ |
| grubx64.efi | GRUB 主程序 | /EFI/GRUB/ 或回退路径 /EFI/BOOT/BOOTX64.EFI |
| grub.cfg | 启动菜单与内核 cmdline | /EFI/GRUB/ |
| system.img、vendor.img | 系统镜像与厂商分区镜像 | 直接 dd 到独立分区 |
有一点要特别提醒:OpenHarmony 的 ramdisk 和发行版 Linux 的 initramfs 并不完全一样,它里面的 init 不光是挂根分区,还要按 fstab 依次挂好 /system、/vendor,任何一个挂载失败都会触发 rescue 逻辑。所以不要试图拿 Ubuntu 的 initrd 去替代,必须用跟 system 同源的 ramdisk.img。
3. 部署到 X86 硬盘:从分区规划到第一条引导项
这一章是实操正文。我会按自己在 X86 机器上装 OpenHarmony 的完整流程来写,从准备 BIOS 开始,到分区、铺镜像、写 GRUB、注册引导项,每一步都有命令和参数说明。建议先拿一块闲置硬盘练手,不要在主力机上直接开工。
3.1 改分区前的准备:BIOS 设置与 Live 环境
进系统前先动 BIOS。SATA 模式必须设成 AHCI,不能是 RAID/IIntel RST,否则内核的 ahci 驱动根本看不见硬盘。Secure Boot 要关掉,常见的 X86 OpenHarmony 内核没做微软签名,开着安全启动 GRUB 会被拦下来。CSM 可以关也可以开,如果用的是很老的显卡,先开着 CSM 走 BIOS 兼容模式,引导成功后再说。
准备好一个 Ubuntu 或任意 Linux 的 live U 盘,因为 OpenHarmony 系统本身没有分区工具和 efibootmgr,这些操作要在 live 环境里做。我一般直接用 Ubuntu 的 live 桌面版,图形界面方便确认分区结果,纯命令行的用 parted 也一样。
提示:整盘操作前务必备份数据。分区表重建和 dd 铺镜像都是不可逆操作,没有后悔药。
3.2 分区规划与格式化:GPT 表与四分区方案
X86 引导 OpenHarmony,我习惯分成四个分区:ESP、system、vendor、userdata。分区名只是标签,不强制,但布局最好固定下来,因为 fstab 里的挂载关系是跟分区一一对应的。
# 目标盘 /dev/sda,先看当前分区状态确认盘符 sudo parted /dev/sda print # 创建 GPT 分区表 sudo parted /dev/sda mklabel gpt # ESP 分区,512MiB,FAT32,标记 esp 后 UEFI 固件才认 sudo parted /dev/sda mkpart ESP fat32 1MiB 513MiB sudo parted /dev/sda set 1 esp on # system 分区,放系统镜像 sudo parted /dev/sda mkpart system ext4 513MiB 20GiB # vendor 分区,放厂商驱动和固件 sudo parted /dev/sda mkpart vendor ext4 20GiB 25GiB # 剩余空间给 userdata sudo parted /dev/sda mkpart userdata ext4 25GiB 100%分区从 1MiB 开始而不是 0,是为了对齐物理扇区,避免 IO 性能受影响,这是所有分区操作的基本习惯。ESP 用 FAT32 是 UEFI 规范写死的,不能改成 ext4 或 xfs。分区大小里 system 给到 20GiB 是考虑到 OpenHarmony 镜像解压后加上未来 OTA 空间,实际可以根据自己镜像大小调。
分区建好后格式化,卷标写上便于后续用 LABEL 方式定位分区:
sudo mkfs.vfat -F32 -n OHOS_BOOT /dev/sda1 sudo mkfs.ext4 -L OHOS_SYSTEM /dev/sda2 sudo mkfs.ext4 -L OHOS_VENDOR /dev/sda3 sudo mkfs.ext4 -L OHOS_DATA /dev/sda4格式化命令本身没有难度,重点在卷标。后面 cmdline 里我可以写root=LABEL=OHOS_SYSTEM而不用root=/dev/sda2,这样即使盘符漂移,系统也能按卷标找到根分区,这是 X86 上非常实用的技巧。
3.3 铺镜像与写引导:GRUB 安装和 efibootmgr 注册引导项
镜像和引导文件分开处理。system.img 和 vendor.img 用 dd 铺到对应分区,引导文件拷贝到 ESP 分区。先在 live 环境下挂载 ESP:
sudo mkdir -p /mnt/esp sudo mount /dev/sda1 /mnt/esp # 建引导目录,拷贝内核和 ramdisk sudo mkdir -p /mnt/esp/EFI/OHOS sudo cp vmlinuz /mnt/esp/EFI/OHOS/ sudo cp ramdisk.img /mnt/esp/EFI/OHOS/ # GRUB 文件从资源包或系统 grub 目录拷贝 sudo cp -r /mnt/esp/EFI/GRUB 2>/dev/null || sudo cp -r grub /mnt/esp/EFI/GRUB sudo umount /mnt/esp拷贝引导文件没有太多技术含量,但 GRUB 的 efi 文件不要直接改名叫 grubx64.efi 就完事,确认 grub.cfg 和 fonts、x86_64-efi 模块目录都在一起,缺了模块 GRUB 会进 rescue 模式。
接着铺系统镜像,这是最容易让人误操作的一步:
sudo dd if=system.img of=/dev/sda2 bs=4M status=progress conv=fsync sudo dd if=vendor.img of=/dev/sda3 bs=4M status=progress conv=fsyncdd 的 bs=4M 是标准块大小,兼顾速度和兼容性。conv=fsync 的作用是把数据强制落盘后再返回,避免你拔盘的时候缓冲区还没写完整。铺完之后用 blkid 确认分区 UUID 或 LABEL 都在,下一步要用。
GRUB 引导项两条路:一是直接在 live 里运行 grub-install 让 efibootmgr 自动写 NVRAM,二是手动用 efibootmgr 创建。自动安装在发行版里很常用,但 OpenHarmony 的场景下我更喜欢手动写,因为路径和标签都能自己控制:
sudo efibootmgr --create --disk /dev/sda --part 1 \ --label 'OpenHarmony X86' \ --loader '\\EFI\\GRUB\\grubx64.efi'--part 1指 ESP 是第一个分区;--loader的路径是 EFI 分区内的相对路径,必须用双反斜杠,UEFI 规范里路径分隔符就是这么定义的。命令执行后可以用efibootmgr -v查看 BootOrder,确认 OpenHarmony 项存在且排到了前面。排不到前面就手动efibootmgr --bootorder调整,这在双系统机器上很常见。
3.4 grub.cfg 与内核 cmdline:决定成败的参数组合
铺完镜像,最后写 grub.cfg。这是引导里最关键的配置文件,内核能不能看到根分区、日志输出到哪里,全在这几行里。我的基础模板是这样:
set timeout=3 set default=0 menuentry 'OpenHarmony X86' { linux /EFI/OHOS/vmlinuz root=LABEL=OHOS_SYSTEM console=tty0 console=ttyS0,115200n8 rw initrd /EFI/OHOS/ramdisk.img }cmdline 里的参数逐个说清楚:root=LABEL=OHOS_SYSTEM按卷标找根分区,比root=/dev/sda2抗盘符漂移;console=tty0把内核输出打到屏幕上,没有它你会觉得机器死掉了;console=ttyS0,115200n8是串口输出,做嵌入式的人习惯留一条串口后路,开双输出两条都在;rw是让 init 阶段能写临时文件,有些 ramdisk 不带这个会挂载只读盘,后面全是奇怪报错。
写完 grub.cfg 放进 ESP 的 /EFI/GRUB/ 下。开机进 GRUB 菜单,选 OpenHarmony X86,看到内核打印就说明引导链路已经通了一半。首次启动验证就看四件事:GRUB 菜单出不出、内核打不打屏、ramdisk 挂载报不报错、最后进不进桌面。
| 检查点 | 预期表现 | 失败时的排查方向 |
|---|---|---|
| GRUB 菜单 | 能看到 OpenHarmony X86 条目 | EFI 注册引导项失效、grub 模块缺失 |
| 内核打印 | 屏幕刷出大量早期启动日志 | console 参数缺失、内核被安全启动拦截 |
| 挂载阶段 | 没有报错直接过渡到开机动画 | fstab 分区 UUID 对不上 |
| 桌面 | 出现图形界面 | vendor 驱动或 firmware 缺失 |
如果是虚拟机里测试,记得在 VMware/QEMU 里选 UEFI 固件而不是 BIOS,很多人在虚拟机能启动、实机黑屏,就是两个环境的固件类型不一致。
4. 避坑:X86 引导 OpenHarmony 最常见的五个翻车现场
这一章是血泪经验集中区。X86 上引导 OpenHarmony 的坑跟 ARM 完全不一样,盘符漂移、NVRAM 被 Windows 重写、串口哑巴,这些问题我全踩过。每条按现象、原因、解决的思路写,方便你对照自己的情况快速定位。
4.1 故障定位的通用思路:先看日志再动手拆
遇到引导问题,第一件事不是重刷镜像,而是确认故障发生在哪个阶段。引导早期的日志基本只能靠串口,建议一开始就把串口输出窗口打开,别等出问题再接线。
# 在 GRUB 菜单按 e 进入编辑,临时在 cmdline 末尾追加参数,按 Ctrl+X 启动 console=ttyS0,115200n8 nokaslr # 虚拟机场景下,把串口重定向到文件,方便反复查看 qemu-system-x86_64 -serial file:serial.log ...串口线的接线很简单:主板 COM 口或 USB 转串口均可,OpenHarmony 的 X86 内核通常编译了 8250 串口驱动,波特率 115200、8N1。强行加nokaslr是为了让内核地址不随机化,这样打印出来的调用栈能跟符号表对上,定位 panic 时非常有用。等系统跑起来后,用户态日志走 hilog,跟 dmesg 是两套体系,别混着看。
4.2 五条高频踩坑记录
坑 1:选了 GRUB 菜单后整个屏幕黑掉,硬盘灯不闪
现象:GRUB 菜单正常显示,选 OpenHarmony 条目后屏幕直接黑掉,键盘灯、硬盘灯都没反应。
原因:最常见是 cmdline 里没写console=tty0,内核把输出默认发到串口,而串口没接,看着就是黑屏死机。次常见的原因是 GOP 输出初始化失败,efifb 驱动和显卡固件没配合好。
解决:cmdline 显式加上console=tty0;如果还是黑,再追加video=efifb:off,让内核走回 BIOS 文本输出模式。这招看着玄学,实际就是绕开 UEFI 的帧缓冲兼容性问题。
坑 2:内核打印卡在 Waiting for root device
现象:内核启动日志一直在刷Waiting for root device PARTUUID=...,刷了很久后掉进 initramfs 的紧急 shell。
原因:root 参数指向的分区找不到。要么是写了/dev/sda2但实际盘符是/dev/sdb2,要么是 PARTUUID 抄错了。
解决:不要用 sdX 盘符,直接用卷标或 PARTUUID。先在 live 里执行blkid拿到准确标识,再回 grub.cfg 里把root=改成root=LABEL=OHOS_SYSTEM。NVMe 盘尤其要这样,/dev/nvme0n1p2这种命名在部分固件下枚举顺序更不稳定。
坑 3:开机动画转两圈后整机重启
现象:OpenHarmony 动画正常播放,两圈之后不是进桌面,而是直接重启,循环往复。
原因:init 阶段的 fstab 挂载失败,触发了 OpenHarmony 的 rescue 和重启逻辑。最常见的是 vendor 分区没挂上,或 system.img 和 vendor.img 版本不配套。
解决:先确认 system.img 和 vendor.img 是同一版本发布,版本错配是反复重启的头号原因。再看 fstab 里 vendor 行的挂载点和分区标识是否与 dd 时一致。挂载参数里可以加errors=continue而不是让单次失败直接崩掉整个 init。
坑 4:Windows 系统更新后,OpenHarmony 引导项消失
现象:双系统装完一切正常,某天开机直接进了 Windows,BIOS 里也找不到 OpenHarmony 启动项。
原因:Windows 更新或休眠唤醒时会重写 NVRAM 的 BootOrder,甚至直接删掉非微软的 EFI 引导项。这是 UEFI 双系统最经典的问题。
解决:把 GRUB 的 efi 文件复制到 ESP 分区的固定回退路径/EFI/BOOT/BOOTX64.EFI,很多主板在 NVRAM 失效时会自动探测这个路径。同时关掉 Windows 的快速启动,这个开关会让 Windows 在关机时写一遍固件设置,双系统环境下属于高危选项。
坑 5:接了串口线,GRUB 有菜单,内核零输出
现象:虚拟机或物理机接了串口,GRUB 菜单正常,但内核打印完全不出现。
原因:grub.cfg 里没有配置terminal_output的 serial 后端,GRUB 阶段有输出不代表内核会用同一个串口;也可能是内核没编译SERIAL_8250_CONSOLE。
解决:grub.cfg 开头加两行:
serial --unit=0 --speed=115200 terminal_input serial console terminal_output serial console这样 GRUB 同时把交互和输出导向串口和屏幕,内核的console=ttyS0,115200n8才有机会接上数据。如果加了还是没输出,检查内核配置里 8250 串口控制台是否编进去,这属于内核编译的锅,引导配置改不动。
5. 进阶:不进系统也能修的 GRUB rescue 模式与引导自检习惯
引导坏掉不一定非要重装。X86 的优势在于 GRUB 自带 rescue shell,只要 ESP 分区没被物理破坏,基本都能救回来。这一章讲离线修复和引导完成后的自检方法,顺便分享一个我养成的验证习惯。
5.1 GRUB rescue 离线修复:硬盘重建引导程序的救命路径
开机直接进grub rescue>命令行,说明 GRUB 主程序找到了,但 grub.cfg 或相关模块没加载成功。不用慌,手动指定路径即可:
grub rescue> ls grub rescue> ls (hd0,gpt1)/ grub rescue> set root=(hd0,gpt1) grub rescue> set prefix=(hd0,gpt1)/EFI/GRUB grub rescue> insmod normal grub rescue> normalls不带参数是列出所有磁盘,带参数是列出分区内容,用来确认 ESP 分区编号。set root指定 GRUB 的根设备,set prefix指向模块目录,insmod normal加载正常模式模块后,normal命令就能把完整菜单拉起来。进菜单后重新安装引导项或修正 grub.cfg,就相当于给硬盘重建了启动引导程序,不用重刷系统。
5.2 引导完成后的自检:三十秒走完四个检查点
引导成功不是终点,很多问题是在进入桌面后潜伏的。我每次装完 OpenHarmony X86,都会强制自己走一遍这组自检命令,确认引导链路和挂载状态真的正常:
# 查看当前内核 cmdline,确认 root 与 console 参数 cat /proc/cmdline # 确认 system、vendor 挂载在预期位置 mount | grep -E 'system|vendor|userdata' # 查看用户态日志,确认没有关键错误 hilog -x/proc/cmdline看的是内核实际收到的参数,能发现 grub.cfg 里写了但没生效的情况;mount验证 fstab 解析结果,OpenHarmony 的 system 常被挂成只读,这个是正常的;hilog -x是退出时抓全量日志,如果有 vendor 加载失败或服务启动超时,这里会留下明确错误码。
这套三十秒自检我在每次装完都会完整走一遍,尤其在更换镜像版本之后。以前有次我跳过 mount 检查,结果 system 和 vendor 的版本本来就是错的,第二天开机直接卡在动画重启,浪费了大半天排查。经过那一次之后,换镜像版本必跑挂载检查成了我的固定习惯,希望在引导上少走弯路的你也能用得上这套流程。这份引导程序资源里的 vmlinuz、ramdisk.img 和 grub.cfg 配置都是现成的,下载后建议先在虚拟机 UEFI 模式下跑一遍完整流程,再上物理机,能帮你省掉不少实体机反复重启的时间。希望帮到你。
本文还有配套的精品资源,点击获取