ARM64银河麒麟V10SP1下grub-mkrescue定制ISO的编译、修复与Ventoy部署实战
1. ARM64银河麒麟V10SP1环境准备
在开始定制ISO之前,我们需要先准备好编译环境。银河麒麟V10SP1作为国产操作系统的代表,其ARM64架构下的软件生态与传统x86环境存在差异,这也是导致grub-mkrescue工具链问题的根源。
首先确认系统版本信息:
cat /etc/kylin-release uname -a我实测发现,默认安装的银河麒麟V10SP1缺少部分编译工具链。需要安装以下基础依赖包:
sudo apt update sudo apt install -y build-essential automake autoconf libtool bison flex特别提醒:ARM64架构下的包管理有时会遇到依赖冲突。如果遇到问题,可以尝试先卸载冲突包再重新安装。我在实际操作中就遇到过libtool版本不兼容的情况,通过以下方式解决:
sudo apt remove libtool libtool-bin sudo apt install -y libtool-bin2. grub源码编译与修复
2.1 获取grub源码
官方grub源码在ARM64架构下存在一些适配问题。建议使用银河麒麟官方提供的源码包,或者从可信镜像站获取:
wget https://mirrors.aliyun.com/gnu/grub/grub-2.06.tar.gz tar -xzvf grub-2.06.tar.gz cd grub-2.062.2 配置编译参数
关键是要指定正确的目标平台和工具链:
./configure --target=aarch64 --with-platform=efi这里有个坑需要注意:银河麒麟的默认编译器路径可能与标准Ubuntu不同。如果遇到编译器找不到的问题,可以显式指定:
CC=/usr/bin/gcc ./configure --target=aarch64 --with-platform=efi2.3 解决Synchronous Exception报错
这个经典错误通常是由于内存地址对齐问题导致的。我们需要修改源码中的两处关键位置:
- 修改
grub-core/kern/arm64/dl.c文件:
// 修改前 #define ALIGN_UP(addr, align) (((addr) + (align)-1) & ~((align)-1)) // 修改后 #define ALIGN_UP(addr, align) (((addr) + (align)-1) & ~((typeof(addr))((align)-1)))- 修改
grub-core/loader/arm64/linux.c文件中的内存映射逻辑。
修改完成后重新编译:
make -j$(nproc) sudo make install3. 定制ISO镜像制作
3.1 准备ISO目录结构
创建一个标准的工作目录:
mkdir -p custom_iso/{boot/grub,efi/boot}将编译好的grub模块复制到目标位置:
cp /usr/lib/grub/arm64-efi/* custom_iso/boot/grub/3.2 编写grub.cfg配置文件
创建custom_iso/boot/grub/grub.cfg文件:
set timeout=5 menuentry "Kylin V10SP1 ARM64" { insmod part_gpt insmod ext2 set root=(hd0,gpt1) linux /vmlinuz root=/dev/sda1 initrd /initrd.img }3.3 使用grub-mkrescue生成ISO
现在可以运行修复后的grub-mkrescue:
grub-mkrescue -o kylin_custom.iso custom_iso/如果遇到"xorriso not found"错误,需要额外安装:
sudo apt install -y xorriso4. Ventoy部署实战
4.1 准备Ventoy环境
首先下载Ventoy的ARM64版本:
wget https://github.com/ventoy/Ventoy/releases/download/v1.0.88/ventoy-1.0.88-linux.tar.gz tar -xzvf ventoy-1.0.88-linux.tar.gz cd ventoy-1.0.884.2 制作可启动U盘
插入U盘后(建议容量≥8GB),执行:
sudo ./Ventoy2Disk.sh -i /dev/sdX注意:这里的/dev/sdX需要替换为实际的U盘设备名,可以通过lsblk命令确认。我曾经不小心把系统盘当成了U盘,差点酿成悲剧。
4.3 添加自定义ISO
将生成的kylin_custom.iso直接拷贝到U盘的第一个分区:
mount /dev/sdX1 /mnt cp kylin_custom.iso /mnt/ umount /mnt4.4 解决常见启动问题
如果启动时遇到"invalid signature"错误,需要在BIOS中关闭Secure Boot。我在某台飞腾2000设备上就遇到过这个问题,折腾了半天才发现是这个原因。
另一个常见问题是内存不足,可以通过修改grub.cfg添加mem参数:
linux /vmlinuz root=/dev/sda1 mem=2048M