努力
加油

如何在同一台服务器上安装并双启动Ubuntu和CentOS?

在同一台物理服务器或虚拟机上实现 Ubuntu 和 CentOS 的双启动(Dual Boot),核心逻辑其实并不复杂:分区规划 + 引导加载器(GRUB)配置。

但在动手之前,必须先明确一个关键前提:你是在裸金属服务器(Bare Metal)还是云厂商的 ECS/CVM 实例上操作?

如果是云服务器(如阿里云、腾讯云、AWS等):

  • 官方建议:绝大多数云厂商不支持在单块系统盘上通过 GRUB 双启动。因为云服务器的底层 Hypervisor(虚拟化层)通常只挂载一块主磁盘作为根文件系统,且启动流程由云平台控制。
  • 变通方案:如果必须双系统,通常做法是创建第二块数据盘,安装第二个系统,然后通过 chroot 或网络方式访问,但这不算真正的“开机选择”。或者使用容器化/虚拟机嵌套方案。
  • 结论:如果你用的是标准云服务器镜像,请放弃双启动念头,改用多实例或多容器方案。

以下回答针对的是本地物理机、自建私有云节点、或允许自定义引导的 KVM/Xen 虚拟机场景。


核心原理

  1. 独立分区:Ubuntu 和 CentOS 需要各自独立的 /(根)、/boot(可选,但推荐独立以便管理)、/home(可选共享或独立)以及 swap 分区。
  2. 统一引导:现代 Linux 发行版默认使用 GRUB2 作为引导加载器。我们只需要让 GRUB 同时识别两个系统的内核,并在启动菜单中列出它们即可。
  3. 谁主导引导:通常建议保留第一个安装的系统(比如 Ubuntu)的 GRUB 为主引导器,因为它会扫描其他分区的内核并自动添加条目。

详细操作步骤

第一步:前期准备与备份

  1. 备份数据:任何分区操作都有风险,务必提前备份重要数据。
  2. 关闭快速启动:确保 BIOS/UEFI 中关闭了 Windows 的快速启动(如果有 Windows),并关闭 Linux 的 Secure Boot(安全启动),除非你精通签名密钥配置。
  3. 下载 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 为例)

  1. 插入 Ubuntu ISO,启动安装程序。
  2. 选择 “手动分区”(Something else)。
  3. 按照上述规划创建分区:
    • /dev/sda1 设为 EFI 分区,格式化为 FAT32,挂载点 /boot/efi。
    • /dev/sda2 设为 swap。
    • /dev/sda3 设为 ext4,挂载点 /,用于 Ubuntu。
  4. 关键步骤:在安装最后一步,确认引导加载器安装位置。
    • 确保将 GRUB 安装在 /dev/sda(整个磁盘)而不是某个分区上。
    • 完成安装并重启。此时你应该能进入 Ubuntu。

第四步:安装第二个系统(CentOS)

  1. 插入 CentOS ISO,再次启动。
  2. 同样选择 “手动分区”。
  3. 重要:
    • 不要格式化 /dev/sda1(EFI 分区)!让它保持原样。
    • /dev/sda4 设为 ext4(或 xfs),挂载点 /,用于 CentOS。
    • /dev/sda2(swap)可以复用,或者新建一个 swap 分区。
  4. 完成安装。CentOS 安装程序通常会检测到已有的 GRUB,并尝试更新它。如果没有,稍后需手动修复。

第五步:验证与修复 GRUB

重启电脑,观察 GRUB 菜单是否同时出现了 Ubuntu 和 CentOS 的选项。

情况 A:完美出现
恭喜你,直接跳过此步。

情况 B:只有 Ubuntu,没有 CentOS
这是因为 CentOS 的内核没有被 Ubuntu 的 GRUB 正确识别。我们需要手动添加。

  1. 进入 Ubuntu 系统。
  2. 打开终端,查找 CentOS 的根分区 UUID:
    sudo blkid
    # 找到 /dev/sda4 对应的 UUID
  3. 挂载 CentOS 的根分区以检查内核路径:
    sudo mkdir /mnt/centos
    sudo mount /dev/sda4 /mnt/centos
    ls /mnt/centos/boot
    # 查看是否有 vmlinuz-xxx 和 initrd.img-xxx 文件
  4. 编辑 GRUB 配置文件:
    sudo nano /etc/grub.d/40_custom
  5. 在文件末尾添加以下内容(替换为你实际的 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
    }
  6. 保存并更新 GRUB:
    sudo update-grub
  7. 重启测试。

情况 C:只有 CentOS,没有 Ubuntu
同理,进入 CentOS 系统,执行 grub2-mkconfig -o /boot/grub2/grub.cfg 或类似命令,CentOS 的 GRUB 通常会自动扫描其他分区的内核。如果没扫到,同样编辑 /etc/grub.d/40_custom 手动添加 Ubuntu 条目。


常见问题与坑

  1. 时间不同步问题

    • Ubuntu 默认将硬件时钟视为 UTC。
    • CentOS/RHEL 有时默认将硬件时钟视为本地时间(取决于版本和配置)。
    • 解决:在两个系统中都设置 timedatectl set-local-rtc 0 并确保 NTP 服务运行正常,避免时间偏差导致日志混乱。
  2. 网卡名称变化

    • Ubuntu 可能使用 eth0 或 ens33,CentOS 可能使用 eth0 或 ens33。
    • 如果两个系统对同一网卡的命名策略冲突,可能导致启动时网络接口未激活。建议在每个系统的 /etc/netplan/ (Ubuntu) 或 /etc/sysconfig/network-scripts/ (CentOS) 中固定 MAC 地址绑定,或使用 NetworkManager 统一管理。
  3. Secure Boot 问题

    • 如果启用了 Secure Boot,非签名的第三方内核模块(如 NVIDIA 驱动、VirtualBox 模块)可能无法加载。
    • 解决:双启动环境下,建议直接在 BIOS 中禁用 Secure Boot,除非你愿意折腾 MOK(Machine Owner Key)注册。
  4. 磁盘顺序变化

    • 在某些主板 BIOS 中,插入 USB 安装盘可能改变磁盘编号(从 sda 变成 sdb)。这会导致 GRUB 中的 hd0,gpt4 引用失效。
    • 解决:始终使用 UUID 而非设备名(如 /dev/sda4)来编写 GRUB 条目,UUID 是永久不变的。

更推荐的替代方案

如果你的目标是“在一台机器上使用两种不同的 Linux 发行版”,双启动并不是唯一或最佳选择:

  1. 虚拟机(KVM/QEMU):

    • 主机用 Ubuntu,Guest 用 CentOS(或反之)。
    • 优势:隔离性好,快照方便,性能损耗小(近原生)。
    • 工具:virt-manager, Vagrant, Proxmox VE。
  2. Docker/Containerd:

    • 如果只是为了跑特定软件,可以在 Ubuntu 主机上运行 CentOS 容器。
    • 优势:轻量级,秒级启动。
    • 局限:内核级别依赖的软件(如内核模块开发)无法容器化。
  3. WSL2 (Windows Subsystem for Linux):

    • 如果你在 Windows 电脑上工作,可以直接在 WSL2 中运行 Ubuntu 和 CentOS 实例,无需重启。

总结

双启动技术上是可行的,但维护成本较高(每次内核升级都要检查 GRUB 配置)。对于大多数开发者和管理员来说,“一台主力机 + 虚拟机” 的组合远比双启动实用和稳定。除非你有特殊的硬件兼容性需求或必须独占资源,否则不建议在生产环境中采用传统双启动方案。