Ubuntu 20.04 和 18.04 这两个版本放在同一台 Windows 机器上,听起来像是折腾,但在实际工作里这种需求一点都不少见。有人是为了跑 ROS Noetic(20.04 是官方主推)同时又要兼容某个只在 18.04 上编译通过的老项目;有人是给学生机、实验室机器做一套"什么都能跑"的环境;还有人纯粹是被驱动和依赖版本逼的——一个系统里装两套 CUDA、两套 Python、两套 ROS,冲突到最后还不如直接分两个系统来得干净。这篇就聊我在 Windows 基础上再装 Ubuntu 20.04 + 18.04 三系统的完整思路和踩坑记录,从分区规划、UEFI 设置、安装实操,到 GRUB 引导管理、显卡驱动、开发环境搭建,以及引导崩了怎么从一个系统救另一个系统。不管你是第一次装双系统,还是已经装过一次想再加一个,下面的内容都能直接抄。
1. 三系统方案的整体设计与分区规划
1.1 为什么有人宁愿装三系统也不开虚拟机
先说清楚这个方案的适用边界,不然很多人会走弯路。如果你的需求只是"偶尔用一下 Linux 跑个脚本",那虚拟机(VMware 或 VirtualBox)完全够用,装完就能用,删了也不心疼。但有三类场景虚拟机真的顶不住:第一类是吃 GPU 的活,比如 OrB-SLAM3 这类视觉 SLAM 项目、Blender 渲染、深度学习训练,虚拟机里显卡直通配置复杂且性能损耗明显;第二类是吃 IO 和内存的活,比如编译大型 C++ 工程、跑 Docker 里一堆容器,虚拟机磁盘性能是硬伤;第三类是硬件相关调试,比如串口、USB 设备、特定传感器,虚拟机透传经常出玄学问题。
那为什么不装双系统(Windows + 一个 Ubuntu),非要三个?核心原因是依赖版本不可调和。ROS1 的 Noetic 只官方支持 Ubuntu 20.04,而 Melodic 只支持 18.04,这两个 ROS 版本对应的 Python 版本、Boost 版本、OpenCV 版本都不一样。你当然可以在一台机器上用 conda 或者容器隔离,但涉及到系统级库、内核模块、驱动的时候,容器隔离就不彻底了。我见过最典型的例子是一个团队同时维护两代机器人产品,一代基于 Melodic,一代基于 Noetic,开发机就干脆装了三系统,切换靠重启,五分钟的事,比天天调环境省心得多。
所以这个方案的定位很明确:一台机器,三种完整独立的运行环境,互不干扰,随时切换。代价是磁盘要分出去一部分,开机要选一下系统,以及——引导出问题的时候你得会救。这三点在后面的章节都会展开。
1.2 磁盘分区方案:EFI、根分区、交换分区怎么算
分区是三系统里最容易翻车的地方,我先给一个可以直接照搬的方案,再解释为什么这么分。假设你有一块 1TB 的 NVMe 固态,Windows 已经占了大概 200GB(含恢复分区),剩下的空间可以这样切:
| 分区用途 | 建议大小 | 文件系统 | 挂载点 | 说明 |
|---|---|---|---|---|
| EFI 系统分区(扩展现有) | 至少 512MB,建议 1GB | FAT32 | /boot/efi | 三个系统共用,容易被忽视 |
| Ubuntu 20.04 根分区 | 150GB | ext4 | / | 主力开发系统,给足空间 |
| Ubuntu 18.04 根分区 | 120GB | ext4 | / | 老项目专用 |
| 交换分区(swap) | 32GB | swap | 无 | 两个 Ubuntu 可以共用一个 |
| 数据共享分区 | 剩余空间 | exFAT 或 NTFS | 手动挂载 | 三系统都能读写 |
这里有几个关键决策要说清楚。EFI 分区大小是第一大坑。Windows 安装时默认只给 100MB 的 EFI 分区,装一个 Ubuntu 勉强够,装两个就很紧张了。每个 Ubuntu 会在 EFI 分区里放自己的grubx64.efi和内核,加上 Windows 的引导文件,100MB 很容易被撑爆,一旦写满,轻则新系统引导装不进去,重则整个引导区损坏。所以动手之前,先确认你的 EFI 分区有多大,如果只有 100MB,建议用分区工具把它扩容到 512MB 以上。
根分区给多大,取决于你要装多少东西。Ubuntu 系统本身加上基础软件大概 20GB,但如果你要装 CUDA、cuDNN、ROS、各种 SDK,再放几个数据集,100GB 都不一定够。我的经验是:主力系统(20.04)给 150GB,备用系统(18.04)给 120GB,宁可多留也不要事后扩容——Linux 根分区扩容比 Windows 麻烦得多,尤其是分区不相邻的时候。
swap 要不要单独分,现在有争议。Ubuntu 20.04 默认用的是 swap 文件而不是 swap 分区,性能差距在日常使用中可以忽略。但如果你要做休眠(hibernate)或者跑内存吃紧的任务,单独分一个 swap 分区更稳妥。我一般按物理内存的 1 到 1.5 倍来给,32GB 内存就分 32GB swap,两个 Ubuntu 共用同一个 swap 分区完全没问题,但注意不要和 Windows 的页面文件混淆。
注意:动手分区前,务必用 Windows 自带的磁盘管理或者 DiskGenius 先把 Windows 里的重要数据备份一遍。分区表操作是不可逆的,一次误删就是几个小时的数据恢复。
1.3 启动模式确认:UEFI 还是 Legacy,这一步错了全白干
很多人装机失败,问题不是出在安装过程,而是出在启动模式不统一。现代主板有两种启动模式:传统的 Legacy BIOS(MBR 分区表)和 UEFI(GPT 分区表)。你的 Windows 是用哪种模式装的,后面所有 Linux 就必须用同一种模式,否则会出现"装完了但开机找不到系统""进去了但看不到 Windows"这类问题。
怎么确认 Windows 的启动模式?最简单的办法是在 Windows 里按Win + R,输入msinfo32,看"BIOS 模式"那一栏:显示"UEFI"就是 UEFI 启动,显示"传统"就是 Legacy。另一个参考是看磁盘分区表:打开磁盘管理,右键系统盘,如果"转换为 MBR 磁盘"是灰色不可点,说明当前是 GPT(对应 UEFI);如果能点"转换为 MBR",说明是 MBR(对应 Legacy)。
现在新装的 Windows 10/11 基本都是 UEFI + GPT,下面的内容也以这个为前提展开,因为 UEFI 是主流,而且三系统在 UEFI 下的引导管理反而更清晰。确认好之后,记住两个原则:做启动盘时选对 UEFI 模式,进 BIOS 时也确认是 UEFI 模式引导 U 盘。Rufus 做盘的时候,"分区类型"选 GPT,"目标系统"选 UEFI,这样出来的盘在 UEFI 主板上是干净的。
2. 安装介质制作与 BIOS 关键设置
2.1 启动盘制作:Rufus 还是 Ventoy
装两个 Ubuntu,意味着你要么做两个启动盘,要么想办法一个盘装两个 ISO。这里推荐Ventoy,理由很实在:把 ISO 文件直接拷进 U 盘就能用,两个 ISO 一共不到 4GB,一个 16GB 的 U 盘全放下,以后换系统版本只需要删旧拷新,不用重新"烧录"。相比之下 Rufus 每次只能做一个 ISO,优点是兼容性经过长期验证,遇到 Ventoy 引导不起来的极端情况(少数老主板),Rufus 是保底方案。
具体操作上,Ventoy 官方提供 Windows 版的安装程序,选好 U 盘,点安装,格式化完后把ubuntu-20.04.x-desktop-amd64.iso和ubuntu-18.04.x-desktop-amd64.iso两个文件直接拖进去就行。注意下载 ISO 的时候走官方渠道,校验一下 SHA256,避免镜像损坏导致安装到一半报错——这种错误信息通常很难看懂,排查起来特别浪费时间。
注意:U 盘建议用 USB 3.0 以上、16GB 以上容量的,8GB 的老盘装两个 ISO 会比较紧张,而且写入速度慢,安装过程中读盘卡顿会让人误以为是硬盘问题。
2.2 BIOS 里必须改的几个开关
插上 U 盘重启,在开机 logo 出现时狂按F2、F12、Del或Esc(不同品牌不一样,联想常见 F12,华硕 F8 或 Del,戴尔 F12,惠普 F9),进 BIOS 之后有几个开关必须处理:
- Secure Boot(安全启动):装 Ubuntu 的时候建议先关掉。Ubuntu 官方镜像其实支持 Secure Boot,但涉及第三方驱动(尤其是 NVIDIA 显卡驱动)的时候,开着 Secure Boot 会导致驱动签名校验失败,装完驱动进不去图形界面。先关掉,装完系统再决定要不要开。
- SATA 模式:确认是 AHCI 而不是 RAID。有些笔记本出厂是 RAID 模式,Windows 装的时候已经适配了,但 Linux 安装器可能识别不到硬盘。如果非要在 RAID 模式下装,会比较麻烦,一般做法是先在 Windows 侧切换到 AHCI(参考 Windows 切换 SATA 模式的标准流程),再装 Linux。
- 快速启动(Fast Boot):BIOS 里的 Fast Boot 可以关掉,它会让开机跳过一些硬件检测,可能导致 U 盘引导不显示。
- 启动顺序:把 U 盘排到第一位,或者开机时手动选启动设备。
改完保存退出(通常 F10),机器会从 U 盘启动,看到 GRUB 菜单就说明启动盘没问题。Ventoy 会列出 U 盘里的两个 ISO,选 20.04 先进去。
2.3 Windows 侧的准备工作:关快速启动、压缩卷、留空间
在进 Ubuntu 安装器之前,Windows 这边还有三件事要做。第一,关闭 Windows 的快速启动。控制面板 → 电源选项 → 选择电源按钮的功能 → 更改当前不可用的设置,把"启用快速启动"的勾去掉。这个功能本质是休眠,会让 Windows 关机时不完全释放文件系统,Linux 挂载 NTFS 分区时可能出现只读或者损坏。
第二,在 Windows 里提前划分好空闲空间。用磁盘管理,右键 C 盘之外的某个分区,选"压缩卷",压缩出你计划给 Ubuntu 的总空间(比如 300GB)。这里提前压的好处是 Windows 的压缩卷不会破坏现有数据,比在 Ubuntu 安装器里现场调整分区安全得多。压出来的空间会显示为"未分配",Ubuntu 安装器可以直接用。
第三,确认 EFI 分区容量。前面提过,如果只有 100MB,建议扩容。扩容 EFI 分区的操作有点风险,需要借助第三方分区工具,把 EFI 分区后面的分区往前挪,腾出空间再扩 EFI。做完之后一定要确认 Windows 还能正常启动,再继续下一步。这一步不是必须的,但如果你之前装过一个 Ubuntu 已经把 EFI 用得差不多了,那扩容就是刚需。
3. Ubuntu 20.04 + 18.04 的实际安装过程
3.1 Ubuntu 20.04 的分区挂载点设置实操
从 U 盘启动 20.04,选"Install Ubuntu",一路走到键盘布局、网络、更新选项这些步骤。更新选项那一步建议先不勾选"安装时下载更新",因为安装阶段网络不稳或者源慢会导致卡住,装完系统再更新更可控。到了"Installation type"这一步,选Something else(其他选项),手动分区。
手动分区界面会列出所有磁盘和分区,这里要极其小心,别动 Windows 的分区和 EFI 分区。找到之前压缩出来的"free space",依次创建:
- 先建swap 分区:选中 free space,点
+,大小填 32768MB,类型选"swap area"。如果两个 Ubuntu 打算共用一个 swap,这一步只在第一次装的时候建。 - 再建根分区:选中剩下的 free space,点
+,大小填 150000MB(约 150GB),类型选 ext4,挂载点填/。 - 剩下的大块空间先不分配,留给 18.04 和共享数据区。
最关键的一步在页面下方:"Device for boot loader installation"(安装引导器的设备)。这里必须选EFI 分区对应的设备,通常显示为/dev/nvme0n1p1或者/dev/sda1(那个 100MB 或 512MB 的 FAT32 分区)。如果你选错了,比如选成整块硬盘/dev/nvme0n1,引导会装到 MBR 里,UEFI 主板可能识别不到。确认好之后点"Install Now",安装器会提示分区变更,再核对一遍没有 Windows 分区被删,然后确认。
安装过程大概 10 到 20 分钟,取决于硬盘速度。装完提示重启,拔掉 U 盘,这时候应该能看到 GRUB 菜单,里面有 Ubuntu 和 Windows Boot Manager。
3.2 Ubuntu 18.04 的安装与引导器选择
第二个系统装法基本一样,但有两个细节要注意。第一,从 20.04 的 GRUB 里进 18.04 的安装盘。因为有 Ventoy,重启再选 18.04 的 ISO 就行,也可以用 20.04 覆盖安装盘之后重启选。第二,分区的时候,swap 不用再建了,选中之前给 18.04 留的 free space,直接建一个 120GB 的 ext4 根分区,挂载点/。
"Device for boot loader installation" 这一步同样选 EFI 分区。这时候会出现一个情况:EFI 分区里已经有 Windows 的引导和 20.04 的 GRUB,18.04 安装器会把它的 GRUB 也写进去,可能会把 20.04 的 GRUB 覆盖掉。这不算问题,甚至可以算好事,因为最后统一用那个被覆盖后的 GRUB 来管理三个系统就行——18.04 的 GRUB 一样能识别 20.04 和 Windows,只要os-prober正常工作。真正需要担心的是相反的情况:EFI 空间不够,写不进去,安装器会报错,这时候就得回头扩 EFI 分区。
装完 18.04 重启,GRUB 菜单里应该能看到三行:Ubuntu(18.04)、Ubuntu 20.04 的高级选项、Windows Boot Manager。如果只看到 18.04 和 Windows,看不到 20.04,那就是os-prober没跑,下一章细说。
3.3 首次进入系统的必要设置
第一次进系统,无论 20.04 还是 18.04,有几件事先做掉,能避免后面很多麻烦。
换国内软件源。默认的官方源在国内下载速度感人,换成清华或者阿里的镜像源,装软件能快好几倍。20.04 可以在"软件和更新"里图形化切换,也可以直接改/etc/apt/sources.list。改之前先备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list sudo apt update装基础工具。build-essential、cmake、git、vim、net-tools、openssh-server这几个几乎是标配,一次性装完:
sudo apt install -y build-essential cmake git vim net-tools openssh-server配置 Git,不然以后提交代码全是默认邮箱:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"时间同步。三系统共用硬件时钟,Windows 和 Linux 对硬件时钟的解读不一样(Windows 认为硬件时钟是本地时间,Linux 默认认为是 UTC),会导致切换系统后时间差 8 小时。解决办法二选一:要么在 Linux 里执行timedatectl set-local-rtc 1(让 Linux 也用本地时间),要么在 Windows 注册表里加一个RealTimeIsUniversal项。推荐后者,因为 Linux 侧改成本地时间可能会影响日志时间戳的一致性。三个系统都要做时间同步的确认,不然日期错乱会影响到证书校验、Git 提交、日志排查。
4. GRUB 引导管理与默认启动项设置
4.1 为什么 GRUB 菜单里有时看不到 Windows
三个系统装完,最常见的问题就是"GRUB 里只有 Ubuntu,没有 Windows"。原因几乎总是同一个:os-prober没有启用。Ubuntu 从某个版本开始,出于安全考虑默认禁用了os-prober,而 GRUB 生成菜单时正是靠它去扫描其他系统分区的。没有它,GRUB 只看得到自己所在的系统。
解决办法分两步。第一步,编辑 GRUB 的配置文件:
sudo vim /etc/default/grub找到GRUB_DISABLE_OS_PROBER这一行(可能没有,没有就自己加),改成GRUB_DISABLE_OS_PROBER=false。有些教程说这行注释掉就行,实测下来必须是显式的false才生效。第二步,重新生成 GRUB 配置:
sudo os-prober sudo update-grubos-prober命令本身会打印出它扫描到的系统,比如/dev/nvme0n1p2:Windows Boot Manager:Windows:efi,看到这行就说明扫描成功了。然后再update-grub,重启就能在菜单里看到 Windows 了。这个操作要在最后安装的那个 Ubuntu上执行,因为引导归它管。
4.2 默认启动项与超时时间的调整
GRUB 菜单默认只显示 10 秒然后自动进第一个选项。三系统用户通常希望调整两件事:默认进哪个系统,以及菜单等多久。
默认启动项由/etc/default/grub里的GRUB_DEFAULT控制。这里有个经典陷阱:早期版本可以直接填数字(从 0 开始),但 Ubuntu 20.04 的 GRUB 支持填菜单项的字符串,更直观也更不容易错。先执行grep -E "^menuentry " /boot/grub/grub.cfg看看菜单里的条目名字,然后把名字原样填进去:
GRUB_DEFAULT="Ubuntu" GRUB_TIMEOUT=5 GRUB_TIMEOUT_STYLE=menuGRUB_TIMEOUT_STYLE=menu这行挺重要,默认有些配置用的是hidden,也就是不按 Shift 就直接跳过菜单,三系统用户会非常难受。设成menu就老老实实每次都显示。改完还是老三样:sudo update-grub,重启验证。
注意:填中文菜单名或者带引号的菜单名时容易出错,建议先
update-grub一次生成菜单,再用grep拿到的精确字符串去填。填错的表现是:GRUB 找不到对应条目,默默用了第 0 项,你会以为设置没生效。
4.3 从一个系统修复另一个系统的引导
引导损坏是双系统用户迟早会遇到的事,典型场景有三种:装了第三个系统之后原来的引导丢了、Windows 大版本更新覆盖了引导、误删了 EFI 分区里的文件。有个好消息是:只要你有至少一个能启动的 Linux,就能修复其他系统的引导,不一定非得用 U 盘救援盘。
场景一:GRUB 还在,但某个系统的菜单项没了。这个最简单,进能用的 Ubuntu,sudo os-prober && sudo update-grub就行。
场景二:GRUB 整个丢了,开机直接进 Windows。这时候需要从 U 盘启动 Ubuntu,选"Try Ubuntu"进 Live 环境,挂载原系统的根分区和 EFI 分区,chroot 进去重装 GRUB:
sudo fdisk -l # 先找到根分区和 EFI 分区,假设根分区 /dev/nvme0n1p5,EFI 分区 /dev/nvme0n1p1 sudo mount /dev/nvme0n1p5 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done sudo chroot /mnt grub-install /dev/nvme0n1 update-grub exit sudo reboot这套流程的关键点是grub-install的目标要写整块硬盘(/dev/nvme0n1),而不是某个分区。UEFI 模式下它会自动把引导文件写到 EFI 分区里。chroot 之前必须绑定挂载/dev、/proc、/sys这几个目录,否则grub-install会因为找不到设备或者 udev 信息而报错。
场景三:从 Windows 侧救 Linux,或者从 Linux 侧救 Windows。从 Linux 救 Windows 相对容易,因为 Windows 的引导文件bootmgfw.efi只要还在 EFI 分区里,GRUB 的 os-prober 就能找到它。如果bootmgfw.efi被覆盖了,就需要用 Windows 安装 U 盘进恢复环境,执行bootrec /fixboot和bcdboot C:\Windows /s S: /f UEFI来重建。从 Windows 救 Linux 则反过来,需要 Linux 的 Live U 盘,因为 Windows 完全不管 Linux 分区。所以我的经验是:手边常备一个 Ubuntu 20.04 的 Live U 盘,它就是三系统的急救包。
5. 装完之后必须做的驱动与环境配置
5.1 NVIDIA 驱动:nvidia-driver-535 的安装与 nouveau 屏蔽
显卡驱动是 Ubuntu 上最影响体验的一环。20.04 默认用的是开源的 nouveau 驱动,能用,但性能差、外接显示器经常识别异常、跑 CUDA 直接不行。要装 NVIDIA 闭源驱动,推荐 535 这个长期支持分支,兼容性在 20.04 和 18.04 上都比较稳。
安装方式有两种。第一种用 Ubuntu 的自动工具,省心:
ubuntu-drivers devices # 看推荐的驱动版本 sudo ubuntu-drivers autoinstall第二种是手动指定版本,适合你知道自己要哪个:
sudo apt install nvidia-driver-535但这里有个坑:20.04 的默认源里不一定有 535,如果没有,需要先加官方的显卡驱动 PPA:
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-driver-53518.04 上同理,而且 18.04 装 535 之前最好先确认内核版本,太老的内核装完可能加载失败。装完之后必须重启,然后跑nvidia-smi验证。如果命令找不到,说明驱动没加载成功,通常是 nouveau 没被屏蔽干净。屏蔽 nouveau 的标准做法是在/etc/modprobe.d/blacklist-nouveau.conf里加:
blacklist nouveau options nouveau modeset=0然后sudo update-initramfs -u再重启。装驱动期间如果进了系统发现是黑屏或者分辨率异常,可以按Ctrl + Alt + F3切到 TTY 里操作,不要慌,图形界面挂了不代表系统坏了。
注意:如果你开着 Secure Boot,NVIDIA 驱动的内核模块签名校验可能失败,表现就是装完驱动
nvidia-smi报错"couldn't communicate with the NVIDIA driver"。要么关 Secure Boot,要么走 MOK 签名流程,前者省事得多。
5.2 开发环境:Python、Docker、MySQL、Redis 的落位
三系统的意义在于环境隔离,所以每个系统上装什么要提前规划清楚,不要两边都装一套重复的东西,浪费空间也容易搞混。我的分工通常是:20.04 做主力,Python 用系统自带的 3.7/3.8 加 pyenv 管理多版本,Docker、MySQL、Redis 都装这里;18.04 做兼容,主要伺候老项目和 ROS Melodic,尽量保持干净。
Python 环境建议不要动系统的python3,用 pyenv 或者 venv 隔离。装 venv 很简单:
sudo apt install python3-venv python3-pip python3 -m venv ~/venv/proj1 source ~/venv/proj1/bin/activateDocker 在 Ubuntu 上按官方文档装,别用apt install docker.io那个版本,太老。核心几步是加官方 GPG key、加仓库、装docker-ce,然后把自己加进 docker 组免得每次sudo:
sudo usermod -aG docker $USER newgrp dockerMySQL 和 Redis 就看项目需要,sudo apt install mysql-server redis-server基本够用。要注意 MySQL 8.0 的默认认证插件和 5.7 不一样,老项目连不上是常见问题,需要改default_authentication_plugin。Redis 在 Ubuntu 上默认只监听本地,要远程访问得改bind配置和protected-mode,改完记得设密码,不然裸奔在网络上很危险。
5.3 ROS Noetic 与 OrB-SLAM3 这类重活放哪个系统
这才是三系统方案的核心价值所在。ROS Noetic 官方支持 20.04,所以主力系统上装 Noetic;ROS Melodic 官方支持 18.04,装在备用系统上。装 ROS 有个省事的办法是社区里流传的一键脚本,但要注意看清楚它到底改了什么,有些人装完发现系统源的优先级被改了,反而引发依赖冲突。稳妥的做法还是按官方文档走apt流程:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt install ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrcOrB-SLAM3 这类视觉 SLAM 项目,依赖 OpenCV、Eigen、Pangolin、DBoW2,编译时间不短,而且不同版本对 OpenCV 版本很敏感。我的建议是把 OrB-SLAM3 放在 20.04 上,用 Noetic 配套的 OpenCV 4,18.04 那边如果要跑老版本就单独编译 OpenCV 3。别想着两边共用同一套源码,编译产物和环境绑死,混用必出玄学错误。Blender 这类图形软件可以两边都装,但注意它对显卡驱动版本有要求,装完驱动再装 Blender,否则渲染时可能调用不到 CUDA。
6. 常见问题与排查速查
6.1 进不去系统、黑屏、卡 LOGO 的排查顺序
装系统出问题最怕的是"不知道卡在哪"。我总结了一套从外到里的排查顺序,按这个走基本能定位:
| 现象 | 最可能原因 | 排查动作 |
|---|---|---|
| 开机直接进 Windows,无 GRUB | 引导顺序被改,或 GRUB 丢失 | 进 BIOS 看启动项顺序;用 Live U 盘 chroot 重装 GRUB |
| GRUB 有菜单,选 Ubuntu 后黑屏 | 显卡驱动问题 | GRUB 界面按e,在内核行加nomodeset,进系统后装驱动 |
| 卡在 "Started User Manager for UID" | 图形服务起不来 | Ctrl+Alt+F3进 TTY,看journalctl -xb日志 |
| 安装器认不到硬盘 | SATA 模式是 RAID | 进 BIOS 改 AHCI,或加载对应驱动 |
| 装完提示 grub-install 失败 | EFI 分区满或写保护 | 检查 EFI 剩余空间,扩容后重装引导 |
| 切换系统后时间差 8 小时 | 硬件时钟解读不一致 | Linux 侧timedatectl set-local-rtc 1或 Windows 侧加注册表项 |
nomodeset这个参数值得单独说一下。它让内核不加载显卡的 KMS 驱动,用最基本的方式点亮屏幕,进了系统再装驱动,是解决黑屏的万能钥匙。进 GRUB 菜单的时候按e编辑当前条目,在linux那一行末尾加nomodeset,Ctrl+X启动。这个方法对 20.04 和 18.04 都有效。
6.2 卸载 Ubuntu 恢复单系统的正确姿势
三系统装多了想砍掉一个,卸载顺序很关键,错一步可能连 Windows 都进不去。正确流程是:先在能用的系统里用update-grub让 GRUB 重新扫描,或者干脆在 Windows 里用 EasyUEFI 把要删的那个 Ubuntu 的引导项删掉;然后用分区工具(Windows 下的磁盘管理或者 DiskGenius)把它的根分区和 swap 删掉合并回空闲空间;最后如果 GRUB 是你主要的引导,想让开机直接进 Windows,需要在 Windows 里执行bcdboot C:\Windows /s S: /f UEFI修复 Windows 引导,再进 BIOS 把 Windows Boot Manager 调到第一位。
有几个禁忌:不要直接格式化 EFI 分区(三个系统共用的,删了全挂);不要用那种"一键卸载双系统"的小工具,它们对三系统的识别经常不准确,容易误删;删分区之前确认你删的是正确的分区,方法是在 Ubuntu 里执行lsblk -f记录下 UUID 和挂载点,对着记录删,别凭感觉。
6.3 主副屏、音量亮度键这类外设小问题
装完系统,小问题最磨人。双显示器在 Ubuntu 下配置,用xrandr命令行或者"显示设置"图形界面都行。笔记本接外接屏,常见问题是外接屏不亮或者分辨率不对,先xrandr --listmonitors看识别情况,再用xrandr --output HDMI-1 --auto --right-of eDP-1设置位置。如果外接屏干脆不认,八成是显卡驱动没装好,回去补驱动。
亮度键和音量键失灵,在苹果电脑装 Windows 的例子里特别常见,因为苹果的键盘事件和普通 PC 不一样,需要装对应驱动或者用 AutoHotkey 之类的工具做映射。普通 PC 上如果 Fn 键失灵,先检查 BIOS 里有没有 Fn Lock 相关选项,再检查fnmode内核参数。Ubuntu 上亮度调节如果没反应,可以在/etc/default/grub的GRUB_CMDLINE_LINUX_DEFAULT里加acpi_backlight=vendor或acpi_backlight=native,两个都试试,不同品牌主板不一样。这类问题没有通用解,我的做法是先在终端用xrandr --output eDP-1 --brightness 0.8临时调亮度,保证能用,再慢慢折腾硬件键。
最后分享一个我自己踩过好几次的经验:三系统的 EFI 分区,每隔一段时间最好检查一下剩余空间。sudo df -h /boot/efi,看看用了多少,如果超过 70% 就要警惕了,内核更新会不断往里面塞文件。清理方法是sudo apt autoremove删掉旧内核,再手动检查/boot/efi/EFI下面有没有重复的、废弃的系统引导目录。这个习惯能避免某天更新内核的时候突然写不进去,把整个引导搞坏。三系统真正的维护成本不在装,而在于后续每次内核和驱动更新时,你得记得三个系统都要照顾到。我一般一个月集中做一次三个系统的更新,顺手检查 EFI 空间和引导项,比出问题之后再救要轻松得多。