OpenKylin 3.0 不可变系统(OSTree)GRUB 修复教程
不建议盲目支持国产系统,毕竟它确实还不及Win稳定与兼容。
目前我使用OpenKylin3.0(以下简称OK)遇到的棘手问题包括:①奔腾金G5420输入法问题1,②WPS输入法光标不可见和快捷键冲突问题(复制、粘贴、保存等快捷键不可用,暂时没去解决),③开机GRUB菜单只剩Windows无openKylin项(本教程)。
综上所述,除爱好者和单位要求外,不建议一般用户用于日常办公。希望共同的努力,有助于国产系统的不断进步(相比于OK2.0sp1使用体验2,已然进步不少)。
本教程适用场景
OpenKylin 3.0 OSTree 不可变系统,根由 /ostree/deploy/… 管理
UEFI + GPT 双系统,另一系统为 Windows
开机 GRUB 菜单只剩 Windows,无 openKylin 项(说明 UEFI 固件、ESP 分区及 .efi 文件正常,问题在 GRUB 配置层)
原理简述
OSTree 系统的 GRUB 菜单不由 /boot/vmlinuz 生成,而是通过 /etc/grub.d/15_ostree 读取 boot/loader/entries/*.conf 中的参数(linux、initrd、ostree= 等),调用 ostree admin instutil grub2-generate 输出 menuentry。若缺 /etc/default/grub 或 GRUB_ENABLE_BLSCFG 设置不当,15_ostree 会跳过,导致菜单只剩 Windows。
应对指出,本教程只涉及grub修复,不需要修改ESP 分区及 .efi 文件,因此与之前的教程linux引导修复记_2025.9.43不同。
修复过程
第一阶段:准备工具
1. 启动到 OpenKylin Live USB 环境
2. 打开终端,获取 root 权限:
sudo -i
第二阶段:检查和修复
1.查看磁盘分区信息:
fdisk -l
#或使用更详细的工具:
blkid
2. 识别关键分区(记录分区号和UUID):
• EFI 系统分区 (ESP):通常是较小的 FAT32 分区 (100MB-500MB)
• OpenKylin 根分区:通常是较大的 ext4 分区
• 若系统设置了/boot挂载点,也应记录
注意,读者可参考本文的后续代码,但不同电脑的分区代码不同,需要自行修改。
3. 设置分区变量(根据实际分区修改)
ROOT_PART="/dev/sda4" # 存放 /boot/grub/grub.cfg 的分区(通常为根分区)
ESP_PART="/dev/sda1" # EFI 系统分区
ROOT_UUID="204c9d8b-577e-4b46-ab14-194f0b179a58" # 根分区 UUID(blkid 查询)
ESP_UUID="57F3-E952" # ESP 分区 UUID(efi 所在)
# 若系统设置了/boot挂载点,还须设置 BOOT_PART="/dev/sdaX" ; BOOT_UUID="xxxx",后续也须调整,本教程不复提醒
4. 挂载分区并查看现状
挂载分区
mkdir -p /mnt/linux /mnt/linux/boot/efi
mount ${ROOT_PART} /mnt/linux
mount ${ESP_PART} /mnt/linux/boot/efi
查看OK3.0系统情况,记录系统哈希值、内核版本
# 查看系统哈希
ls /mnt/linux/boot/ostree/ # 输出结果应为:openkylin-xxxx
# 设置哈希值(根据上一步的结果修改)
OSTREE_COMMIT="8f2e6df9b0013222672ba32a81478279a8ada5d4df6c182d4cb7e53f4f174d2a"
# 查看内核版本
ls /mnt/linux/boot/ostree/openkylin-${OSTREE_COMMIT}/
# 输出结果应为:initramfs-xx-generic.img vmlinuz-xx-generic
# 设置内核版本值(根据上一步的结果修改)
KERNEL_VER="7.0.0-2-generic"
5. 检查grub
检测grub
# 检查 grub.cfg 内容 'Windows Boot Manager'
grep -E "menuentry|ostree=|vmlinuz-${KERNEL_VER}" /mnt/linux/boot/grub/grub.cfg
# 若输出中包含类似 menuentry 'openKylin ...' 且含有 ostree=/ostree/boot.0/.../0 的行 → GRUB 配置正常,问题可能出在 UEFI 启动顺序或 ESP 文件(参考:linux引导修复记_2025.9.4)
# 若输出无openKylin项只有 Windows Boot Manager,或完全为空,先通过手写grub.cfg 进系统,再按后文步骤修复。
# 检查 loader entries
ls /mnt/linux/boot/loader/entries/
cat /mnt/linux/boot/loader/entries/ostree-*.conf
# 若列出 ostree-1.conf、ostree-2.conf 等文件,且每个文件内容包含 title、linux、initrd、options root=UUID=... ostree=... → OSTree 部署数据完好,生成器所需参数齐全,问题在于生成器未被正确调用,继续按本教程修复即可。
# 若文件不存在,或文件为空,或若文件存在但 options 行缺少 ostree= 或 root=UUID= 不正确,则需要从备份恢复、或手动修复 entries 文件或考虑重新安装系统(出于篇幅考虑,本教程不考虑这类情况,请自行联系专业人员)。
6. 应急:手写 grub.cfg 进系统
若上一步检查发现grub.cfg缺少openKylin项(或为空),且loader entries正常,我们先手写 grub.cfg 进系统。
# 备份grub.cfg
cp /mnt/linux/boot/grub/grub.cfg /mnt/linux/boot/grub/grub.cfg.bak
# 手写 grub.cfg
cat > /mnt/linux/boot/grub/grub.cfg <<EOF
set timeout=10
set default=0
insmod all_video part_gpt ext2 fat
menuentry 'openKylin v3.0 (current)' {
search --fs-uuid --set=root ${ROOT_UUID}
linux /boot/ostree/openkylin-${OSTREE_COMMIT}/vmlinuz-${KERNEL_VER} root=UUID=${ROOT_UUID} rw ostree=/ostree/boot.0/openkylin/${OSTREE_COMMIT}/0
initrd /boot/ostree/openkylin-${OSTREE_COMMIT}/initramfs-${KERNEL_VER}.img
}
menuentry 'openKylin v3.0 (previous)' {
search --fs-uuid --set=root ${ROOT_UUID}
linux /boot/ostree/openkylin-${OSTREE_COMMIT}/vmlinuz-${KERNEL_VER} root=UUID=${ROOT_UUID} rw ostree=/ostree/boot.0/openkylin/${OSTREE_COMMIT}/1
initrd /boot/ostree/openkylin-${OSTREE_COMMIT}/initramfs-${KERNEL_VER}.img
}
menuentry 'Windows Boot Manager' {
search --fs-uuid --set=root ${ESP_UUID}
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF
# 检测grub配置
grub-script-check /mnt/linux/boot/grub/grub.cfg && echo OK
# 卸载分区(自动递归卸载子目录),同步数据,重启系统(重启时应拔出liveCD)
umount -R /mnt/linux; sync; reboot
不出意外的话,重启后应该能进入系统了。
7. 进系统后根治:补 /etc/default/grub 并 update-grub
创建默认配置(使 15_ostree 正常工作)
# 备份旧的 default/grub(如果有)
sudo cp /etc/default/grub /etc/default/grub.bak.$(date +%s) 2>/dev/null
# 写入最小配置
sudo tee /etc/default/grub <<'EOF'
GRUB_DEFAULT=0
GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=menu
GRUB_DISTRIBUTOR=openKylin
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=true
GRUB_ENABLE_BLSCFG=false
EOF
# 生成 GRUB 配置
sudo update-grub
校验生成的配置文件
# 校验生成的配置文件
sudo grub-script-check /boot/grub/grub.cfg && echo "语法正确"
sudo grep -E "menuentry.*openkylin|ostree=/ostree/boot\.0" /boot/grub/grub.cfg
sudo grep -qi "Windows Boot Manager" /boot/grub/grub.cfg && echo "Windows 项存在" || echo "Windows 项缺失"
# 仅在 Windows 项缺失时追加固定项(根据实际情况,修改:--set=root UUID)
if ! sudo grep -qi "Windows Boot Manager" /boot/grub/grub.cfg; then
sudo tee /etc/grub.d/41_windows <<'EOF'
#!/bin/sh
exec tail -n +3 "$0"
menuentry 'Windows Boot Manager' {
insmod part_gpt
insmod fat
search --fs-uuid --set=root 57F3-E952
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF
sudo chmod +x /etc/grub.d/41_windows
sudo update-grub
echo "已追加 Windows 固定项"
else
echo "Windows 项已存在,无需追加"
fi
最终校验
sudo grub-script-check /boot/grub/grub.cfg && echo "最终语法正确"
sudo grep -E "menuentry|ostree=|Windows Boot Manager" /boot/grub/grub.cfg
不出意外的话,再重启后一切正常。 (首次重启可能较慢或短暂黑屏)
验证与后续维护
重启后应有 openKylin(当前/恢复/工厂)和 Windows 菜单
以后系统更新后,执行 sudo update-grub 即可自动刷新菜单
若仍无 openKylin 项,检查 /etc/default/grub 是否存在、GRUB_ENABLE_BLSCFG=false 是否生效
参考链接:
1. 奔腾金G5420输入法问题 https://www.doubao.com/thread/xhLlqyqoQG9NNOCzo
2. 开放麒麟操作系统openKylin一月使用体验 开放麒麟操作系统openKylin一月使用体验 - #9,来自 正言2025
3. linux引导修复记_2025.9.4 linux引导修复记_2025.9.4