ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows 下 Ubuntu 20.04/18.04 三系统安装与引导修复

Windows 下 Ubuntu 20.04/18.04 三系统安装与引导修复 手里一台 Windows 机器想同时跑 Ubuntu 20.04 和 18.04这个需求其实挺常见的。做 ROS1 开发的人最清楚Noetic 只支持 20.04Melodic 又绑死在 18.04 上两个项目的依赖库、Python 版本、OpenCV 版本经常打架。再加上 ORB-SLAM3 这类视觉 SLAM 工程在 20.04 上编译和跑数据集都比较顺但有些老设备驱动和 SDK 又只能在 18.04 下跑通。与其来回重装不如直接做成三系统开机时用 GRUB 菜单选一下几分钟就能切换。这篇文章就从我自己的实操经历出发把 Windows 下安装双/三系统 Ubuntu 20.04 加 18.04 的完整思路、分区方案、引导管理、驱动安装和常见坑一次讲透。不管你是刚接触 Linux 的小白还是已经装过多次双系统的老手都能从里面找到可以直接抄作业的步骤也能看到一些文档里不会写的细节。1. 先搞清楚引导与分区再动手装系统1.1 UEFIGPT 与 LegacyMBR 的选择逻辑现在新出的主板和品牌机基本都是 UEFI 引导硬盘分区表默认也是 GPT。我强烈建议你保持这套组合不要为了“兼容老教程”去改成 LegacyMBR。原因很简单UEFI 模式下每个系统可以在同一个 EFI 分区里共存自己的引导文件Windows 放\EFI\Microsoft\Boot\bootmgfw.efiUbuntu 放\EFI\ubuntu\grubx64.efi互不覆盖后期修复也方便。而 Legacy 模式只有一个 MBR后安装的系统会直接覆盖引导扇区三系统来回切换很容易把 Windows 引导搞丢。确认自己的机器是不是 UEFI可以在 Windows 里按Win R输入msinfo32看“BIOS 模式”那一行。如果是“UEFI”那就对了如果是“传统”建议先备份数据然后进 BIOS 把引导模式改成 UEFI再重新分区装 Windows。虽然折腾一次但后面省心太多。还有一个必须提前处理的地方关闭 Windows 的快速启动和 Secure Boot。快速启动会让 Windows 处于混合休眠状态Linux 挂载 NTFS 分区时可能无法写入甚至导致数据损坏。Secure Boot 则可能阻止第三方内核模块加载尤其是 NVIDIA 驱动装到一半黑屏多半是它在作怪。关掉这两个选项不会影响 Windows 正常使用只是启动时多等一两秒。注意如果你的 Windows 开了 BitLocker动手前一定要先暂停或解密。安装 Ubuntu 时如果动了分区表BitLocker 可能直接锁死到时候恢复密钥找不到就麻烦了。1.2 三系统共存的磁盘空间规划三系统最怕的就是分区没规划好装到一半发现空间不够或者 EFI 分区太小更新几次内核就满了。我自己的习惯是给每个系统至少留出下面这些空间你可以根据硬盘容量灵活调整。分区用途建议大小说明Windows 系统盘120GB 以上如果已经装好就不用动确保有足够剩余空间Ubuntu 20.04 根分区80GB 以上ROS、Docker、CUDA 都很吃空间建议给足Ubuntu 18.04 根分区70GB 以上老项目通常占用少一些但也要留够编译空间共享数据分区剩余空间NTFS 格式两个 Ubuntu 都能读写放数据集和代码EFI 分区512MB 到 1GB如果原来的太小建议用工具扩容或者重建swap16GB 到 32GB内存 16GB 以上可以给 16GB要休眠就得大于内存这里解释一下为什么要单独分共享数据分区。很多人会把/home共享给两个 Ubuntu听起来省空间实际上很容易出问题。Ubuntu 20.04 和 18.04 的桌面环境、配置文件格式、Python 默认版本都不一样共用同一个/home会导致配置冲突登录时可能出现奇怪的报错。更稳妥的做法是每个系统独立/home然后单独划一个 NTFS 分区存放代码、数据集和下载文件两个系统都挂载到/mnt/data之类的路径下。EFI 分区为什么建议 512MB 以上因为每个 Ubuntu 内核都会在 EFI 分区里放一份vmlinuz和initrd虽然 Ubuntu 现在主要把内核放在/boot里EFI 分区占用不大但加上 Windows 的引导文件、GRUB 文件、厂商恢复文件256MB 很容易捉襟见肘。我见过太多人因为 EFI 分区满导致apt upgrade失败最后只能手动删旧内核非常麻烦。2. 安装顺序与启动盘制作实操2.1 为什么建议按 Windows - Ubuntu 18.04 - Ubuntu 20.04 的顺序安装顺序不是随便定的。GRUB 的规则是“后安装的系统会接管主引导”。如果你先装 Ubuntu 20.04再装 Ubuntu 18.04那么 18.04 自带的 GRUB 版本相对较老虽然大多数情况下也能识别 20.04但遇到较新的文件系统特性或者 LVM 配置时可能会漏掉条目。反过来先装 18.04再装 20.04让较新的 GRUB 最后接管os-prober识别旧系统的成功率更高菜单也更好看。所以推荐顺序是Windows 已经装好 - 装 Ubuntu 18.04 - 装 Ubuntu 20.04。每次安装时都要选择“其他选项”手动分区并且把引导器安装到同一个 EFI 分区。最后装完 20.04开机应该能看到包含 Windows、Ubuntu 18.04、Ubuntu 20.04 的 GRUB 菜单。如果没看到进系统后执行一次sudo update-grub基本就能解决。还有一种情况是你已经有 Windows 和 Ubuntu 20.04想再补一个 18.04。这时候可以让 18.04 的安装程序把 GRUB 装到 EFI 分区装完后进入 18.04 执行sudo update-grub它通常也能识别 20.04。但为了保险我更喜欢在 18.04 装完后再用 20.04 的 Live USB 启动用chroot方式把 20.04 的 GRUB 重新装一遍这样主引导还是较新的版本。2.2 用 Ventoy 或 Rufus 制作多合一启动盘制作启动盘的工具很多我目前最推荐 Ventoy。它可以把多个 ISO 文件直接复制到 U 盘里启动时弹出一个菜单让你选特别适合同时装 Ubuntu 20.04 和 18.04 的场景。你只需要准备一个 32GB 以上的 U 盘用 Ventoy 安装到 U 盘然后把ubuntu-20.04.6-desktop-amd64.iso和ubuntu-18.04.6-desktop-amd64.iso拷进去就行。Ventoy 的兼容性也很好UEFI 和 Legacy 都能启动。如果你习惯用 Rufus那就需要准备两个 U 盘或者每次重新写入。Rufus 写入时注意分区类型选 GPT目标系统选 UEFI文件系统默认 FAT32 即可。Ubuntu 的 ISO 镜像现在都支持 UEFI 启动不用额外处理。下载镜像的时候一定要去官方渠道别用来路不明的修改版。20.04 建议用 20.04.6 LTS18.04 用 18.04.6 LTS这两个是最终维护版本补丁比较全。下载完可以校验一下 SHA256避免镜像损坏导致安装中途报错。校验命令在 Windows 下可以用certutil -hashfile ubuntu-20.04.6-desktop-amd64.iso SHA256在 Linux 下用sha256sum。实操心得Ventoy 在有些老主板上需要关闭 Secure Boot 才能启动如果 U 盘插上去直接进了 Windows重启进 BIOS 把 Secure Boot 设成 Disabled再把 U 盘调到启动顺序第一位。3. 手动分区与两个 Ubuntu 的安装细节3.1 Ubuntu 18.04 手动分区与引导器位置从 U 盘启动进入 Ubuntu 18.04 安装界面后一路选语言、键盘布局到了“安装类型”这一步一定要选“其他选项”也就是手动分区。如果你选“与 Windows 一起安装”安装程序会自动压缩 Windows 分区但三系统场景下它可能识别不准容易把已有分区搞乱。进入分区界面后你会看到硬盘上已有的分区列表。找到你提前留出来的空闲空间选中它点击“”号新建分区。我的分区方案是这样的第一个分区大小 16GB类型swap用于交换空间。第二个分区大小 70GB类型ext4挂载点/。第三个分区大小 20GB类型ext4挂载点/home可选也可以把剩余空间都给/。重点来了在界面最下方有一项“安装启动引导器的设备”这里千万不要选整个硬盘比如/dev/nvme0n1而要选你的 EFI 分区通常是/dev/nvme0n1p1或者/dev/sda1。如果选错GRUB 会写到 MBR 或者覆盖 Windows 引导后期修复很麻烦。EFI 分区在列表里一般显示为efi类型大小 100MB 到 500MB 不等。分区完成后点击“现在安装”确认更改。安装过程中会提示你设置用户名、密码、计算机名。建议两个 Ubuntu 用不同的计算机名比如ubuntu18和ubuntu20以后在局域网里也方便区分。密码可以设成一样的方便记忆。3.2 Ubuntu 20.04 安装时如何避开已有系统装完 18.04 后重启进入系统确认一下网络、显示都正常然后关机用同一个 Ventoy U 盘启动 Ubuntu 20.04 安装程序。步骤和 18.04 基本一样同样选“其他选项”手动分区。这时候硬盘上已经有 Windows、Ubuntu 18.04 的分区你需要找准剩下的空闲空间。给 20.04 分区时我一般会分swap16GB如果内存很大也可以不单独分改用 swap 文件但单独分区更直观。/80GBext4。/home剩余空间ext4。同样最下方的“安装启动引导器的设备”选择同一个 EFI 分区。安装程序会提示 EFI 分区已有其他系统问你是否格式化一定要选“否”只挂载不格式化。如果手滑格式化了Windows 和 18.04 的引导都会消失虽然能修复但没必要冒这个险。安装过程中会检测到已存在的系统问你是“清除整个磁盘”还是“与它们共存”。这里千万选“其他选项”不要选自动共存自动模式可能会把 18.04 的分区当成空闲空间重新划分。手动分区虽然看起来复杂但只要认准空闲空间和 EFI 分区基本不会出错。3.3 安装后立即要做的事更新与驱动两个 Ubuntu 都装好后先进入 Ubuntu 20.04打开终端执行sudo apt update sudo apt upgrade -y sudo apt install build-essential git curl wget vim -y这些基础工具后面编译 ROS、ORB-SLAM3、Docker 都会用到。如果你需要 Python 环境20.04 自带 Python 3.818.04 自带 Python 3.6建议不要随意替换系统 Python可以用virtualenv或者conda管理项目环境。接着安装显卡驱动。热词里提到的apt install nvidia-driver-535是可行的但 20.04 官方源默认可能没有 535需要先添加显卡驱动 PPAsudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update sudo apt install nvidia-driver-535装完后重启执行nvidia-smi如果能看到显卡型号和驱动版本就说明成功了。18.04 的显卡驱动版本可能要低一些比如 470 或 510建议用ubuntu-drivers devices查看推荐版本再用sudo ubuntu-drivers autoinstall自动安装。注意两个系统可以安装不同的驱动版本互不影响。注意安装 NVIDIA 驱动前最好先禁用 nouveau 驱动。虽然 Ubuntu 的 apt 安装方式会自动处理但如果你之前手动装过.run 文件可能会冲突。可以在/etc/modprobe.d/blacklist-nouveau.conf里加入blacklist nouveau和options nouveau modeset0然后sudo update-initramfs -u。4. GRUB 引导管理与默认启动项设置4.1 让 os-prober 识别所有系统三系统装完后开机应该出现 GRUB 菜单。如果只看到 Ubuntu 20.04没有 Windows 和 18.04先别慌大概率是os-prober没开。编辑/etc/default/grubsudo vim /etc/default/grub找到GRUB_DISABLE_OS_PROBERtrue这一行改成false或者如果被注释掉了就取消注释并设为false。然后执行sudo update-grub这个命令会扫描所有磁盘分区寻找可引导的系统。正常情况下输出里会列出Found Windows Boot Manager on /dev/nvme0n1p1和Found Ubuntu 18.04 on /dev/nvme0n1p5之类的信息。如果还是找不到可能是 Windows 的 EFI 分区没有挂载可以手动挂载一下再试sudo mount /dev/nvme0n1p1 /mnt sudo update-grub4.2 修改默认启动项与超时时间GRUB 默认会启动排在第一位的系统通常是最后安装的 Ubuntu 20.04。如果你希望默认启动 Windows或者固定启动某个 Ubuntu就要修改GRUB_DEFAULT。打开/etc/default/grub你会看到GRUB_DEFAULT0 GRUB_TIMEOUT10GRUB_DEFAULT0表示默认启动菜单里的第一个条目。菜单条目的顺序可以在开机时数一下也可以执行grep menuentry /boot/grub/grub.cfg查看。如果你想默认启动 Windows假设 Windows 是第三个条目就把GRUB_DEFAULT改成2从 0 开始计数。更稳妥的写法是用菜单标题GRUB_DEFAULTWindows Boot Manager (on /dev/nvme0n1p1)这样即使条目顺序变了也能正确匹配。GRUB_TIMEOUT是菜单等待时间单位秒建议设成 10 到 15 秒太短了来不及选太长了每次开机都等。修改完保存再执行sudo update-grub下次重启就生效了。如果你想让 GRUB 记住上次启动的系统可以设置GRUB_DEFAULTsaved然后执行sudo grub-set-default指定默认项不过三系统场景下我更喜欢固定默认项避免混乱。4.3 从一个系统修复另一个系统的引导这是热词里问得最多的问题双系统下如何从一个系统修复另外一个系统的引导。最常见的场景是 Windows 更新后GRUB 菜单消失开机直接进 Windows或者 Ubuntu 内核升级后18.04 的引导项不见了。先说 GRUB 菜单消失、直接进 Windows 的情况。这通常是因为 Windows 更新把 EFI 分区里的bootmgfw.efi设成了第一启动项。解决办法有两个一是进 BIOS把启动顺序里的ubuntu调到Windows Boot Manager前面二是用 Ubuntu Live USB 启动挂载原系统重新安装 GRUB。用 Live USB 修复的步骤稍微复杂一点但非常通用。假设你的 Ubuntu 20.04 根分区是/dev/nvme0n1p5EFI 分区是/dev/nvme0n1p1sudo 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后面跟的是整个硬盘设备不是分区。执行完update-grub后它应该能重新识别 Windows 和另一个 Ubuntu。如果另一个 Ubuntu 的引导项还是没出现可以进入那个系统执行同样的update-grub或者检查/etc/default/grub里的os-prober是否开启。还有一种更省事的工具叫boot-repair在 Live USB 里安装后一键修复适合不想敲命令的人sudo add-apt-repository ppa:yannubuntu/boot-repair sudo apt update sudo apt install boot-repair boot-repair选择“推荐修复”它会自动处理大部分引导问题。不过我个人还是建议学会手动chroot因为有些特殊分区布局 boot-repair 也会翻车手动方式更可控。5. 显卡驱动、时间同步与显示器设置5.1 Ubuntu 20.04 安装 NVIDIA 535 驱动前面已经提了apt install nvidia-driver-535这里再展开说一下完整流程和避坑点。首先确认你的显卡型号支持 535 驱动一般来说 GTX 10 系到 RTX 40 系都没问题。执行ubuntu-drivers devices输出里会列出可用的驱动版本推荐版本后面会有recommended字样。如果你想指定 535就执行sudo apt install nvidia-driver-535安装完成后重启运行nvidia-smi。如果报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver说明驱动没加载成功。常见原因有三个Secure Boot 没关、nouveau 没禁用、或者内核头文件没安装。解决方法分别是进 BIOS 关闭 Secure Boot、检查 blacklist 文件、安装linux-headers-$(uname -r)。对于跑 ORB-SLAM3 或者深度学习的用户还需要装 CUDA 和 cuDNN。CUDA 版本要和驱动匹配535 驱动支持 CUDA 12.x。装完 CUDA 后记得把/usr/local/cuda/bin加入 PATH把/usr/local/cuda/lib64加入 LD_LIBRARY_PATH。这些环境变量可以写在~/.bashrc里重启终端生效。5.2 解决 Windows 与 Linux 时间不同步双系统用户几乎都会遇到这个问题从 Ubuntu 切回 Windows发现系统时间少了 8 小时反过来也一样。原因是 Windows 把硬件时钟当作本地时间而 Linux 默认把硬件时钟当作 UTC。解决办法有两种选一种就行不要两边都改。第一种让 Linux 使用本地时间timedatectl set-local-rtc 1 --adjust-system-clock这样 Linux 会和 Windows 保持一致但缺点是 Linux 的夏令时处理可能不完美。第二种让 Windows 使用 UTC这是更推荐的方案。在 Windows 里以管理员身份运行命令提示符执行reg add HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /d 1 /t REG_DWORD /f然后重启 Windows时间就正常了。三系统下两个 Ubuntu 都默认使用 UTC所以只需要改 Windows 一次一劳永逸。5.3 主副屏与分辨率配置Ubuntu 20.04 对多显示器的支持已经不错一般插上就能识别。如果主副屏顺序不对可以在“设置”-“显示”里拖拽屏幕位置选择主显示器。命令行方式可以用xrandr查看接口和分辨率xrandr假设你的主屏是HDMI-1副屏是DP-1想把 HDMI-1 设为主屏并放在左边xrandr --output HDMI-1 --primary --auto --pos 0x0 xrandr --output DP-1 --auto --pos 1920x0如果分辨率不对可以用--mode指定比如--mode 1920x1080。这些命令可以写成脚本放在~/.profile或者开机自启里。NVIDIA 显卡用户还可以用nvidia-settings图形化配置保存到 X 配置文件后重启也能生效。实操心得Ubuntu 18.04 对高分辨率屏幕的缩放支持不如 20.04 好如果副屏是 4K可能需要手动调整缩放比例。可以在“设置”-“显示”里把缩放调到 150% 或 200%或者用xrandr --scale参数。如果外接屏幕没声音检查“设置”-“声音”里的输出设备手动选到 HDMI 或 DP 对应的声卡。6. 常见问题速查与避坑清单6.1 安装过程中的典型报错与处理安装双系统时最容易遇到下面这些报错我整理成表格方便你对照排查。现象可能原因解决办法卡在“Detecting file systems”硬盘有坏道或分区表错误用gparted检查分区表修复后再装提示“No EFI System Partition”EFI 分区没挂载或类型不对手动把 EFI 分区挂载到/boot/efi类型设为efi安装程序崩溃ISO 损坏或 U 盘质量差重新下载 ISO校验 SHA256换 U 盘装完重启直接进 WindowsGRUB 没写入 EFI 或启动顺序不对进 BIOS 调整启动顺序或用 Live USB 重装 GRUB屏幕黑屏只有光标显卡驱动问题启动时加nomodeset参数进系统后装驱动无线网卡不能用缺少固件用有线网连上后sudo apt install linux-firmware这里重点说一下nomodeset的用法。如果安装完第一次重启就黑屏在 GRUB 菜单里按e编辑启动项找到quiet splash在后面加上nomodeset按F10启动。进入系统后安装正确的显卡驱动再把这个参数去掉。这是一个临时方案不要长期保留否则显卡性能会受影响。6.2 引导丢失后的急救流程引导丢失分几种情况。第一种是开机显示grub rescue这通常是 GRUB 找不到自己的模块目录。可以用ls命令查看分区找到 Ubuntu 根分区然后手动设置set prefix(hd0,gpt5)/boot/grub set root(hd0,gpt5) insmod normal normal进入系统后再执行sudo grub-install /dev/nvme0n1和sudo update-grub彻底修复。第二种是开机直接进 Windows连 GRUB 菜单都没有这时候需要进 BIOS 把ubuntu启动项调到第一位或者用bcdedit添加引导项。在 Windows 管理员命令行里bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi这个命令会让 Windows 引导管理器把 GRUB 作为默认引导。不过更推荐在 BIOS 里调整因为bcdedit改完后Windows 大版本更新可能会重置。第三种情况是某个 Ubuntu 的引导项在 GRUB 菜单里消失了但系统还在。这通常是因为另一个系统执行update-grub时没有扫描到它。可以进入还在的系统挂载消失系统的根分区然后sudo update-grub。如果还不行检查/etc/grub.d/30_os-prober是否有执行权限sudo chmod x /etc/grub.d/30_os-prober sudo update-grub6.3 卸载某个 Ubuntu 并恢复 Windows 引导如果你后面不想用 Ubuntu 18.04 了想把它卸载掉步骤要小心别把 20.04 和 Windows 一起搞坏。首先在 Windows 里用“磁盘管理”或者DiskGenius删除 18.04 对应的分区但不要动 EFI 分区和 20.04 的分区。删完后EFI 分区里可能还残留\EFI\ubuntu文件夹里面同时有 18.04 和 20.04 的 GRUB 文件不要整个删掉否则 20.04 也启动不了。正确的做法是进入 Ubuntu 20.04执行sudo update-grub它会自动清理掉 18.04 的菜单项。然后进入 Windows用EasyUEFI或者bcdedit删除多余的 Ubuntu 启动项。如果你只想保留 Windows把整个 Ubuntu 都卸载那就删除所有 Linux 分区然后进 BIOS 把Windows Boot Manager设为第一启动项再用 Windows 安装盘执行bootrec /fixboot和bootrec /rebuildbcd修复引导。注意删除分区前一定要确认分区内容别看着大小差不多就删。我见过有人把 Windows 的恢复分区当成 Ubuntu 分区删掉结果系统恢复功能没了。建议在 Ubuntu 里用lsblk -f和sudo fdisk -l反复确认分区号和文件系统类型确认无误再动手。最后再分享一个我装三系统时总结的小技巧装完所有系统后在 Windows 里用DiskGenius给每个分区加上卷标比如WinOS、Ubuntu20、Ubuntu18、Data这样在 BIOS 启动菜单和 GRUB 里看到的名字更直观不容易选错。另外Ventoy U 盘不要急着格式化留着它可以在系统出问题时随时启动 Live 环境比到处找启动盘方便得多。我自己的这台开发机已经稳定跑了两年三系统中途经历过 Windows 大版本更新、Ubuntu 内核升级、显卡驱动重装只要 EFI 分区没被格式化GRUB 基本都能自动识别回来。真遇到引导丢失按照上面的chroot流程走一遍十分钟就能恢复。
返回列表