CentOS 7.7 + Ubuntu 18.04 双系统引导修复与GRUB2管理实战
1. 双系统引导问题的典型场景
最近在给公司服务器部署CentOS 7.7和Ubuntu 18.04双系统时,遇到了一个经典问题:安装完第二个系统后,启动菜单里只能看到一个系统选项。这种情况在混合安装不同Linux发行版时特别常见,尤其是当两个系统使用不同版本的GRUB引导程序时。
我清楚地记得那天晚上,在机房折腾到凌晨两点的经历。按照常规流程先安装了CentOS 7.7,接着安装Ubuntu 18.04,一切看起来都很顺利。但重启后却发现直接进入了CentOS,Ubuntu就像从没安装过一样。这种情况其实是因为Ubuntu的GRUB引导信息没有被正确写入主引导记录(MBR)或EFI系统分区(ESP)。
为什么会这样?主要原因有三个:
- 后安装的系统没有正确识别先安装的系统
- GRUB配置文件没有自动更新
- 两个系统使用不同版本的GRUB(CentOS用GRUB2,Ubuntu也用GRUB2但配置方式有差异)
2. 准备工作与环境确认
在开始修复之前,我们需要确认几个关键信息。首先准备一个Ubuntu 18.04的Live USB,这个将是我们修复引导的主要工具。我推荐使用Rufus或者Etcher来制作启动盘,它们比老牌的UNetbootin更稳定。
关键检查点:
- 确认BIOS模式是UEFI还是Legacy(这对修复方法有决定性影响)
- 记录下两个系统的安装位置(比如Ubuntu在/dev/sda2,CentOS在/dev/sda3)
- 准备好网络连接,因为修复过程中可能需要安装额外软件包
如何检查BIOS模式?在已安装的CentOS中执行:
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy"如果是UEFI模式,我们还需要确认EFI系统分区的位置:
lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT | grep -i efi3. 修复Ubuntu的GRUB引导
当发现只能进入CentOS时,我们需要先用Ubuntu Live USB启动系统。选择"Try Ubuntu"进入Live环境,然后打开终端开始修复流程。
第一步:挂载Ubuntu根分区假设Ubuntu安装在/dev/nvme0n1p2(根据实际情况调整):
sudo mount /dev/nvme0n1p2 /mnt如果是UEFI启动,还需要挂载EFI分区(通常是/dev/nvme0n1p1):
sudo mount /dev/nvme0n1p1 /mnt/boot/efi第二步:安装GRUB到正确位置
sudo grub-install --root-directory=/mnt /dev/nvme0n1第三步:更新GRUB配置
sudo chroot /mnt update-grub这个过程中,update-grub应该能自动检测到CentOS的存在。如果没看到CentOS的启动项,可能是os-prober没运行,可以手动执行:
grub-mkconfig -o /boot/grub/grub.cfg4. 处理CentOS的GRUB2配置
有时候问题会反过来:更新内核后,CentOS的启动项消失了。这是因为CentOS使用GRUB2的方式与Ubuntu略有不同。
进入CentOS系统后(可以通过Live USB临时启动),执行:
sudo mount /dev/nvme0n1p3 /mnt # 假设CentOS在p3 sudo mount /dev/nvme0n1p1 /mnt/boot/efi # 挂载EFI分区 sudo chroot /mnt grub2-install /dev/nvme0n1 grub2-mkconfig -o /boot/grub2/grub.cfg关键区别点:
- CentOS使用grub2-前缀的命令
- 配置文件路径是/boot/grub2/grub.cfg
- 如果使用UEFI,可能需要额外参数:--efi-directory=/boot/efi
5. 统一引导管理的终极方案
经过上述步骤,你可能已经能选择进入两个系统了。但为了长期稳定,我推荐让Ubuntu的GRUB作为主引导管理器,因为它对多系统支持更好。
优化GRUB菜单:编辑/etc/default/grub文件(在Ubuntu中):
sudo nano /etc/default/grub修改以下参数:
GRUB_TIMEOUT=10 GRUB_TIMEOUT_STYLE=menu GRUB_DISABLE_OS_PROBER=false然后更新配置:
sudo update-grub常见问题排查:
如果启动时出现"error: unknown filesystem":
- 可能是UUID变化导致,检查/boot/grub/grub.cfg中的UUID与实际分区是否匹配
- 使用blkid命令查看当前分区UUID
如果GRUB Rescue模式:
set prefix=(hd0,gpt2)/boot/grub set root=(hd0,gpt2) insmod normal normal
6. 高级技巧与注意事项
多内核版本管理:当你在CentOS中安装新内核(比如RT内核)后,可能需要手动更新GRUB:
sudo grub2-mkconfig -o /boot/grub2/grub.cfgGRUB自定义主题(可选):如果你厌倦了黑底白字的GRUB界面,可以安装主题:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt update sudo apt install grub-customizer安全建议:
- 定期备份/boot/grub/grub.cfg和/etc/default/grub
- 修改GRUB菜单前先做备份
- 考虑设置GRUB密码防止未授权修改
7. 实际案例:FlexRAN测试环境搭建
回到最初的需求:搭建FlexRAN测试环境。在成功解决双系统引导问题后,还需要特别注意:
- CentOS 7.7需要安装实时内核:
sudo yum install kernel-rt- 更新GRUB后确认RT内核选项出现:
sudo grub2-set-default "CentOS Linux (3.10.0-1127.rt56.1093.el7.x86_64) 7 (Core)" sudo grub2-mkconfig -o /boot/grub2/grub.cfg- 在Ubuntu中确保能正确识别CentOS的RT内核选项:
sudo update-grub经过这些步骤,现在每次启动时,GRUB菜单会清晰显示Ubuntu 18.04和CentOS 7.7(包括常规内核和RT内核)的所有选项,测试团队可以根据需要自由选择进入哪个环境。整个修复过程最关键的体会是:理解GRUB的工作原理比记住具体命令更重要。当你知道GRUB是如何扫描各分区、如何生成配置文件时,遇到问题就能自己分析解决,而不是盲目尝试各种教程中的命令。
