Linux 引导修复与多系统共存方案

12次阅读

bios+mbr 下“embedding is not possible”需确保 /boot 分区从第 2048 扇区起始(1mb 对齐),用 fdisk/parted 检查并重分区;禁用 –force,改用 grub-install –target=i386-pc –recheck –debug /dev/sdx 排查。

Linux 引导修复与多系统共存方案

grub-install 报错“embedding is not possible”怎么办

这是 BIOS + MBR 模式下最常遇到的引导修复失败提示,本质是 GRUB 2 无法在主引导记录(MBR)后预留的“空闲扇区”里写入 core.img——通常因为分区起始位置太靠前、磁盘用了 Advanced Format(4K 扇区)、或存在 LVM/ 加密 /RAID 等干扰结构。

  • 确认当前启动模式:ls /sys/firmware/efi 有输出才是 UEFI;没输出且 fdisk -l 显示 DOS 分区表,就是 BIOS+MBR
  • BIOS+MBR 下必须保证 /boot 所在分区从第 2048 扇区起始(1MB 对齐),用 fdiskparted 检查 Start 列数值,小于 2048 就得重分区(备份数据!)
  • 不要强行加 --force:它可能绕过检查但导致后续启动失败
  • 正确做法是先用 grub-install --target=i386-pc --recheck --debug /dev/sdX/dev/sdX 是磁盘,不是分区),观察日志里 embedding area 是否被识别

Windows 和 Linux 双系统启动项不显示对方

GRUB 默认通过 os-prober 扫描其他系统的启动文件,但它在多数发行版中默认禁用,且对 Windows Boot Manager(尤其是 UEFI 模式)识别不稳定。

  • Ubuntu 22.04+ 默认关闭 os-prober,需手动启用:编辑 /etc/default/grub,确保有 GRUB_DISABLE_OS_PROBER=false
  • 运行 sudo os-prober 看是否能列出 Windows 分区(如 /dev/nvme0n1p1);若无输出,可能是 Windows 启动分区未挂载或被 BitLocker 加密
  • UEFI 多系统时,os-prober 常漏掉 Windows,此时应直接配置链式启动:在 /etc/grub.d/40_custom 中添加:
    menuentry 'Windows Boot Manager' {insmod part_gpt   insmod fat   set root='hd0,gpt1'   chainloader /EFI/Microsoft/Boot/bootmgfw.efi}

    注意 hd0,gpt1 要按实际 EFI 系统分区调整,用 lsblk -fsudo blkid 确认

UEFI 模式下 grub-mkconfig 不生成 Windows 启动项

这不是 grub-mkconfig 的问题,而是它根本不负责发现操作系统——它只读取 /boot/grub/grub.cfg 模板和 /etc/grub.d/ 下脚本。Windows 条目依赖 os-prober 输出,而该工具在 UEFI 下对 FAT32 格式的 ESP 分区支持脆弱。

  • 先确认 ESP 分区已挂载到 /boot/efimount | grep efi),且权限可读:ls /boot/efi/EFI/Microsoft/Boot/ 应能看到 bootmgfw.efi
  • os-prober 仍不工作,别硬等,直接手写启动项(见上一条),并确保 /etc/default/grub 中有 GRUB_TIMEOUT_STYLE=menu,否则即使条目存在也可能跳过菜单
  • 注意:某些 OEM 机器(如 Dell、Lenovo)会在 ESP 里放多个 bootmgfw.efi 变体(带版本号或厂商前缀),os-prober 只认标准路径,手写时得自己找对文件

修复后进不了 Linux,卡在“Loading initial ramdisk……”

这说明 GRUB 成功加载了内核,但 initramfs 无法挂载根文件系统——常见于根分区 UUID 变更、LVM 名称变动、或加密卷密钥未正确注入 initramfs。

  • 重启进 GRUB 菜单,按 e 编辑启动项,在 linux 行末尾临时加 rd.debug systemd.log_level=4,看卡在哪一步(比如停在 dracut-initqueue 就是根设备找不到)
  • 检查当前根设备是否匹配:lsblk -f 查 UUID,再对比 /etc/fstab/etc/crypttab(如有加密)里的配置
  • 如果改过 LVM 卷名或 VG 名,dracut --regenerate-all --force 重新生成 initramfs(CentOS/RHEL)或 update-initramfs -u -k all(Debian/Ubuntu)
  • 最容易被忽略的是:UEFI 模式下,如果 ESP 分区挂载点从 /boot/efi 改成别的路径(如 /efi),grub-install 会失败,但错误不明显,导致后续所有引导操作都不可靠

事情说清了就结束

text=ZqhQzanResources