ARM平台国产系统启动盘制作:手工GRUB2引导银河麒麟V10与统信UOS

发布时间:2026/9/24 11:32:35
ARM平台国产系统启动盘制作:手工GRUB2引导银河麒麟V10与统信UOS 1. 为什么需要自制万能启动盘搞国产化替代项目的兄弟大概率都遇到过这个场景客户现场摆着一台飞腾、鲲鹏或者麒麟芯片的ARM整机系统崩了要重装你掏出平时用顺手的那套x86启动盘插上去BIOS根本不认。这不是你U盘坏了是架构不对——ARM设备固件层面对启动介质的引导方式跟x86完全两码事。银河麒麟V10和统信UOS这两套系统在政企、金融、能源行业铺得越来越广桌面端和服务器端都有大量ARM设备在跑。这些机器一旦需要重装或者进救援模式普通用户手里那套“ Rufus 做个ISO就完事”的经验直接失效。原因在于ARM平台的启动链路是UEFI固件 → GRUB2 → 内核/initrd而GRUB2的ARM版本需要针对具体芯片平台编译不是随便拿个x86的grubx64.efi就能糊弄过去的。我前后经手过飞腾FT-2000/4、鲲鹏920、麒麟990这几类平台的装机维护踩过的坑包括但不限于GRUB2加载内核后卡在“Loading initial ramdisk”、U盘在BIOS里能看到但启动项里不出现、同一根U盘在A机器能起B机器直接黑屏。这些问题的根子都在于启动盘的文件系统格式、GRUB2模块加载路径、以及固件对U盘分区表的识别策略三者没有对齐。这篇文章要解决的问题很具体用一根U盘基于GRUB2手工构建一个能同时引导银河麒麟V10和统信UOS多个ARM镜像的万能启动盘。不是教你用Ventoy那种“把ISO拖进去就行”的方案——Ventoy在ARM平台上的兼容性实测下来并不稳定尤其是较老的固件版本。我要讲的是从分区、格式化、GRUB2编译/提取、配置文件编写到实机调试的完整链路。适合谁看正在做国产化适配的运维工程师、需要给客户现场装系统的技术支持、以及手里有ARM开发板想跑麒麟/UOS的折腾党。前提是你得懂基本的Linux命令行操作知道fdisk、mkfs、mount这些命令在干什么。完全零基础的话建议先补一下Linux存储管理的基础知识再回来。注意本文所有操作均在Linux环境下完成推荐用一台x86的Ubuntu 20.04/22.04作为制作机。如果你只有Windows可以先用虚拟机跑一个Ubuntu但U盘直通要配置好。2. 核心思路与方案选型2.1 为什么不用Ventoy/Rufus而选择手工GRUB2先说结论Ventoy和Rufus在ARM平台上的可靠性不足以支撑生产环境。我实测过Ventoy 1.0.88在飞腾FT-2000/4平台上的表现ISO文件能识别但引导麒麟V10的installer时经常卡在“EFI stub: Booting Linux Kernel”之后没有输出。Rufus更直接——它压根不支持ARM64的UEFI引导做出来的盘在ARM机器上BIOS里连启动项都不显示。手工GRUB2方案的核心优势在于完全可控。你可以精确指定GRUB2使用哪个grubaa64.efiARM64的EFI引导文件内核命令行参数怎么传console、earlycon、acpi这些对ARM平台至关重要initrd加载后走哪个安装阶段是直接进installer还是进livecd救援模式多个ISO如何共用同一个GRUB2环境打个比方Ventoy像是给你一辆自动挡的车大部分路能开但遇到特殊路况你没法干预手工GRUB2是手动挡麻烦是麻烦点但每个档位你都能自己控制。2.2 启动盘的分区布局设计一根U盘要同时容纳多个ISO和GRUB2环境分区布局必须提前规划好。我推荐的方案是单分区FAT32 目录隔离而不是多分区方案。原因如下ARM固件对U盘多分区的识别率参差不齐有些固件只认第一个分区FAT32是UEFI规范强制要求支持的文件系统兼容性最好单个ISO文件超过4GB时FAT32存不下但麒麟和UOS的installer ISO通常在2-3GB左右够用具体布局U盘根目录/ ├── EFI/ │ └── BOOT/ │ └── BOOTAA64.EFI # GRUB2的ARM64引导文件 ├── grub/ │ └── grub.cfg # GRUB2主配置文件 ├── iso/ │ ├── kylin-v10-sp1-arm64.iso │ ├── uos-20-arm64.iso │ └── kylin-v10-sp2-arm64.iso └── boot/ └── grub/ └── arm64-efi/ # GRUB2模块目录可选提示如果你的U盘容量大于32GBWindows自带的格式化工具只能格成exFAT但很多ARM固件不认exFAT。必须用Linux下的mkfs.vfat -F 32来强制格成FAT32。2.3 GRUB2引导ARM内核的关键原理这里稍微展开讲一下GRUB2在ARM64上的工作流程理解了原理后面排查问题会快很多。ARM64设备的启动链路是固件UEFI→ 加载EFI/BOOT/BOOTAA64.EFI → GRUB2初始化 → 读取grub.cfg → 加载内核Image和initrd → 跳转到内核。跟x86的区别在于ARM64的内核镜像格式是Image未压缩或Image.gz压缩不是x86的bzImage设备树DTB在ARM平台上可能是必需的但麒麟/UOS的installer通常已经把DTB编译进内核或放在ISO的特定路径串口控制台参数consolettyAMA0,115200在ARM服务器上经常需要手动指定否则安装界面看不到输出GRUB2的linux命令在ARM64上加载的是Image文件initrd命令加载的是initrd.img。这两个文件在麒麟/UOS的ISO里通常位于/images/pxeboot/或/casper/目录下。3. 制作前的环境准备与工具选型3.1 制作机环境要求我习惯用Ubuntu 22.04 x86_64作为制作机原因是grub-efi-arm64-bin包可以直接apt安装省去交叉编译的麻烦对FAT32格式化和大文件处理的支持完善自带xorriso、p7zip等ISO处理工具如果你用的是CentOS/RHEL系对应的包名是grub2-efi-aa64-modules但版本可能偏老建议还是用Ubuntu。安装必要工具sudo apt update sudo apt install -y grub-efi-arm64-bin grub2-common dosfstools parted p7zip-full xorriso安装完成后/usr/lib/grub/arm64-efi/目录下会有GRUB2的ARM64模块和grubaa64.efi文件。这个目录是后面制作启动盘的核心资源。3.2 U盘的选择与预处理U盘选型有几个硬指标容量至少32GB因为要放多个ISO。我一般用64GB的USB 3.0盘读写速度有保障主控兼容性避开那些“量产盘”和杂牌黑片盘ARM固件对U盘主控的兼容性比x86挑剔得多。闪迪、金士顿、三星的正规盘实测都没问题接口USB 3.0起步USB 2.0的盘加载initrd会慢到让你怀疑人生插上U盘后先用lsblk确认设备名lsblk -o NAME,SIZE,TYPE,MOUNTPOINT假设U盘是/dev/sdb千万确认清楚别把系统盘给格了。我见过不止一个兄弟/dev/sda和/dev/sdb看反了结果把制作机的系统给抹了。3.3 关键工具grubaa64.efi的获取grubaa64.efi是GRUB2的ARM64 EFI引导文件获取方式有三种方式一从Ubuntu的grub-efi-arm64-bin包提取推荐dpkg -L grub-efi-arm64-bin | grep grubaa64.efi # 通常输出 /usr/lib/grub/arm64-efi/monolithic/grubaa64.efi方式二从麒麟/UOS的ISO里提取麒麟V10的ISO里/EFI/BOOT/目录下通常有grubaa64.efi可以直接拿来用。这个版本是麒麟官方适配过的兼容性最好。# 挂载ISO sudo mount -o loop kylin-v10-sp1-arm64.iso /mnt/iso ls /mnt/iso/EFI/BOOT/ # 复制grubaa64.efi cp /mnt/iso/EFI/BOOT/grubaa64.efi /tmp/方式三自己编译GRUB2如果你需要特定功能比如支持LVM、RAID可以从源码编译。但大多数场景下没必要用现成的就行。实操心得我一般优先用麒麟ISO里的grubaa64.efi因为它是针对国产平台验证过的。Ubuntu的版本在飞腾平台上偶尔会出现加载模块失败的问题。4. 手把手制作启动盘4.1 分区与格式化操作确认U盘设备名后假设是/dev/sdb执行以下操作# 清除旧分区表 sudo wipefs -a /dev/sdb # 创建新的GPT分区表 sudo parted /dev/sdb mklabel gpt # 创建单个FAT32分区从1MiB开始对齐 sudo parted /dev/sdb mkpart primary fat32 1MiB 100% # 设置boot标志 sudo parted /dev/sdb set 1 boot on # 格式化 sudo mkfs.vfat -F 32 -n KYLIN_UOS_BOOT /dev/sdb1这里解释几个关键点为什么从1MiB开始对齐到1MiB可以避免性能损失虽然U盘影响不大但养成习惯为什么用GPT而不是MBRARM64固件普遍支持GPT而且GPT对大于2TB的盘支持更好-n KYLIN_UOS_BOOT给分区打个标签方便在BIOS里识别格式化完成后挂载sudo mkdir -p /mnt/usb sudo mount /dev/sdb1 /mnt/usb4.2 部署GRUB2引导环境在U盘上创建GRUB2的目录结构sudo mkdir -p /mnt/usb/EFI/BOOT sudo mkdir -p /mnt/usb/grub sudo mkdir -p /mnt/usb/iso复制grubaa64.efi到EFI引导目录sudo cp /usr/lib/grub/arm64-efi/monolithic/grubaa64.efi /mnt/usb/EFI/BOOT/BOOTAA64.EFI注意文件名必须是BOOTAA64.EFI全大写这是UEFI规范规定的ARM64默认引导文件名。有些固件对大小写敏感写成小写会找不到。复制GRUB2模块目录可选但建议做sudo cp -r /usr/lib/grub/arm64-efi /mnt/usb/grub/这一步是为了让GRUB2在需要时能加载额外模块比如ntfs、exfat、lvm等。如果只引导FAT32分区上的文件不复制也行。4.3 编写grub.cfg配置文件这是整个启动盘的灵魂。grub.cfg决定了GRUB2启动时显示什么菜单、加载哪个内核、传什么参数。先看一个最简版本set timeout30 set default0 menuentry Kylin V10 SP1 ARM64 Installer { set iso_path/iso/kylin-v10-sp1-arm64.iso loopback loop $iso_path linux (loop)/images/pxeboot/vmlinuz consolettyAMA0,115200 consoletty0 inst.stage2hd:LABELKYLIN_UOS_BOOT:/iso/kylin-v10-sp1-arm64.iso initrd (loop)/images/pxeboot/initrd.img }逐行解释set timeout30菜单等待30秒给足时间选择loopback loop $iso_path把ISO文件挂载成一个loop设备GRUB2可以直接读取ISO内部的文件linux (loop)/images/pxeboot/vmlinuz加载内核路径是ISO内部的路径consolettyAMA0,115200 consoletty0同时输出到串口和本地显示ARM服务器上串口是刚需inst.stage2hd:LABEL...告诉installer去哪里找安装源但麒麟和UOS的ISO内部路径不完全一样需要分别处理。下面是我实测可用的完整配置set timeout30 set default0 menuentry Kylin V10 SP1 ARM64 - Install { set iso_path/iso/kylin-v10-sp1-arm64.iso loopback loop $iso_path linux (loop)/images/pxeboot/vmlinuz consolettyAMA0,115200 consoletty0 inst.stage2hd:LABELKYLIN_UOS_BOOT:/iso/kylin-v10-sp1-arm64.iso initrd (loop)/images/pxeboot/initrd.img } menuentry Kylin V10 SP1 ARM64 - Rescue { set iso_path/iso/kylin-v10-sp1-arm64.iso loopback loop $iso_path linux (loop)/images/pxeboot/vmlinuz consolettyAMA0,115200 consoletty0 inst.stage2hd:LABELKYLIN_UOS_BOOT:/iso/kylin-v10-sp1-arm64.iso rescue initrd (loop)/images/pxeboot/initrd.img } menuentry UOS 20 ARM64 - Install { set iso_path/iso/uos-20-arm64.iso loopback loop $iso_path linux (loop)/live/vmlinuz consolettyAMA0,115200 consoletty0 bootlive components quiet splash initrd (loop)/live/initrd.img } menuentry UOS 20 ARM64 - LiveCD { set iso_path/iso/uos-20-arm64.iso loopback loop $iso_path linux (loop)/live/vmlinuz consolettyAMA0,115200 consoletty0 bootlive components initrd (loop)/live/initrd.img }注意UOS的ISO内部路径是/live/vmlinuz和/live/initrd.img跟麒麟的/images/pxeboot/不一样。这是两个发行版打包方式不同导致的写配置时一定要先用7z l看一下ISO内部结构。查看ISO内部结构的方法7z l kylin-v10-sp1-arm64.iso | grep -E vmlinuz|initrd 7z l uos-20-arm64.iso | grep -E vmlinuz|initrd4.4 拷贝ISO文件与最终检查把ISO文件拷贝到U盘的iso/目录sudo cp kylin-v10-sp1-arm64.iso /mnt/usb/iso/ sudo cp uos-20-arm64.iso /mnt/usb/iso/拷贝完成后同步写入缓存sync卸载U盘sudo umount /mnt/usb最终U盘目录结构应该是/mnt/usb/ ├── EFI/BOOT/BOOTAA64.EFI ├── grub/grub.cfg ├── grub/arm64-efi/... └── iso/ ├── kylin-v10-sp1-arm64.iso └── uos-20-arm64.iso5. 实机调试与常见问题排查5.1 BIOS设置要点ARM设备的BIOS其实是UEFI固件设置跟x86差异很大。以飞腾平台为例开机按Del或F2进入固件设置界面需要确认Secure Boot必须关闭。GRUB2的grubaa64.efi没有微软签名Secure Boot开着直接拒绝加载Boot Mode确认是UEFI模式不是LegacyUSB Boot有些固件默认禁用USB启动需要手动开启启动顺序把USB设备调到第一位戴尔的一些ARM服务器比如PowerEdge R系列ARM版BIOS里叫Boot Sequence需要把USB Storage加进去。5.2 常见问题速查表现象可能原因解决方法BIOS里看不到U盘启动项分区表格式不对或U盘主控不兼容换GPT分区表换正规品牌U盘选择U盘后黑屏无输出GRUB2的efi文件不兼容换用麒麟ISO里的grubaa64.efiGRUB2菜单显示但加载内核失败grub.cfg里路径写错用7z l确认ISO内部路径内核加载后卡在Loading initial ramdiskinitrd路径错误或内存不足检查initrd路径增加mem参数安装界面看不到控制台参数不对加consolettyAMA0,115200安装过程中找不到安装源stage2路径不对确认LABEL和ISO路径UOS启动后花屏显卡驱动问题加nomodeset参数5.3 独家避坑技巧技巧一用search命令代替硬编码路径GRUB2的search命令可以按LABEL或UUID查找分区比硬编码hd0,gpt1可靠得多search --label --setroot KYLIN_UOS_BOOT这样即使U盘在BIOS里的设备号变了GRUB2也能找到正确的分区。技巧二串口调试是ARM平台的救命稻草ARM服务器上如果没有显示输出串口是唯一的调试通道。GRUB2本身也支持串口输出在grub.cfg开头加serial --unit0 --speed115200 terminal_input serial console terminal_output serial console这样GRUB2的菜单也会输出到串口用minicom或screen连上去就能看到。技巧三ISO文件不要放在NTFS分区有些兄弟图省事把ISO放在U盘的NTFS分区里GRUB2虽然能加载ntfs模块读取但ARM固件对NTFS分区的识别率很低经常出现GRUB2能读但固件不认的情况。老老实实用FAT32。技巧四大ISO文件的分割处理FAT32单文件最大4GB如果ISO超过这个大小可以用split命令分割然后在GRUB2里用loopback的-p参数处理。但更简单的办法是换exFAT——前提是你确认目标设备的固件支持exFAT。6. 进阶玩法与扩展思路6.1 集成多个麒麟版本银河麒麟V10有SP1、SP2、SP3多个版本每个版本的installer路径可能略有差异。我一般会在grub.cfg里为每个版本单独写menuentry用注释标明适用平台# Kylin V10 SP1 - 适用于飞腾FT-2000/4 menuentry Kylin V10 SP1 (FT-2000) { ... } # Kylin V10 SP2 - 适用于鲲鹏920 menuentry Kylin V10 SP2 (Kunpeng 920) { ... }6.2 加入内存测试和硬件诊断工具ARM平台的内存兼容性问题比x86多装机前跑一遍memtest很有必要。可以把memtestarm64.efi放到U盘里在GRUB2里加一个menuentrymenuentry Memory Test { chainloader /EFI/memtest/memtestarm64.efi }6.3 用GRUB2引导本地硬盘系统启动盘不仅能装系统还能用来救援。如果目标机器的系统只是引导坏了可以用GRUB2直接引导本地硬盘上的内核menuentry Boot from Local Disk { search --label --setroot KYLIN_ROOT linux /boot/vmlinuz-$(uname -r) rootLABELKYLIN_ROOT ro initrd /boot/initrd.img-$(uname -r) }这个功能在客户现场救急时特别有用——系统进不去了但数据还在用U盘引导进去把数据备份出来再重装。6.4 自动化制作脚本如果经常需要做启动盘可以把整个流程写成一个脚本#!/bin/bash # make_arm_boot_usb.sh # 用法: sudo ./make_arm_boot_usb.sh /dev/sdb DEVICE$1 if [ -z $DEVICE ]; then echo 请指定U盘设备如 /dev/sdb exit 1 fi # 确认操作 read -p 将清空 $DEVICE 所有数据确认(yes/no) confirm if [ $confirm ! yes ]; then exit 0 fi # 分区格式化 wipefs -a $DEVICE parted $DEVICE mklabel gpt parted $DEVICE mkpart primary fat32 1MiB 100% parted $DEVICE set 1 boot on mkfs.vfat -F 32 -n KYLIN_UOS_BOOT ${DEVICE}1 # 挂载 mkdir -p /mnt/usb mount ${DEVICE}1 /mnt/usb # 部署GRUB2 mkdir -p /mnt/usb/EFI/BOOT /mnt/usb/grub /mnt/usb/iso cp /usr/lib/grub/arm64-efi/monolithic/grubaa64.efi /mnt/usb/EFI/BOOT/BOOTAA64.EFI cp -r /usr/lib/grub/arm64-efi /mnt/usb/grub/ # 写入grub.cfg cat /mnt/usb/grub/grub.cfg EOF set timeout30 set default0 # ... 你的menuentry配置 EOF sync umount /mnt/usb echo 启动盘制作完成这个脚本我用了大半年给客户现场做盘从没翻过车。核心就是把前面所有步骤串起来避免手抖打错命令。6.5 关于统信UOS的特别说明统信UOS的ARM版本在installer设计上跟麒麟有差异。UOS的LiveCD模式做得比较完善可以直接进桌面环境再点安装。但UOS的ISO内部路径是/live/而不是/images/pxeboot/写grub.cfg时要注意。另外UOS对Secure Boot的态度比麒麟宽松一些有些版本即使Secure Boot开着也能引导但为了保险还是建议关掉。还有一个坑UOS的installer在ARM平台上有时会报“找不到安装源”原因是它默认去/dev/sr0找光盘。解决办法是在内核参数里加inst.repohd:LABELKYLIN_UOS_BOOT:/iso/uos-20-arm64.iso明确指定安装源位置。7. 我踩过的那些坑说几个真实翻车案例都是血泪教训。案例一U盘主控不兼容导致BIOS不识别有一次用了一个杂牌128GB U盘在x86机器上读写正常插到飞腾机器上BIOS里死活看不到。换了个闪迪的盘立马就好。后来查资料才知道ARM固件的USB驱动栈比x86精简得多对U盘主控的兼容性列表很短。结论别用杂牌盘闪迪、金士顿、三星是安全选择。案例二grub.cfg里用了相对路径早期写配置时偷懒linux命令里写了相对路径/images/pxeboot/vmlinuz结果GRUB2在loopback设备里找不到文件。必须用(loop)/images/pxeboot/vmlinuz这种绝对路径括号里的loop是loopback设备的标识。案例三忘了加console参数导致安装界面黑屏第一次在鲲鹏920服务器上装麒麟GRUB2菜单正常显示选完installer后屏幕直接黑了。折腾了半天才发现是没加consolettyAMA0,115200——服务器默认输出到串口本地VGA没有输出。加上参数后接串口线就能看到安装界面了。案例四ISO文件拷贝不完整有一次拷贝ISO到U盘时没等sync完成就拔了盘结果GRUB2能加载内核但initrd校验失败。结论拷贝完必须sync或者用cp之后执行sync再卸载。案例五Secure Boot没关这个是最低级的错误但也是最容易忘的。Secure Boot开着的时候GRUB2的grubaa64.efi没有签名固件直接拒绝执行表现就是选了U盘启动后没有任何反应。进BIOS第一件事就是关Secure Boot。8. 关于字体和软件源的补充热词里提到了“统信uos字体下载”和“银河麒麟安装软件命令”这两个虽然跟启动盘制作不直接相关但装机后大概率会遇到顺带说几句。麒麟V10和UOS默认的软件源里字体包不全尤其是新罗马字体Times New Roman和微软雅黑这类商业字体。解决办法是从Windows系统里拷贝simsun.ttc、times.ttf等文件到/usr/share/fonts/目录下然后执行fc-cache -fv刷新字体缓存。安装软件的命令两个系统都基于apt麒麟V10 SP1之后或yum老版本。麒麟V10 SP1用的是aptsudo apt update sudo apt install 软件包名UOS也是aptsudo apt update sudo apt install 软件包名但UOS默认的软件源需要激活才能用没激活的话只能从ISO里的本地源安装。本地源的配置方法是在/etc/apt/sources.list里加一行deb file:///media/cdrom/apt/ ./然后apt update就能从光盘源装软件了。9. 最后分享几个实用技巧技巧一用validrive测试U盘真实性市面上很多U盘是扩容盘标称64GB实际只有8GB。用validrive或者Linux下的f3工具测一下避免装系统装到一半发现空间不够。技巧二GRUB2命令行模式救急如果grub.cfg写错了导致菜单出不来可以在GRUB2启动时按c进入命令行模式手动敲命令引导grub loopback loop (hd0,gpt1)/iso/kylin-v10-sp1-arm64.iso grub linux (loop)/images/pxeboot/vmlinuz consoletty0 grub initrd (loop)/images/pxeboot/initrd.img grub boot这个技能在客户现场没有备用U盘时能救命。技巧三保留一个“纯净”的GRUB2启动盘我手里常年备着一根只装了GRUB2和grub.cfg的U盘不装任何ISO。它的作用是当目标机器的系统还能进GRUB2但配置坏了时用这根盘引导进去修复。比拿安装盘进救援模式快得多。技巧四记录每台设备的启动参数不同ARM平台的最佳内核参数不一样。飞腾FT-2000/4通常不需要额外参数鲲鹏920需要加acpiforce麒麟990需要加earlycon。建议建个表格记录每台设备的型号和对应参数下次装机直接抄。平台关键内核参数备注飞腾FT-2000/4consolettyAMA0,115200串口输出鲲鹏920consolettyAMA0,115200 acpiforce强制ACPI麒麟990consolettyAMA0,115200 earlycon早期控制台飞腾D2000consolettyAMA0,115200同FT-2000这套方案我从麒麟V10 SP1一直用到SP3UOS从20用到1060中间除了ISO内部路径偶尔变化需要更新grub.cfg之外整体框架没动过。一根64GB的U盘能装下四五个ISO覆盖飞腾、鲲鹏、麒麟三大平台出差带一根就够了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询