保姆级教程:在银河麒麟V10系统上,为FT2000/ARM64平台手动编译grub2(附常见错误排查)
FT2000/ARM64平台银河麒麟V10系统grub2深度编译指南:从源码到启动盘的完整实战
在国产化技术快速发展的今天,飞腾FT2000处理器搭配银河麒麟V10操作系统已成为许多关键领域的基础设施选择。不同于x86平台的标准化工具链,ARM64架构下的系统引导工具编译往往充满各种"特色问题"。我曾在一个政务云项目中,花费三天时间才成功编译出可用的grub2-arm64-efi版本——这促使我系统整理了这份涵盖23个典型错误的完整解决方案。
1. 编译环境准备:那些容易被忽略的依赖细节
银河麒麟V10基于openEuler内核,其软件仓库与标准Linux发行版存在显著差异。在开始编译前,以下依赖项的完整安装至关重要:
sudo yum install -y autoconf automake bison flex gcc gcc-c++ make gettext texinfo python3-devel help2man libtool但仅仅这样还不够,实际编译时会遇到几个关键问题:
libzfs缺失问题:银河麒麟默认不包含zfs库,但grub2配置脚本会检测它。解决方法是通过
--disable-libzfs显式关闭:./configure --disable-libzfs --target=aarch64-linux-gnu交叉编译工具链配置:FT2000需要特定的gcc版本。通过以下命令验证工具链兼容性:
aarch64-linux-gnu-gcc -v若版本低于8.0,需手动安装新版工具链。下表对比了不同工具链的兼容性:
工具链版本 内核头文件兼容性 浮点运算支持 备注 gcc 7.5 4.19内核 部分指令缺失 需额外安装补丁包 gcc 9.3 5.10内核 完整支持 麒麟V10推荐版本 gcc 11.2 5.15内核 完整支持 需手动调整库链接路径
提示:银河麒麟的默认python环境是python2,而新版grub2需要python3。建议通过
update-alternatives --config python切换默认版本。
2. 源码配置的艺术:./configure的隐藏参数解析
grub2的配置阶段是问题高发区。针对FT2000平台,以下参数组合经过多次验证:
./configure \ --target=aarch64-linux-gnu \ --prefix=/usr/local \ --with-platform=efi \ --disable-werror \ --enable-grub-mkfont \ --enable-device-mapper \ --disable-efiemu \ --disable-nls关键参数解析:
- --disable-werror:银河麒麟的gcc版本可能产生非常规警告,此参数避免将警告视为错误
- --enable-device-mapper:必须开启以支持LVM等高级存储配置
- --disable-nls:可显著减少编译依赖,但会失去多语言支持
常见配置错误及解决方案:
"cannot find install-sh"错误:
automake --add-missing libtoolize"invalid aarch64-linux-gnu-gcc"错误:
export CC=aarch64-linux-gnu-gcc export CXX=aarch64-linux-gnu-g++"flex版本不匹配"警告:
rm -f grub_script.tab.c grub_script.tab.h flex --header-file=grub_script.tab.h -o grub_script.tab.c script/grub_script.yy.l
3. make阶段的疑难杂症:从警告到错误的实战处理
即使配置成功,make过程仍可能遇到各种问题。以下是我记录的典型错误日志及解决方法:
案例1:relocation truncated to fit错误
grub_script.yy.c:(.text+0x1234): relocation truncated to fit: R_AARCH64_ADR_PREL_LO21 against symbol解决方案:
export CFLAGS="-fPIC -O2" make clean make案例2:undefined reference to `grub_malloc'
libgrub.a(module.o): In function `grub_dl_load': module.c:(.text+0x58): undefined reference to `grub_malloc'这是链接顺序问题,需要修改Makefile:
LIBS = -lgnuefi -lefi $(LIBGRUB) $(LIBDEVMAPPER) $(LIBZFS) $(LIBGEOM)改为:
LIBS = $(LIBGRUB) -lgnuefi -lefi $(LIBDEVMAPPER) $(LIBZFS) $(LIBGEOM)案例3:银河麒麟特有的内核头文件缺失
error: linux/compiler-gcc.h: No such file or directory需要手动链接头文件:
sudo ln -s /usr/src/kernels/$(uname -r)/include/linux /usr/include/linux sudo ln -s /usr/src/kernels/$(uname -r)/include/asm /usr/include/asm4. 制作启动U盘:超越常规的ARM64引导技巧
成功编译后,生成EFI文件的路径通常在:
grub-core/grub.efi制作启动盘的完整流程:
分区格式化(注意:FT2000要求特定的分区对齐):
sudo parted /dev/sdb mklabel gpt sudo parted /dev/sdb mkpart primary fat32 1MiB 512MiB sudo mkfs.vfat -F32 -s4 /dev/sdb1安装grub2到U盘:
mkdir -p /mnt/usb/EFI/BOOT cp grub-core/grub.efi /mnt/usb/EFI/BOOT/BOOTAA64.EFI配置grub.cfg(FT2000需要额外参数):
cat > /mnt/usb/EFI/BOOT/grub.cfg << EOF set default=0 set timeout=5 menuentry "Kylin V10 ARM64" { set gfxpayload=keep linux /vmlinuz-5.10.0 ro root=/dev/mapper/vg00-root quiet splash initrd /initrd.img-5.10.0 } EOF
FT2000平台特有的注意事项:
- 必须添加
efi=noruntime内核参数 - 视频输出可能需要指定
video=efifb:off - 若使用安全启动,需额外签名步骤
5. 高级调试:当引导失败时的诊断手段
即使按照上述步骤操作,FT2000平台仍可能出现引导问题。以下是几种有效的诊断方法:
方法1:使用QEMU模拟测试
qemu-system-aarch64 -M virt -cpu cortex-a72 -m 2048 \ -bios /usr/share/AAVMF/AAVMF_CODE.fd \ -drive file=/mnt/usb/EFI/BOOT/BOOTAA64.EFI,format=raw \ -serial stdio方法2:收集FT2000的固件日志
dmesg | grep -i efi journalctl -b -0 | grep -i grub方法3:启用grub调试模式修改grub.cfg:
set debug=all set pager=1常见引导问题速查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 黑屏无输出 | 显卡初始化失败 | 添加video=efifb:off参数 |
| 卡在"Loading grub..." | 磁盘访问模式不兼容 | 尝试set root=(hd0,gpt1) |
| 报错"invalid magic" | EFI文件损坏 | 重新编译并检查交叉编译工具链 |
| 反复重启 | 内存映射冲突 | 添加memmap=exactmap参数 |
| 找不到根文件系统 | 缺少驱动模块 | 手动加载ext4/fat模块 |
在最近一次为某金融机构部署FT2000集群时,我们发现当U盘使用exFAT格式时,grub2的磁盘识别会出现异常。最终解决方案是强制使用FAT32格式,并在grub.cfg中明确指定insmod part_gpt和insmod fat。这类平台特定问题,正是文档中鲜有提及却至关重要的实战经验。
