1. 为什么我最终选择了双系统,而不是虚拟机或WSL
1.1 三种方案的对比
先说说我的实际感受。早些年折腾 Linux 我第一反应就是装虚拟机,毕竟怕把 Windows 搞崩。后来接触 WSL 也确实觉得方便,但现在我主力机用的是 Ubuntu 22.04 和 Windows 11 双系统,已经稳定跑了半年多。如果你也在纠结"到底用哪种方式跑 Linux",我的建议是:看你要拿它干什么。
虚拟机(如 VirtualBox 或 VMware)的好处是隔离性强、可以随便快照,适合临时测试和编译一些不干净的东西。但它的性能损失很明显,尤其是 I/O 密集型和 GPU 相关的工作。WSL 则是微软官方的"轻量 Linux 兼容层",启动快、与 Windows 文件系统互通,适合做命令行工具链和简单的服务端开发。可一旦涉及到内核模块、硬实时控制、复杂驱动、或者需要直接操作物理设备的场景,WSL 和虚拟机都撑不住。真实硬件和操作系统之间那层虚拟化抽象,始终会在关键时刻给你添乱。
双系统最直接的价值就是性能完整、兼容性零折扣。你把整块硬盘的一部分交给 Ubuntu,它能直接访问物理硬件,包括显卡直通、NVMe 磁盘读写、USB 设备控制,这些都是虚拟化方案无法完全替代的。缺点也明显:切换系统必须重启,磁盘分区要提前规划好,引导管理要小心处理。但对我来说,这些麻烦只发生在安装头几天,之后就是成熟的系统日常使用体验,完全值得。
1.2 双系统的适用场景与硬件准备
什么样的人适合双系统?我总结下来是这几类:需要跑深度学习或科学计算训练的同学,需要接触真实 Linux 内核和驱动的嵌入式开发者,以及像我这样日常办公还在 Windows 上、但开发环境完全依赖 Linux 工具链的自由职业者。如果你只是偶尔跑几条 Linux 命令,那 WSL 真的就够了,别折腾双系统。
硬件准备方面,我这次是在一台 Intel + NVIDIA 独显的笔记本上装的,以下配置可以作为参考:
- 一台预装 Windows 11 的笔记本(UEFI 启动模式,不是传统 BIOS)
- 独立的固态硬盘分区,或单独一根 M.2 SSD(强烈推荐,后面讲原因)
- 一个 ≥8GB 的 U 盘用于制作启动盘
- 一台有正常网络的路由器,方便安装时下载更新和驱动
我强烈建议物理上准备一块独立硬盘装 Ubuntu,而不是在 Windows 那块盘上硬切分区。如果你只有一个硬盘,那至少要先压缩出 100GB 以上的可用空间。双系统最大的风险从来不是安装失败,而是分区表出问题导致 Windows 也进不去。独立硬盘能把这种风险降三档。
2. 双系统安装的核心流程与分区细节
2.1 安装前准备:U盘、启动模式、关闭安全启动
先从制作启动盘说起。我用的工具是 Rufus,在 Windows 下写 Ubuntu 22.04 镜像很简单,选好 ISO 文件、目标 U 盘,分区类型选 GPT,目标系统类型选 UEFI,其他默认即可。注意 Rufus 在写入时可能会提示下载一个文件,这是为了兼容老机器,台式机可以接受,笔记本建议直接选择"以 DD 镜像方式写入",兼容性更好。
U 盘写好后,不要急着进安装界面。先做两件事:关掉 BitLocker 加密(如果硬盘开过加密,磁盘管理里直接暂停保护),并进入 BIOS 关闭 Secure Boot。Secure Boot 是 UEFI 安全引导机制,Ubuntu 22.04 其实可以兼容它,但很多 PC 厂商对第三方证书支持得不好,为了避免不必要的引导问题,我选择直接关闭,装完再决定是否开启。
启动方式要注意:插入 U 盘开机时,快速按开机菜单键(常见是 F12、F10 或 Esc,不同品牌不一样),选择带 UEFI 前缀的 U 盘启动项,不要选 Legacy 或传统模式的条目。启动菜单里的 U 盘可能会显示两次,选 UEFI 那个,否则容易以错误模式进入安装环境,后续会产生混乱。
2.2 分区策略:EFI分区、交换分区、根分区与家目录
到了安装器选安装类型时,一定要选"Something else"(其他选项),千万别一路点"清除整个磁盘并安装 Ubuntu",那会把 Windows 的引导都抹掉。手工分区比较简单,我这次是这样分的:
| 分区 | 大小 | 类型 | 格式 | 挂载点 |
|---|---|---|---|---|
| EFI 系统分区 | 100MB(或已有 Windows EFI 分区则共用) | 主分区 | FAT32 | /boot/efi |
| 根分区 / | 100GB | 逻辑分区 | ext4 | / |
| 家目录 /home | 剩余空间 | 逻辑分区 | ext4 | /home |
| 交换分区 swap | 与内存大小相当(如 16GB) | 逻辑分区 | swap | swap |
共享已有 EFI 文件时,可以直接选 Windows 那个 100MB 左右的 FAT32 分区挂载到 /boot/efi,不要格式化它。这样 GRUB 和 Windows Boot Manager 会放在同一个 EFI 分区里,之后修复引导会省很多事。如果机器自带多个 EFI 分区(比如某些品牌机),最好新建一个 100MB 分区给 Ubuntu,避免互踩。
交换分区很多人会问要不要。如果你内存 32GB 以上且不用休眠,理论上可以不建。但一些老旧软件或编译大项目时,swap 能救急,我还是建议建一个,大小跟内存相同即可,或者用 swap 文件替代,不过第一次安装,分区方案越简单越不容易出错。
根分区和 /home 分开是良好习惯。后续系统崩溃想重装时,只要不动 /home,个人文件和配置文件都能留下来。另外,根分区大小建议至少 80GB 以上,因为 apt 缓存、docker 镜像、编译产物都会膨胀。我自己 100GB 的根分区到现在用了 60 多GB,还算舒服。
2.3 安装过程中的几个关键选项
分区完成后,检查底部"Device for boot loader installation"选项,要选 /dev/nvme0n1(整块磁盘),而不是某个分区。这一点很多人忽略,选成分区后 GRUB 可能装到错误位置,导致开机没有引导菜单。
后续的安装过程无非是设置用户名、机器名、时区、键盘布局。我建议时区选上海,同时记一下机型,别勾选"安装第三方软件"里的 NVIDIA 驱动和媒体解码器,尤其是旧版本镜像。默认安装的测试驱动经常和系统不兼容,还是先用系统自带的 vesa 驱动,等装完系统再手动安装合适版本的官方驱动。
安装完成后首次开机,如果顺利进入 GRUB 菜单并看到 Ubuntu 和 Windows Boot Manager 两个选项,那基本成功。但我在实际安装中,有三次都卡在了"开机直接进 Windows"这个经典问题上,下面展开说说怎么处理。
3. 引导过程中的常见问题与修复方案
3.1 开机直接进Windows,没有引导菜单
安装完成后重启,如果电脑直接黑屏然后进了 Windows 登录界面,十有八九是 UEFI 启动顺序里 Windows Boot Manager 排在 GRUB 前面。这种情况不用重新安装系统,进 BIOS 的 Boot 选项,把 Ubuntu 相关的启动项(通常是 "ubuntu" 或分区描述为 "Linux bootloader" 的项)拖到第一位。
不过有些机器很奇怪,BIOS 里明明设了 Ubuntu 优先,开机还是直接进 Windows。这时候有一个更彻底的方案:用 efibootmgr 调整。先在 Windows 的"磁盘管理"里看有没有一个 FAT32 的 ESP 分区,确认 Ubuntu 的引导文件已经写进去了。然后进 Ubuntu 的恢复模式或者用 U 盘进入 Live 环境,执行:
sudo efibootmgr -v这条命令会列出所有 EFI 启动项和它们的编号。找到名字类似 "ubuntu" 的项,比如编号 0001,然后用下面的命令调整启动顺序:
sudo efibootmgr -o 0001,0000其中 0000 是 Windows Boot Manager 的编号。设置完之后再重启,GRUB 菜单就会自动出现在第一位。
3.2 GRUB修复与默认启动项调整
如果引导菜单是出现了,但 Ubuntu 进去直接黑屏或者 GRUB rescue 提示找不到分区,那就需要 chroot 修复 GRUB。这种情况常见于分区时挂载点搞错,或者 EFI 分区里文件不完整。操作思路是用 U 盘启动盘进入 Live 环境,然后挂载 Ubuntu 的根分区和 EFI 分区,再 chroot 进去重新安装 GRUB。
我提供一个稳妥的命令流程,假设根分区是 /dev/nvme0n1p5,EFI 分区是 /dev/nvme0n1p1:
sudo mount /dev/nvme0n1p5 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt在 chroot 环境里执行:
grub-install /dev/nvme0n1 update-grub如果 GRUB 能顺利生成菜单并且找到 Windows,说明修复成功。我见过太多人卡在 mount 顺序上,其实只要注意先挂根分区再挂 /boot/efi,最后检查 /mnt/boot/efi 目录下有没有东西,基本不会错。
另外,即使 GRUB 正常,每次开机都要手动从菜单里选系统也烦人。可以改 /etc/default/grub 里的 GRUB_DEFAULT 和 GRUB_TIMEOUT。比如把默认启动项设为 Windows,可以先用grep menuentry /boot/grub/grub.cfg查看条目名,然后把 GRUB_DEFAULT 写成那个条目名字(注意要带引号):
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)" GRUB_TIMEOUT=5改完后执行sudo update-grub即可。这个技巧省去了每次改默认系统的麻烦。
3.3 时间错乱问题:Windows与Ubuntu的RTC冲突
装完双系统后你会发现一个老问题:系统时间总差 8 小时。原因很简单,Windows 认为 BIOS 硬件时钟存储的是本地时间,Ubuntu 默认认为硬件时钟存储的是 UTC 时间。两个系统对同一块 RTC 时钟的不同解读,导致时间错位。
解决办法我推荐调整 Ubuntu,让它也把硬件时钟当本地时间。执行:
sudo timedatectl set-local-rtc 1然后用timedatectl status确认 RTC 为 local time。这个方案比去 Windows 注册表里改 RealTimeIsUniversal 要简单,而且影响范围只在 Linux 这边。需要注意一点:如果你在 Ubuntu 里装了 Docker 或其他依赖时间同步的服务,改完本地时间后个别容器日志的时间显示可能会怪怪的,但大部分场景无感。
如果你更喜欢让 Windows 使用 UTC,也可以。Win + R 打开 regedit,找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation新建一个 DWORD 值,名字叫RealTimeIsUniversal,值设为 1,重启后 Windows 就会把 RTC 当 UTC。两种方式选一种即可,我推荐第一种,省得以后重装系统还要再改。
4. 显卡驱动与显示相关的配置记录
4.1 禁用Nouveau与安装NVIDIA驱动
我这台笔记本的显卡是 NVIDIA 独显 + Intel 核显,安装完 Ubuntu 22.04 后默认使用开源的 Nouveau 驱动。说实话,Nouveau 能进桌面、能看视频,但一旦涉及 CUDA、Blender 渲染或高负载游戏,性能损耗和稳定性问题就暴露出来了。为了保证工作流顺畅,我选择手动安装 NVIDIA 官方驱动。
安装之前,先禁用 Nouveau。编辑 /etc/modprobe.d/blacklist-nouveau.conf,写入:
blacklist nouveau options nouveau modeset=0然后执行sudo update-initramfs -u,重启。这里注意,如果驱动已经自动加载,重启后在lsmod | grep nouveau里的输出应该是空的,否则说明黑名单没生效,需要再检查一次。
之后从 NVIDIA 官网根据自己的显卡型号下载 .run 安装包,或者直接用官方的 apt 仓库源。我这次用的是显卡型号对应的官方 .run 包,执行:
sudo bash NVIDIA-Linux-x86_64-xxx.run --no-opengl-files加了--no-opengl-files是因为我用的是 Intel 核显输出画面,NVIDIA 只用做计算和渲染加速,这样可以避免 OpenGL 文件头和系统自带的 libgl 冲突。如果只装了 NVIDIA 独显的机器,就不要加这个参数。
装完后运行nvidia-smi,能看到驱动版本和显存信息就说明成功了。遇到驱动和内核版本不匹配导致无法加载的话,可以先更新系统内核,再重装驱动。
4.2 混合显卡与低功耗设置
在笔记本上,还有个绕不开的问题:双显卡切换。Ubuntu 22.04 上的混合显卡管理方式可以在"软件和更新"的附加驱动里选择,也可以通过 nvidia-prime 命令切换。默认情况下,我建议用on-demand模式,也就是说平时轻量任务走核显,跑 CUDA 或外部显示器时才调用独显,这样续航能明显改善。
切换命令很简单:
sudo prime-select on-demand切换完需要重新登录或者重启,用prime-select query查看当前模式。如果你像我一样经常不插电办公,可以直接切到nvidia模式,但代价是功耗高、发热大。反过来,如果只用浏览器写文档,切到intel模式,续航立竿见影。需要提醒一句,刚切完模式如果系统里某些显卡程序崩溃,先sudo prime-select reset再重装一次驱动,千万别急着怪双系统。
4.3 分辨率、缩放与多显示器问题
我这台机器外接显示器时出过一个问题:HDMI 输出只有 4K 30Hz,刷新率上不去。排查下来是线材和接口带宽的问题,但 Ubuntu 这边也有个类似的情况——缩放错误导致字体发虚。在 Wayland 会话里,GNOME 设置里的"分数缩放"默认值通常 100% 或 200%,如果你用 150% 缩放就会感觉有些应用是模糊的,这其实是混合缩放导致的。
纯 X11 会话下,可以用 xrandr 手动指定分辨率,但小屏幕搭配高分屏的缩放依旧恶心。我实际使用中觉得最舒服的组合是:内屏用 100% 缩放,外接显示器用 125%,并且把笔记本盖子合上只使用外接屏时,系统分辨率自动切到外接屏的原始分辨率。这个需求可以通过设置 → 显示器,把外接显示器设为主显示器。如果你遇到外接显示器不识别,多半是线材或转接头的问题,先试试 Windows 下是否正常,排除硬件因素再回来折腾驱动。
5. 系统使用中的实用配置与软件安装
5.1 换源与系统更新
装完系统第一件事永远是换软件源,否则 apt 下载速度能把人急死。Ubuntu 22.04 的软件源配置文件是 /etc/apt/sources.list,我用的是官方源镜像,也可以选择国内高校镜像,比如某些大学或地区镜像站。改源之前先备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑 sources.list,把archive.ubuntu.com替换成对应镜像地址。如果你是刚开始用,最简单的办法是用软件和更新这个 GUI 工具,在"Ubuntu 软件"标签页里把下载服务器换成镜像站点,应用后自动刷新,零命令行压力。
换完源不要急着大升级,先看系统有没有内核更新。我一般会用sudo apt update && sudo apt upgrade出现提示后,先看软件包列表里有没有linux-generic这类内核包,如果有就慢慢更。内核升级通常需要重启才能生效,所以我通常等所有工作收尾后统一重启,免得打断工作。
5.2 中文输入法与字体渲染
中文输入法是刚需。Ubuntu 22.04 自带 ibus,我习惯用拼音输入法框架。如果是第一次配置,直接装 fcitx5 和 fcitx5-chinese-addons,然后在"设置 → 区域与语言 → 输入源"里添加"汉语 (Intelligent Pinyin)",切换键默认是 Super+Space,也能通过设置改。
有个小坑:在 Wayland 会话里某些 GTK 应用(比如个别输入框)可能无法弹出候选词,最简单的解决方式是把会话切回 Xorg 登录(登录界面左下角的齿轮菜单选"Ubuntu on Xorg")。反正我是直接使用 Xorg,稳定可靠不折腾。
字体方面我建议装fonts-noto-cjk,中英文渲染效果比默认字体好很多,尤其是浏览网页和写代码时的中文注释看起来很舒服。如果想要更精致的显示密度,可以调 GNOME 的字体缩放或使用 infinality 的补丁,但说实话对多数人来说 Noto CJK 已经足够。
5.3 常用开发环境搭建(vim、git、终端美化)
开发环境的搭建讲究"顺手"。我先装基础工具:
sudo apt install build-essential vim git curl wget然后配置 git 的用户名和邮箱,再把默认分支名改成 main:
git config --global user.name "your name" git config --global user.email "you@example.com" git config --global init.defaultBranch main终端之美,在折腾中体现。我用的是默认的 GNOME 终端 + zsh + oh-my-zsh,装完后再加一个语法高亮插件:
sudo apt install zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting不过这有个前提:网络能正常访问 GitHub。如果你的网络环境受限,可以改用 gitee 镜像,或者干脆用 bash + 手动配置 prompt,效果也不差。我不建议在主题名上纠结,默认的 robbyrussell 就已经很清爽了。
之后把配置文件纳入版本管理,这是个好习惯。我会把 ~/.zshrc、~/.gitconfig 放到一个 dotfiles 仓库里,重装系统后git clone下来软链接一遍就回来了,省时省力。Ubuntu 22.04 的双系统折腾本质上就是一次"环境重建练习",把配置文件管理好了,后续换机器都是分钟级的事。
6. 使用中的典型故障排查速查表
6.1 开机黑屏 / 卡logo
这是双系统使用中遇过最多的问题,几乎每次都出现在显卡驱动或 GRUB 相关的地方。开机卡在 logo 处动弹不得,最常见的原因是 Nouveau 驱动与系统内核配合出了问题。处理方法是用启动盘的"恢复模式"进入系统,然后禁掉 nouveau 并重新安装合适驱动。如果你进不了恢复模式,GRUB 菜单下按 e 编辑启动参数,在 linux 行末尾加上nomodeset,启动后再卸载 Nouveau。
另一个黑屏场景是 GRUB 菜单出现但选择 Ubuntu 后屏幕直接黑。这种我会先试试启动参数里加acpi=off或pci=noacpi,但这只是排查手段,不是长期方案。如果加了这个参数就能进系统,多半是内核 ACPI 表处理有兼容性问题,最后通过更新 BIOS 或降级内核版本解决。
6.2 关机/重启卡死
Ubuntu 22.04 默认的 systemd 在某些机器上会在关机时卡住,屏幕停在 "A stop job is running for ..." 那里,甚至要等 90 秒才彻底关闭。这个问题的根源往往是某些服务在退出时没有响应,或者是 NVIDIA 驱动在卸载 GPU 上下文时超时。
我遇到过一次正是 NVIDIA 的问题。解决方式是安装完驱动后,在 /etc/modprobe.d/ 下额外加一个配置,让模块卸载时更干脆:
options nvidia-drm modeset=1或者直接缩短 systemd 的超时时间,编辑 /etc/systemd/system.conf:
DefaultTimeoutStopSec=10s但这只是治标,关键还要排查哪个服务卡住。查看最后一句日志基本就知道是谁了,常见的有 NetworkManager-wait-online.service,这个可以禁用掉:
sudo systemctl disable NetworkManager-wait-online.service6.3 磁盘空间不足与扩容
双系统用久了最头疼的就是根分区空间不够。如果是安装时把根分区只分了 50GB,现在编译几个项目就满了,那种抓狂我懂。在虚拟机里扩容是改 vmdk,而实体双系统扩容需要动分区表,风险较大。
我建议在规划阶段就把 /home 独立出来,并将所有大数据(docker 镜像目录、conda 环境、虚拟内存)都放到 /home 下,这样将来即使 / 分区满了,只要 /home 有空间,还能用软链接ln -s /home/data /opt/cache之类的办法迁移。如果确实要扩根分区,可以用 GParted 的 Live U 盘,把相邻分区缩容,然后把未分配空间合并到根分区。注意这一步务必先备份,任何改动分区表的操作都有翻车可能,别问我怎么知道的。
6.4 引导项丢失、内存不足等杂项
Windows 更新后经常会把 GRUB 覆盖掉,开机菜单直接消失,只剩 Windows Boot Manager。这种情况不用慌,再用 Ubuntu 启动盘进 Live 环境,按前面 3.2 节提到的一整套 chroot 流程重新装一次 GRUB 就好。我建议在 Windows 里关闭"快速启动"(控制面板 → 电源选项 → 选择电源按钮功能 → 更改当前不可用设置,取消勾选"启用快速启动"),这能减少 Windows 更新对 EFI 分区的占用和锁定,从源头上降低引导丢失的概率。
内存不足的报错常见于开虚拟机和大型 IDE 同时跑的情况。我个人习惯是关闭 GNOME 的过度动画效果、限制 Chrome 的内存占用,必要时临时用echo 3 | sudo tee /proc/sys/vm/drop_caches清内存缓存。不过这只能应急,长期稳定还是建议加内存条或扩大 swap。
最后分享一个我踩过好几次的经验:双系统最忌讳随手升级内核。Ubuntu 22.04 的 HWE(Hardware Enablement)内核栈更新时,偶尔会把已经装好的 NVIDIA 驱动搞挂,表现为开机黑屏或登录循环。我的做法是先确认当前版本能正常使用,就固定内核版本,不盲目追新。遇到需要新内核支持硬件的情况,再单独安装一版内核,保留旧内核作为保险,grub 里还能手动回退。
说实话,从第一次装双系统到现在,我反而越来越喜欢这种"中间态"的生活方式。Windows 负责生活娱乐和某些行业软件,Ubuntu 负责写作、开发和跑重型计算,重启这个动作本身成了一个有仪式感的切换。之后再遇到引导问题、驱动问题,我也早就不慌了,新机器到手基本上半小时内就能把整套系统恢复到顺手状态。这套记录如果能帮你在折腾的路上少掉几根头发,就算值了。