把 Windows 抹掉、整块硬盘交给 Ubuntu 20.04 单系统,这事我前后干过三次:第一次是在一台老笔记本上试手,第二次是给一台工作台式机彻底换血,第三次是帮同事把他用了五年的双系统合并成单系统。三次里有两次顺利,一次翻车翻得挺彻底——分区表残留了 Windows 的恢复分区,装完能进系统,但每次开机 GRUB 都要等十秒,还多出一个无法挂载的分区提示。这篇文章就把这三回的经验揉在一起,从备份清点到启动盘制作、从固件设置到分区切割、从驱动安装到输入法和网络配置,一条线讲完。如果你手上有一台准备退役的 Windows 机器,想让它变成一台干净利落的 Ubuntu 20.04 单系统开发机,下面的内容基本可以直接照着做。
1. 先说清楚:把 Windows 换成 Ubuntu 20.04 单系统,到底动了哪些东西
1.1 单系统不是"装个系统"这么简单
很多人对"重装系统"的理解停留在光盘时代:塞进去、点下一步、等进度条。放到今天的 UEFI 机器上,这个过程多了三层东西需要你主动决策。第一层是固件层的引导配置,包括启动模式(UEFI 还是 Legacy)、安全启动开关、启动顺序,这些决定了你的安装盘能不能被识别、装完之后机器认不认这块硬盘上的引导程序。第二层是分区层的布局,Windows 安装时会自动创建 EFI 系统分区、MSR 保留分区、恢复分区以及 C 盘,这些分区在 Ubuntu 安装器眼里都是"可以覆盖的对象",但你如果只格式化了 C 盘,剩下几个几百兆的小分区就会留在那里碍事。第三层是系统层的驱动与配置,尤其是无线网卡、独立显卡和输入法,这三样是 Ubuntu 装完之后最容易让人抓狂的部分。
所以"重装成单系统"这件事的准确描述是:清空整块物理磁盘的所有分区,重新建立 GPT 分区表,按 Linux 的习惯重新划分 EFI 分区、交换空间和根分区,再在这套结构上部署一套完整的操作系统。Windows 的一切——包括引导项、恢复分区、隐藏的系统保留分区——都会被抹掉。这一点必须提前想清楚,因为抹掉之后想回头,只能重新装 Windows。
1.2 20.04 现在还能不能当主力
Ubuntu 20.04 是 LTS 版本,官方维护周期到 2025 年 4 月(标准支持期),之后还有一段 ESM 扩展维护。它的价值在于生态成熟、资料多、踩坑帖子遍地都是,无论遇到什么报错,搜一下基本都能找到同版本的解决方案。20.04 自带的内核是 5.4 系列,后续通过 HWE 内核可以升到 5.15,对新硬件的兼容性还算可以。它的软件仓库里 Python 3.8 是默认版本,GCC 9、OpenJDK 11 也都齐全,对于跑后端服务、做嵌入式交叉编译、写脚本这类需求完全够用。
需要留意的是软件版本偏旧。如果你要用最新的 Node.js、最新的 Go 或者某些只在较新 glibc 上编译的工具,就得自己加第三方源或者用版本管理工具(nvm、gvm 之类)。另外一部分新出的硬件,尤其是 2023 年之后上市的笔记本,无线网卡和指纹模块的驱动可能不在 20.04 的内核里,需要手动装 backport 驱动或者换更新的内核。这不是 20.04 的锅,任何 LTS 版本都有这个问题。
1.3 三类人适合这么干,两类人最好再想想
适合单系统的第一类是开发机专用机器:这台电脑只用来写代码、跑容器、连服务器,不需要 Windows 上的办公软件和游戏。第二类是老机器救活:一台四代酷睿加机械硬盘的笔记本,装 Windows 11 装不动,装 Ubuntu 反而流畅,这种场景收益最大。第三类是需要长时间跑服务的机器,比如放在角落里当构建机、当媒体服务器,Linux 的资源占用和远程管理能力明显更省心。
反过来,有两类人我建议保持双系统或者干脆别动。一类是依赖 Windows 独占软件的,比如某些财务软件、部分行业软件、Adobe 全家桶,虽然 Linux 上有替代品,但工作流切换的成本往往被严重低估。另一类是只有这一台电脑且不能停机的,重装过程至少需要半天,中间出错还要排查,如果第二天有活要交,别在这个时候动手。判断标准很简单:你能不能接受这台机器两天之内不可用。能接受,就往下看。
2. 动手前的那半天:数据清点、镜像与启动盘
2.1 备份清单:真正会后悔的东西是什么
大部分人备份的时候只想着"我的文件",结果装完系统才想起来少了一堆东西。我整理过一份自己的清单,按重要性排序。
排在第一位的是不可再生的个人数据:照片、视频、自己写的文档、录音、设计稿。这些东西重新做一遍的成本无限大。第二梯队是配置类文件,包括浏览器书签和保存的密码(如果用了账号同步其实云端有,但没有同步习惯的人一定要手动导出)、SSH 私钥(~/.ssh/整个目录)、Git 全局配置(~/.gitconfig)、各种 IDE 的配置目录(比如 JetBrains 系列的配置可以导出成 zip)、终端配置(.bashrc、.zshrc、.vimrc)。这些文件单个都不大,但重配一遍能耗掉一整天。第三梯队是账号与授权信息:你自己购买的软件的账号密码、订阅服务的登录方式、公司内部工具的令牌。注意,这些东西要记在密码管理器里或者手写在本子上,别存在即将被抹掉的系统里。
还有一类容易被忽略:本地数据库和容器数据。如果你在 Windows 上跑过 MySQL、Redis、PostgreSQL,或者用 Docker 存过卷,数据默认都在系统盘的用户目录下,重装就全没了。要在 Windows 还活着的时候用mysqldump或者直接拷贝数据目录导出来。
具体怎么做?最省事的办法是准备一块移动硬盘,把上面三个梯队全部拷过去,然后在一台别的机器上打开确认一遍文件能正常读。这一步别省,我见过不止一次拷贝过程中断导致文件损坏的情况,当场不验证,等到新系统装好才发现,那时候 Windows 已经没了,想重拷都没机会了。
2.2 镜像下载与校验,别跳过这一步
Ubuntu 20.04 的桌面版镜像文件名类似ubuntu-20.04.6-desktop-amd64.iso,大小在 3.5GB 上下。20.04 系列出过好几个点版本(.1 到 .6),越靠后的点版本集成的更新越多,装完需要下载的补丁越少,所以优先选最新的点版本。下载渠道用官方发布页面或者国内高校的开源镜像站,速度会快很多。
下载完第一件事是校验哈希值。同一目录下会有一个SHA256SUMS文件,把镜像文件和它放在一起,用系统自带的工具算一下:
# Linux / macOS sha256sum ubuntu-20.04.6-desktop-amd64.iso # Windows PowerShell Get-FileHash .\ubuntu-20.04.6-desktop-amd64.iso -Algorithm SHA256把算出来的字符串和SHA256SUMS里对应那一行比对,完全一致才能用。这一步经常被人嫌麻烦跳过,但镜像损坏或者被中间环节篡改导致的后果是:写盘成功、能进安装界面,然后在复制文件阶段报一堆莫名其妙的读取错误,你会以为是硬盘坏了,其实只是 iso 有问题。五分钟的校验能省掉两小时的排查。
2.3 Rufus 写盘参数与写盘失败的常见原因
Windows 环境下写盘我一般用 Rufus,备选 balenaEtcher。用 Rufus 的时候有几个选项要盯住:
| 选项 | 推荐设置 | 原因 |
|---|---|---|
| 分区类型 | GPT | 对应后面要用的 UEFI 引导模式 |
| 目标系统类型 | UEFI(非 CSM) | 避免写出来的盘只支持 Legacy 启动 |
| 文件系统 | FAT32 | UEFI 固件原生识别,兼容性最好 |
| 簇大小 | 默认 | 不用改 |
点击开始后 Rufus 可能会弹窗问"是否以 ISO 镜像模式写入还是 DD 模式写入",选ISO 镜像模式,这样写出来的盘还能当普通 U 盘用。如果写完之后机器不认这个盘,可以换 DD 模式再写一次作为对照实验。
写盘失败的常见原因有三个。一是U 盘本身有坏块,尤其是那些用了很多年的便宜 U 盘,写到一半报错,换一个盘就好。二是U 盘被占用,杀毒软件或者资源管理器锁着盘符,关掉再写。三是U 盘容量标注造假,标 64G 实际只有 8G,写到 3.5G 之后开始报错,这种盘直接扔掉,别浪费时间。写盘完成后建议在 Windows 上打开 U 盘看一眼,正常应该能看到EFI目录、casper目录和几个文件,说明结构是对的。
3. 进 BIOS 之前,把固件和启动模式这件事想明白
3.1 UEFI 引导决定了后面分区怎么切
2020 年之后出厂的电脑,基本都是 UEFI 固件加 GPT 分区表的组合。这个组合下,系统引导需要一块EFI 系统分区(ESP),通常 100 到 550MB,格式是 FAT32,里面放.efi引导文件。固件启动时会在所有磁盘上扫描这个分区,找到引导项后交给它继续加载内核。
这件事对你的直接影响是:安装 Ubuntu 的时候,必须存在或者新建一块 EFI 分区。如果你选了"清除整个磁盘并安装",安装器会自动帮你建一块 512MB 左右的 ESP。如果你走手动分区,就得自己划一块出来,格式选EFI System Partition,挂载点不用填(或者填/boot/efi)。很多人手动分区时忘了这一步,装到最后报错"未检测到 EFI 分区"或者装完直接进不了系统。
还有个细节:如果你之前的 Windows 是 Legacy BIOS 模式装的(2013 年前后的机器比较常见),那套引导方式和新系统不一样。这种机器要么在固件里把模式切到 UEFI,要么就用 Legacy 模式装 Ubuntu。判断方法很简单,看固件设置里的启动项,带UEFI:前缀的就是 UEFI 启动。
3.2 快速启动、BitLocker、安全启动的处理顺序
进固件设置之前,有几个 Windows 侧的开关要先处理,顺序不能乱。
第一步关掉Windows 的快速启动。这个功能在控制面板的电源选项里,它的作用是关机时把系统状态存进休眠文件,开机直接读回来。开着它的时候,Windows 关机并没有真正释放硬盘,别人从 U 盘启动去动这块盘就可能出问题。
第二步处理BitLocker。如果你的 Windows 开了设备加密或者 BitLocker,在改变分区结构之前一定要先暂停保护或者完整解密。否则安装程序动到那块盘的时候,Windows 会认为系统被篡改,下次启动直接要求输入 48 位恢复密钥。密钥如果没备份,数据就取不回来了。这个坑很常见,尤其是一些品牌笔记本出厂默认就开了设备加密。
第三步才是决定安全启动(Secure Boot)开不开。Ubuntu 20.04 的安装镜像带微软签名的 shim,理论上开着安全启动也能装、也能启动。但装了第三方内核模块(比如某些无线网卡驱动、VirtualBox 的模块)之后,安全启动会拦住未签名的驱动,导致功能失效。我的做法是:先关掉安全启动装系统,装完驱动都调试好了,再决定要不要开回来。如果你不打算用需要签名的场景,就一直关着也行。
3.3 U 盘插上去识别不到的几种处理办法
进固件设置后第一件事是找启动顺序菜单,看有没有你的 U 盘。识别不到的情况我遇到过三次,原因各不相同。
第一次是U 盘插在了 USB 3.0 蓝色接口上,而固件版本太老,对 USB 3.0 的兼容有问题,换到 USB 2.0 的黑色接口就认了。第二次是启动模式对不上,盘是 UEFI 模式写出来的,固件却设在 Legacy 模式,两边互相看不见,把模式改成 UEFI 就正常了。第三次是固件里有"USB 启动"总开关被禁用,某些品牌机为了安全会默认关掉,需要在高级设置里打开。
排错的顺序建议是:先换接口(优先用机箱后面的、主板直连的 USB 口),再切启动模式,然后检查固件里的 USB 相关开关,最后才怀疑 U 盘本身。另外有个小技巧:如果 U 盘在别的机器上能启动、在这台上不行,可以在那台能启动的机器上做一次启动,然后立刻插到目标机器上,有时候固件需要"见过"一次这个盘才会记住它。
4. 安装器里最要命的十分钟:分区怎么切
4.1 "清除整个磁盘"与"其他选项"的分界线
Ubuntu 安装器走到"安装类型"这一步,会给你两个主选项。**"清除整个磁盘并安装 Ubuntu"会把你选中的那块盘上所有分区全删掉,自动建一块 ESP 加一块根分区,简单粗暴,适合整块盘都归 Ubuntu 的场景——也就是我们这篇要做的单系统。"其他选项"**则是手动分区,给你完全的控制权,也给你完全犯错的机会。
单系统场景下,我建议新手直接用第一个选项,原因很实际:自动分区会正确处理 ESP 的大小和位置,不会出现引导装不上的问题。但有一个前提——你要确认选中的是正确的那块盘。安装器会把机器上所有的硬盘都列出来,如果你有第二块数据盘,千万别选错。判断方法是看容量和型号,安装前先把机器上的盘都记清楚:比如系统盘是 512G 的 NVMe,数据盘是 2T 的机械盘,选的时候盯着 512G 那个。
如果你像我一样有特定需求——比如想把/home单独分出来方便以后重装保留数据,或者想要一块独立的交换分区——那就走手动分区。下面这套方案是我用了三次之后定下来的。
4.2 一套可以直接抄的分区方案与容量计算
以一块 512GB 的固态硬盘为例,我一般这么切:
| 挂载点 | 大小 | 类型 | 说明 |
|---|---|---|---|
/boot/efi | 512MB | EFI 系统分区 | 引导文件,别小于 300MB |
swap | 16GB | 交换空间 | 内存小于 16G 的机器建议给到内存的 1.5 倍 |
/ | 80GB | ext4 | 系统和软件安装位置 |
/home | 剩余全部 | ext4 | 个人数据,重装时可以保留 |
容量怎么算出来的?EFI 分区 512MB 是经验值,Windows 用 100MB 就够,Linux 内核和引导文件稍大一点,给到 512MB 可以同时容纳多个内核版本的引导文件,将来装多个发行版也不会挤。交换空间的传统规则是物理内存的 1 到 2 倍,但现在内存动辄 16G、32G,这个规则已经过时了。如果你的内存小于 8GB,建议给内存的 1.5 倍;8GB 到 16GB 之间给等量或者固定 16GB;超过 16GB 的机器,其实用系统默认的 swapfile 就够了,不需要单独分区。要不要休眠决定权在交换空间够不够——想用休眠功能,交换空间至少要等于物理内存大小。
根分区 80GB 对大多数人是够的,因为主要占地方的是 IDE、Docker 镜像、node_modules 这些东西,而它们要么在/home,要么可以通过软链接挪走。如果你重度使用 Docker,建议给到 120GB,因为 Docker 默认把镜像存在/var/lib/docker下面,属于根分区。/home给剩余全部,这个分区在将来重装系统或者换发行版时可以直接保留不动,是这套方案最大的价值。
手动分区时有个细节容易忽略:分区表的类型。安装器里新建分区表的时候会让你选 GPT 还是 MBR,UEFI 引导必须选 GPT。选错了后面会报错。
4.3 引导程序装在哪里,装错会怎样
手动分区的最后一步,安装器会问"引导程序的安装位置"(Device for boot loader installation)。UEFI 模式下,这里应该选整块磁盘,而不是某个分区。比如你的盘是/dev/nvme0n1,就选这个;不要选/dev/nvme0n1p1(那是分区)也不要选/dev/nvme0n1p2。
选错会发生什么?选到某个分区上,引导文件可能被写到不该写的位置,装完之后主板找不到引导项,开机直接进固件设置或者报"no bootable device"。这种情况不是没救,用 Ubuntu 的安装 U 盘进"试用 Ubuntu"模式,然后 chroot 进硬盘上的系统重新装一次 grub 就能修,但这个过程对新手来说足够劝退。
还有个和单系统特别相关的问题:如果之前是双系统,硬盘上会残留 Windows 的 EFI 引导文件。你选了"清除整个磁盘",安装器会把所有分区删掉重建,残留的Microsoft目录自然也没了。但如果是手动分区、只格式化了部分分区,/boot/efi里可能同时存在Microsoft和ubuntu两个目录,固件启动菜单里会残留一个"Windows Boot Manager"的选项,指向一个已经不存在的引导文件。这个残留项可以在装完之后用efibootmgr命令清理:
# 查看当前所有引导项 sudo efibootmgr -v # 删除某个不需要的引导项,编号从上面输出里看 sudo efibootmgr -b 0001 -B5. 第一次开机之后的必修课
5.1 替换软件源与全量更新
装完第一次开机,第一件事是换软件源。默认的官方源在国内访问速度不理想,换成国内镜像站能快十倍以上。20.04 的源配置文件在/etc/apt/sources.list,操作流程是先备份再替换:
# 备份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 用 sed 批量替换域名,这里以清华源为例 sudo sed -i 's|http://archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list sudo sed -i 's|http://security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list # 更新索引 sudo apt update也可以直接用图形界面的"软件和更新"面板,在"下载自"下拉里选中国的镜像站,效果是一样的。换源之后跑一次全量更新:
sudo apt update && sudo apt upgrade -y这里有两个注意点。第一,20.04 的代号是 focal,你在网上抄源地址的时候,看到focal这个词才对,如果看到jammy(22.04)或者bionic(18.04),说明抄错版本了,写进去会一路报错。第二,upgrade之后如果需要重启,就重启,别拖,涉及内核和 glibc 的更新不重启会留下隐患。
5.2 显卡驱动:核显和独显的处理完全不同
Ubuntu 20.04 对 Intel 核显和 AMD 显卡是开箱即用的,内核里自带开源驱动,不用做任何事。麻烦的是 NVIDIA 独显。默认情况下系统会加载开源驱动nouveau,这个驱动能用但性能一般,跑图形界面偶尔闪烁,跑深度学习更是完全不行。
装 NVIDIA 官方驱动的推荐方式是系统自带的"附加驱动"工具:
# 打开附加驱动面板 software-properties-gtk # 切到"附加驱动"标签页,选带 (专有) 标记的那个版本或者用命令行:
# 先看有什么版本可选 ubuntu-drivers devices # 自动安装推荐版本 sudo ubuntu-drivers autoinstall装完必须重启。重启后两个东西要验证:一是nvidia-smi能不能输出显卡信息,二是glxinfo | grep OpenGL里渲染器是不是 NVIDIA。如果重启之后卡在登录界面反复跳回来(俗称循环登录),大概率是驱动和显示管理器打架,处理办法是切到 tty(Ctrl+Alt+F3),卸载驱动:
sudo apt purge '^nvidia-.*' sudo apt autoremove sudo reboot然后换一个驱动版本重试。我的经验是:能用附加驱动面板装就别手动跑 .run 文件。.run 文件装的时候会问你一堆问题(要不要禁用 nouveau、要不要装 32 位兼容库),答错一步就很难收拾,而且内核一升级驱动就失效,还得重新编译。用 apt 装的话,这些都由包管理器处理好了。
如果是 NVIDIA 显卡装完系统后连安装界面都进不去、一直黑屏,可以在 GRUB 启动项里临时加nomodeset参数进去,装完系统再装驱动。具体做法是在 GRUB 菜单上按e编辑启动项,在linux那一行末尾加一个空格再加nomodeset,然后按 F10 启动。
5.3 中文输入法与环境变量的坑
20.04 默认装的是 IBus 输入框架,中文输入法支持有限。想要搜狗拼音或者更好的体验,一般换成 fcitx。
第一步装框架:
sudo apt install fcitx fcitx-bin fcitx-table fcitx-config-gtk第二步装输入法引擎。搜狗拼音需要从官网下载 deb 包,注意选对架构(现在基本都是 amd64)。下载之后:
sudo dpkg -i sogoupinyin_版本号_amd64.deb # 如果报依赖错误,补一下 sudo apt install -f第三步是把系统输入法框架切到 fcitx。最稳妥的方式是用im-config命令,选 fcitx,然后注销重新登录(不是重启,注销就够)。
真正的坑在环境变量。fcitx 需要几个环境变量才能在各种程序里生效,正确的位置是/etc/environment或者~/.pam_environment:
GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx这里有个特别容易犯的错误:不要把这些写进~/.bashrc。.bashrc只对终端里启动的程序生效,你在文件管理器里启动的图形程序根本读不到。而且/etc/environment里不能写export关键字和 shell 变量引用,它只是一个简单的 KEY=VALUE 文件,写成export GTK_IM_MODULE=fcitx会导致整个登录会话出问题,严重的话进不去桌面,只能切 tty 去救。这一点我吃过亏,当时是在虚拟机里试的,进不去桌面之后靠Ctrl+Alt+F3进 tty 用 vi 改回来的。
6. 把网络、远程和开发环境补齐
6.1 netplan 配置网络与常见写错的地方
20.04 用 netplan 管理网络,配置文件在/etc/netplan/下面,一般是01-network-manager-all.yaml或者50-cloud-init.yaml。桌面版默认交给 NetworkManager 管,通过图形界面点一点就能连 WiFi,一般不用动 netplan。但如果你要配静态 IP,就得写配置文件。
一个有线静态 IP 的例子:
network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no addresses: - 192.168.1.100/24 gateway4: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 8.8.8.8几个会让人抓狂的点。缩进必须用空格,不能用 Tab,YAML 对缩进极其敏感,多一个空格少一个空格都会解析失败。网卡名字要通过ip a命令确认,现在的机器网卡名可能是enp3s0、eno1、ens33,凭猜写上去肯定不对。文件权限建议设成 600,因为里面可能有 WiFi 密码:
sudo chmod 600 /etc/netplan/*.yaml sudo netplan applynetplan apply执行后没输出是正常的,有输出说明有问题。如果配错了导致网络完全断掉、SSH 也连不上,别慌,在物理机上可以接显示器,用sudo netplan try这个命令,它会在 120 秒内自动回滚,给你改回来的机会。远程操作的时候一定要用try而不是apply。
6.2 SSH 连不上时的排查顺序
桌面版 20.04 默认没装 SSH 服务端,要自己装:
sudo apt install openssh-server sudo systemctl status ssh装完从别的机器连,连不上的话按这个顺序查。
先看服务在不在跑:systemctl status ssh显示 active 才对。然后看端口在不在监听:sudo ss -tlnp | grep 22。接着查防火墙:如果开了 ufw,必须放行,sudo ufw allow ssh或者sudo ufw allow 22/tcp。再往后查配置文件:/etc/ssh/sshd_config里的PermitRootLogin默认是prohibit-password,也就是禁止 root 用密码登录;PasswordAuthentication有些配置会设成no,只能密钥登录。改完配置要sudo systemctl restart ssh。
还有一类问题不在服务端,在客户端。如果你之前连过同一 IP 的机器,换系统之后服务器的密钥变了,客户端会报"REMOTE HOST IDENTIFICATION HAS CHANGED"并拒绝连接。这时候删掉本地记录就行:
ssh-keygen -R 192.168.1.100这里提醒一句:生产环境或者在公司网络里,不要为了图省事把 SSH 密码设得太简单,也不要把 root 登录随便放开。用密钥登录加authorized_keys是更稳妥的做法,生成密钥用ssh-keygen -t ed25519,然后把公钥追加到服务器的~/.ssh/authorized_keys里。
6.3 Docker、Git 与常用开发工具落地
Docker 的安装建议走官方仓库,比apt install docker.io装到的版本新。流程是加 GPG 密钥、加软件源、装docker-ce,这三步官方文档写得很清楚,照着敲就行。装完之后有两件事要做:把当前用户加进 docker 组,免得每次都要 sudo:
sudo usermod -aG docker $USER # 注销重登生效另一件是配镜像加速地址,写进/etc/docker/daemon.json:
{ "registry-mirrors": ["https://你的加速地址"] }改完sudo systemctl restart docker生效。注意daemon.json是严格的 JSON 格式,最后一项后面不能有多余的逗号,这个错误会导致 Docker 起不来,而且报错信息不太直观。
Git 的配置就两行:
git config --global user.name "你的名字" git config --global user.email "你的邮箱"然后是 SSH 密钥生成、把公钥贴到代码托管平台上。如果你从旧系统备份了~/.ssh目录,直接拷回来就能用,权限记得改回 600。
剩下的常用工具一次性装齐:
sudo apt install -y build-essential curl wget vim tmux htop \ python3-pip python3-venv openjdk-11-jdk mavenJava 项目里如果遇到"version not under control"这类报错,八成是 IDE 的版本控制配置或者 JDK 版本和项目不匹配,检查一下JAVA_HOME指向和 IDE 里的 SDK 设置,跟系统重装本身没关系。
7. 出问题怎么办:几条真实遇到过的故障链路
7.1 卡在 GRUB 提示符或者直接黑屏
装完重启之后,如果看到的不是登录界面而是一个grub>提示符,说明 GRUB 找到了配置文件但没能正确加载内核。排查思路是这样:
先确认是不是分区对不上。在grub>提示符下敲ls,会列出(hd0) (hd0,gpt1) (hd0,gpt2)这样的设备。逐个试:
grub> ls (hd0,gpt2)/看看哪个分区里有boot目录。找到之后手动引导:
grub> set root=(hd0,gpt2) grub> linux /boot/vmlinuz-5.4.0-xx-generic root=/dev/nvme0n1p2 grub> initrd /boot/initrd.img-5.4.0-xx-generic grub> boot能进去之后,在系统里执行sudo update-grub重建配置,再sudo grub-install /dev/nvme0n1重装引导。这套操作能解决绝大多数引导问题。
如果是彻底黑屏、连 GRUB 都看不到,那多半是显卡驱动问题(前面说的nomodeset),或者是 ESP 分区里根本没有引导文件。用安装 U 盘进试用模式,sudo fdisk -l看分区结构,sudo mount /dev/nvme0n1p1 /mnt挂上 ESP 分区看看里面有没有EFI/ubuntu/grubx64.efi。有的话说明引导文件在,问题在固件设置;没有就说明安装时引导装错了位置,需要 chroot 进去重修。
7.2 驱动装完循环登录
前面提过这个现象,这里把完整的处理链路写一下。循环登录的根本原因是显示管理器加载时驱动模块初始化失败,X 或者 Wayland 起不来,于是退回登录界面,你再登录又失败。
排查路径是:Ctrl+Alt+F3切到 tty,登录进去,然后看日志:
# 看 X 的日志,找 EE 开头的错误行 grep -i "EE" /var/log/Xorg.0.log | head -30 # 看上一次启动的日志 journalctl -b -1 -p err日志里如果出现NVIDIA: module not found或者Failed to initialize the NVIDIA kernel module,基本就是驱动版本和内核不匹配。处理方式是彻底清掉再装:
sudo apt purge '^nvidia-.*' '^libnvidia-.*' sudo apt autoremove sudo apt install nvidia-driver-470 # 换一个版本号 sudo reboot这里有个经验:装驱动之前先确认内核版本(uname -r),然后看这个驱动版本支持的 kernel 范围。20.04 用 HWE 内核(5.15)的时候,老版本的 NVIDIA 驱动可能编译不过 DKMS 模块,这时候要么换更新的驱动版本,要么退回 GA 内核(5.4)。
7.3 内核升级后进不去系统与回退
apt upgrade升了内核之后重启进不去系统,是 Linux 上最经典的问题之一。原因是新内核缺少某个必要的驱动模块(常见的是存储控制器驱动或者显卡驱动),导致根文件系统挂不上或者显示起不来。
好消息是 GRUB 菜单里会保留旧内核的入口。开机时按住 Shift 键(UEFI 机器上可能是反复按 Esc)调出 GRUB 菜单,选"Advanced options for Ubuntu",然后选上一个内核版本进去。进去之后有两条路:一是直接把有问题的内核卸载掉:
# 查已安装的内核 dpkg --list | grep linux-image # 卸载有问题的那个版本 sudo apt purge linux-image-5.15.0-xx-generic sudo update-grub二是保留它,等后续版本修复。**我的习惯是:升级内核的时候不着急重启,先看一眼 GRUB 菜单里旧内核还在不在。**位置一般是/boot/vmlinuz-*,文件在就说明可以回退。另外建议把/boot分区留够空间——如果你的 ESP 只有 100MB 又没单独分/boot,内核积累多了可能塞满,导致升级失败,这是很多人忽略的一个坑。
8. 用了几个月之后,我留下的几条习惯
8.1 系统快照与 /etc 备份
单系统最大的风险是"没有退路"。我之前用双系统的时候,Ubuntu 玩坏了还能进 Windows 查资料、下驱动,现在只有 Ubuntu,系统起不来就只能靠手机搜。所以装完之后我做的第一件事就是配一套快照机制。
Timeshift 是我用得最顺手的工具,可以装在系统盘之外的盘上,也可以放在同一块盘但要注意留空间:
sudo apt install timeshift配置上选 RSYNC 模式,排除/home目录(个人数据太大,单独用别的方案备份),每周自动跑一次,保留 5 个快照。第一次装完驱动、输入法、开发环境调好之后,手动跑一个快照,标记成"基线"。以后折腾出问题了,从 Live USB 启动也能恢复。
除了快照,我还习惯把/etc目录定期打包一份放到别的地方:
sudo tar czf /media/backup/etc-$(date +%F).tar.gz /etc配置文件的体积很小,但出问题的时候一个能用的sshd_config、netplan配置或者fstab能救命。/etc/fstab尤其重要,改错一个 UUID 就进不了系统,有备份就能从 Live 环境里拷回去。
8.2 分区与磁盘的长期维护
用久了根分区会悄悄变满,尤其在你不注意的时候。几个常见的空间黑洞:Docker 的镜像和容器(docker system prune -a能清掉不用的)、apt 的缓存(sudo apt clean)、旧内核(sudo apt autoremove --purge)、日志文件(journalctl --vacuum-size=500M)。我一般每个月看一眼df -h和du -sh /var/* | sort -h,心里有数。
固态硬盘的 TRIM 也要确认开着,否则长期使用之后写入性能会下降:
sudo systemctl status fstrim.timer如果是 active 状态说明每周自动跑一次,没问题。没有的话sudo systemctl enable --now fstrim.timer打开。
还有一件事:机械硬盘和固态硬盘别混着用 fstab 里同一个挂载参数。机械盘做数据盘的话,加上noatime能减少无谓的写入;固态盘不用特殊参数,只要 TRIM 正常就行。
8.3 什么情况下我会重新装一遍
最后说个实在话:把 Windows 换成 Ubuntu 单系统之后,我遇到过一次真的想重装的情况——从 20.04 直接跨版本升到 22.04,中间依赖冲突太多,包管理器修了两个小时还是报错,最后选择重新装。所以我的判断标准是:如果是单个软件的问题,修;如果是包管理器的依赖树整体乱了,重装更快。判断的依据是sudo apt -f install和sudo dpkg --configure -a跑完还有一堆报错,那基本就是烂到根了。
重装的时候最省事的做法就是沿用之前的/home独立分区方案——安装时只格式化/和/boot/efi,/home保持不动,装完之后用户数据、项目代码、大部分软件配置都还在,只需要重装系统级的软件包。这也是我一开始坚持把/home单独分出来的全部理由:它把"重装系统"这件事从半天的活变成了四十分钟的活,而且心理负担小得多,敢折腾了。
不过要提醒一句,/home保留的时候,用户目录下的隐藏配置文件(.config、.local这些)也会跟着保留,偶尔会有旧配置和新系统不兼容的情况,表现是某个程序启动就崩。这时候把对应的配置目录删掉让它重新生成就行,不用整个重装。