在同一台物理服务器或虚拟机上实现 Ubuntu 和 CentOS 的双启动(Dual Boot),核心逻辑其实并不复杂:分区规划 + 引导加载器(GRUB)配置。
但在动手之前,必须先明确一个关键前提:你是在裸金属服务器(Bare Metal)还是云厂商的 ECS/CVM 实例上操作?
如果是云服务器(如阿里云、腾讯云、AWS等):
- 官方建议:绝大多数云厂商不支持在单块系统盘上通过 GRUB 双启动。因为云服务器的底层 Hypervisor(虚拟化层)通常只挂载一块主磁盘作为根文件系统,且启动流程由云平台控制。
- 变通方案:如果必须双系统,通常做法是创建第二块数据盘,安装第二个系统,然后通过
chroot或网络方式访问,但这不算真正的“开机选择”。或者使用容器化/虚拟机嵌套方案。 - 结论:如果你用的是标准云服务器镜像,请放弃双启动念头,改用多实例或多容器方案。
以下回答针对的是本地物理机、自建私有云节点、或允许自定义引导的 KVM/Xen 虚拟机场景。
核心原理
- 独立分区:Ubuntu 和 CentOS 需要各自独立的
/(根)、/boot(可选,但推荐独立以便管理)、/home(可选共享或独立)以及swap分区。 - 统一引导:现代 Linux 发行版默认使用 GRUB2 作为引导加载器。我们只需要让 GRUB 同时识别两个系统的内核,并在启动菜单中列出它们即可。
- 谁主导引导:通常建议保留第一个安装的系统(比如 Ubuntu)的 GRUB 为主引导器,因为它会扫描其他分区的内核并自动添加条目。
详细操作步骤
第一步:前期准备与备份
- 备份数据:任何分区操作都有风险,务必提前备份重要数据。
- 关闭快速启动:确保 BIOS/UEFI 中关闭了 Windows 的快速启动(如果有 Windows),并关闭 Linux 的 Secure Boot(安全启动),除非你精通签名密钥配置。
- 下载 ISO:获取最新的 Ubuntu Server/Desktop ISO 和 CentOS Stream/RHEL 兼容版 ISO(推荐使用 AlmaLinux 或 Rocky Linux,因为 CentOS 8+ 已转向 Stream,适合生产环境)。
第二步:磁盘分区规划(关键)
假设你的硬盘为 /dev/sda,总大小 500GB。
| 分区 | 类型 | 大小建议 | 说明 |
|---|---|---|---|
/dev/sda1 |
EFI System Partition (ESP) | 512MB – 1GB | UEFI 模式必需,存放 grub.cfg 和内核文件。不要格式化,仅标记为 ESP |
/dev/sda2 |
swap | 8GB – 16GB | 交换空间,两个系统共用 |
/dev/sda3 |
ext4/xfs | 50GB+ | Ubuntu 根分区 (/) |
/dev/sda4 |
ext4/xfs | 剩余空间 | CentOS 根分区 (/) |
| (可选) | /home | 独立分区 | 如果希望两个系统共享用户数据,可单独划一个 /home 分区,并在两个系统中挂载同一 UUID |
注意:如果使用 LVM(逻辑卷管理器),可以更灵活地调整空间,但对于双启动新手,直接分区更直观。
第三步:安装第一个系统(以 Ubuntu 为例)
- 插入 Ubuntu ISO,启动安装程序。
- 选择 “手动分区”(Something else)。
- 按照上述规划创建分区:
/dev/sda1设为 EFI 分区,格式化为 FAT32,挂载点/boot/efi。/dev/sda2设为 swap。/dev/sda3设为 ext4,挂载点/,用于 Ubuntu。
- 关键步骤:在安装最后一步,确认引导加载器安装位置。
- 确保将 GRUB 安装在
/dev/sda(整个磁盘)而不是某个分区上。 - 完成安装并重启。此时你应该能进入 Ubuntu。
- 确保将 GRUB 安装在
第四步:安装第二个系统(CentOS)
- 插入 CentOS ISO,再次启动。
- 同样选择 “手动分区”。
- 重要:
- 不要格式化
/dev/sda1(EFI 分区)!让它保持原样。 /dev/sda4设为 ext4(或 xfs),挂载点/,用于 CentOS。/dev/sda2(swap)可以复用,或者新建一个 swap 分区。
- 不要格式化
- 完成安装。CentOS 安装程序通常会检测到已有的 GRUB,并尝试更新它。如果没有,稍后需手动修复。
第五步:验证与修复 GRUB
重启电脑,观察 GRUB 菜单是否同时出现了 Ubuntu 和 CentOS 的选项。
情况 A:完美出现
恭喜你,直接跳过此步。
情况 B:只有 Ubuntu,没有 CentOS
这是因为 CentOS 的内核没有被 Ubuntu 的 GRUB 正确识别。我们需要手动添加。
- 进入 Ubuntu 系统。
- 打开终端,查找 CentOS 的根分区 UUID:
sudo blkid # 找到 /dev/sda4 对应的 UUID - 挂载 CentOS 的根分区以检查内核路径:
sudo mkdir /mnt/centos sudo mount /dev/sda4 /mnt/centos ls /mnt/centos/boot # 查看是否有 vmlinuz-xxx 和 initrd.img-xxx 文件 - 编辑 GRUB 配置文件:
sudo nano /etc/grub.d/40_custom - 在文件末尾添加以下内容(替换为你实际的 UUID 和内核版本):
menuentry "CentOS Linux" { insmod part_gpt insmod ext2 set root='hd0,gpt4' # 根据实际分区调整,sda4 对应 gpt4 linux /boot/vmlinuz-$(uname -r) root=UUID=你的CENTOS_ROOT_UUID ro quiet splash initrd /boot/initramfs-$(uname -r).img }更稳妥的方法:直接使用
find命令定位内核,避免硬编码路径出错。例如:menuentry "CentOS" { search --no-floppy --fs-uuid --set=root 你的CENTOS_ROOT_UUID linux /boot/vmlinuz-xx root=UUID=你的CENTOS_ROOT_UUID ro initrd /boot/initramfs-xx.img } - 保存并更新 GRUB:
sudo update-grub - 重启测试。
情况 C:只有 CentOS,没有 Ubuntu
同理,进入 CentOS 系统,执行 grub2-mkconfig -o /boot/grub2/grub.cfg 或类似命令,CentOS 的 GRUB 通常会自动扫描其他分区的内核。如果没扫到,同样编辑 /etc/grub.d/40_custom 手动添加 Ubuntu 条目。
常见问题与坑
-
时间不同步问题
- Ubuntu 默认将硬件时钟视为 UTC。
- CentOS/RHEL 有时默认将硬件时钟视为本地时间(取决于版本和配置)。
- 解决:在两个系统中都设置
timedatectl set-local-rtc 0并确保 NTP 服务运行正常,避免时间偏差导致日志混乱。
-
网卡名称变化
- Ubuntu 可能使用
eth0或ens33,CentOS 可能使用eth0或ens33。 - 如果两个系统对同一网卡的命名策略冲突,可能导致启动时网络接口未激活。建议在每个系统的
/etc/netplan/(Ubuntu) 或/etc/sysconfig/network-scripts/(CentOS) 中固定 MAC 地址绑定,或使用 NetworkManager 统一管理。
- Ubuntu 可能使用
-
Secure Boot 问题
- 如果启用了 Secure Boot,非签名的第三方内核模块(如 NVIDIA 驱动、VirtualBox 模块)可能无法加载。
- 解决:双启动环境下,建议直接在 BIOS 中禁用 Secure Boot,除非你愿意折腾 MOK(Machine Owner Key)注册。
-
磁盘顺序变化
- 在某些主板 BIOS 中,插入 USB 安装盘可能改变磁盘编号(从 sda 变成 sdb)。这会导致 GRUB 中的
hd0,gpt4引用失效。 - 解决:始终使用 UUID 而非设备名(如
/dev/sda4)来编写 GRUB 条目,UUID 是永久不变的。
- 在某些主板 BIOS 中,插入 USB 安装盘可能改变磁盘编号(从 sda 变成 sdb)。这会导致 GRUB 中的
更推荐的替代方案
如果你的目标是“在一台机器上使用两种不同的 Linux 发行版”,双启动并不是唯一或最佳选择:
-
虚拟机(KVM/QEMU):
- 主机用 Ubuntu,Guest 用 CentOS(或反之)。
- 优势:隔离性好,快照方便,性能损耗小(近原生)。
- 工具:
virt-manager,Vagrant,Proxmox VE。
-
Docker/Containerd:
- 如果只是为了跑特定软件,可以在 Ubuntu 主机上运行 CentOS 容器。
- 优势:轻量级,秒级启动。
- 局限:内核级别依赖的软件(如内核模块开发)无法容器化。
-
WSL2 (Windows Subsystem for Linux):
- 如果你在 Windows 电脑上工作,可以直接在 WSL2 中运行 Ubuntu 和 CentOS 实例,无需重启。
总结
双启动技术上是可行的,但维护成本较高(每次内核升级都要检查 GRUB 配置)。对于大多数开发者和管理员来说,“一台主力机 + 虚拟机” 的组合远比双启动实用和稳定。除非你有特殊的硬件兼容性需求或必须独占资源,否则不建议在生产环境中采用传统双启动方案。
云技术博客