去年秋天帮一个刚转行的朋友在他的旧笔记本上装 Ubuntu。下载镜像、写 U 盘、点下一步,前后不到二十分钟,顺利得有点出乎意料。三天后再聊,他的反馈完全变了味:系统能开机,浏览器能开,终端能开,但项目跑不起来,中文输入法打不出字,无线网卡时好时坏,重启一次环境就得重新配一遍。他说了一句挺典型的话——“装的时候什么都很顺,装完就不知道该干什么了”。
这个反差恰好点出了问题的位置。Ubuntu 的安装向导已经简化到几乎不需要教程,但把它变成一个能长期稳定干活的工作环境,仍然是另一回事。前者考验的是你能不能看懂几个选项,后者考验的是你对系统结构、包管理、驱动、权限、日志这些东西有没有基本认识。真正把人拉开差距的,从来不是装系统那二十分钟,而是装完之后的头三天你做了什么、怎么想。
所以这篇内容的主判断很明确:Ubuntu 的门槛不在安装,而在于你有没有把它当成一套需要规划的工作环境来对待。下面按“装之前想清楚什么—装的时候做哪些判断—装完怎么打底座—怎么变成能干活的环境—出了问题按什么顺序查—什么时候不该选它”这条线展开,尽量写成可以照着做的样子。
1. 装系统只是入场券,真正的分水岭在装完之后
1.1 为什么“装完就不知道干什么”这么普遍
很多人对 Linux 的第一印象来自教程视频:插上 U 盘、选择语言、点“安装”、分区、设置用户名密码、等待进度条走完、重启、看到桌面。这一整套流程确实简单,简单到让人产生一种错觉,以为门槛已经过去了。
但安装向导只负责一件事:把一堆文件铺到磁盘上,配好引导,建好第一个用户。它不负责告诉你软件从哪来、版本怎么管、服务怎么开机自启、日志去哪看、驱动缺了怎么办。这些东西在 Windows 上有大量“装个驱动精灵就行”的现成答案,在 Ubuntu 上则需要你自己形成一套习惯。
更具体一点,新手最容易在下面几个地方停滞:
- 打开终端看到
$提示符,不知道该敲什么,也看不懂报错。 - 用
apt install装了个东西,发现版本比预期老很多。 - 想装最新版 Node 或 Python,跟着网上教程一路复制粘贴,最后把系统自带的解释器搞坏了。
- 中文显示成方块,或者拼音输入法装了但切不出来。
- 关机再开机,某个手动启动的服务没了。
这些都不是“Ubuntu 不好用”,而是“没有做装完之后的规划”。把它们当成安装的一部分提前想到,后面会省掉大量时间。
1.2 我建议一开始就按“能用三个月”的标准来配
有个很实用的判断标准:假设三个月后你要在这台机器上交付一个项目,现在的配置能不能撑住。用这个标准去看,很多事情的性质就变了。
比如分区。如果只是“装上看看”,给根目录 30G 也够;但如果三个月后你要装一堆 SDK、容器镜像、数据集,30G 会在一两个月内被填满,然后就是一场手忙脚乱的数据迁移。再比如用户权限。装的时候随手用了 root 或者给普通用户配了免密 sudo,当时觉得省事,三个月后你会在某个脚本把系统目录写坏的时候后悔。
我一般会建议按这个顺序规划:
- 先明确用途:本地开发机、跑服务的机器、学习实验环境,这三者的配置重点完全不同。
- 再定磁盘方案:根目录、家目录、交换区怎么分,要不要双系统。
- 然后定软件来源:哪些用系统包管理器,哪些用官方仓库,哪些用容器隔离。
- 最后才是装软件:按需装,别一上来铺一屏。
这个顺序的价值在于,它把“装系统”从一次性的操作变成了一个有前后依赖的工程动作。你会发现后面很多坑,其实在这一步就能规避掉。
一个经验:如果你打算长期用这台机器,装完系统后立刻做一次完整的系统更新,再打一个快照或备份。这是成本最低的一次“后悔药”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手之前,先把硬件、磁盘和用途这三件事定下来
2.1 版本选择:LTS 和普通版的差别不在新旧
Ubuntu 的版本分两类:LTS(长期支持)和普通版本。LTS 每两年发布一次,桌面版通常提供五年支持,服务器版的支持周期更长;普通版本每六个月一个,支持期短得多。
新手常常误以为普通版本“更新更好”,实际恰恰相反。普通版本更像是给开发者和测试者用的试验田,新特性先上,稳定性靠后续修补。LTS 则是把已经验证过的东西打包成一个可以放心用几年的基线。
| 维度 | LTS 版本 | 普通版本 |
|---|---|---|
| 发布节奏 | 每两年一次 | 每六个月一次 |
| 支持周期 | 桌面约五年,服务器更长 | 通常九个月左右 |
| 软件版本 | 偏保守,经过验证 | 偏新,尝鲜为主 |
| 适合人群 | 绝大多数个人和团队 | 想跟进新特性的开发者 |
| 升级频率 | 低,可长期不动 | 高,需要频繁升级 |
对绝大多数人来说,选当前的 LTS 版本就够了。它的软件版本可能不是最新的,但胜在稳定、资料多、遇到问题容易搜到答案。这一点在实际使用中的权重,远比“能不能第一时间用上新特性”高。
如果原始材料里没有明确你该用哪个版本,落地前先去官网确认当前 LTS 的版本号和硬件要求,不要照着几年前的教程抄。教程里的版本号过期是常态,而安装介质和源地址是强绑定的。
2.2 分区:双系统和全盘安装的取舍
分区是安装过程里唯一一个“做错了要重来”的环节,值得单独说。
先看三种常见方案:
- 全盘安装:整个硬盘都给 Ubuntu,最简单,性能最好,缺点是原来的系统没了。
- 双系统:留一部分空间给 Ubuntu,开机时选择进哪个系统。适合还要用 Windows 跑特定软件的人。
- 虚拟机:Ubuntu 跑在虚拟机里,随用随开,性能有损耗,但完全不影响宿主机。
我一般会这样推荐:如果是新买的机器或者准备专职做开发,全盘装;如果机器上还有离不开的 Windows 软件,先虚拟机跑两周,确认自己真的能适应,再考虑双系统。双系统看着美好,实际用起来最麻烦的是磁盘空间规划——很多人给 Ubuntu 只留了 50G,结果半年后开始删文件。
具体到分区结构,一个比较稳妥的划分是这样:
| 挂载点 | 建议大小 | 说明 |
|---|---|---|
/ |
40G 到 80G | 系统和软件,装多了会紧张 |
/home |
剩余空间的大部分 | 个人数据和配置,重装时可保留 |
swap |
内存大小或按需 | 休眠和内存不足时用,现在也可以改用 swap 文件 |
/boot/efi |
512M 左右 | UEFI 引导必需,双系统时和 Windows 共用 |
把 /home 单独分出来的好处很直接:以后想换版本重装系统,个人文件、项目代码、配置文件都还在,只需要重新装软件。这个习惯一旦养成,重装的成本会从“一整天”降到“一小时”。
2.3 安装介质的制作和校验
这一步很多人会跳过校验,其实值得花两分钟。
镜像下载完之后,先算一次校验值:
bash复制sha256sum ubuntu-xx.xx.x-desktop-amd64.iso
把输出和官网公布的校验值对一下。不一致就重新下载,不要抱着“应该没事”的心态继续。镜像损坏导致的安装失败最难排查,因为现象往往是随机黑屏、卡进度条、解压报错,看起来像硬件问题。
写 U 盘的工具,Linux 和 macOS 下可以直接用 dd:
bash复制# 先确认目标设备,千万别写错盘
lsblk
# 写入镜像,of= 后面换成你的 U 盘设备
sudo dd if=ubuntu-xx.xx.x-desktop-amd64.iso of=/dev/sdX bs=4M status=progress oflag=sync
lsblk 这一步不能省。dd 不认人,写错设备就是直接把那块盘覆盖掉,包括你的移动硬盘和系统盘。写入完成后用 sync 确保缓存落盘,再拔 U 盘。
Windows 下用 Rufus 或 balenaEtcher 都可以,注意分区类型选 GPT、目标系统选 UEFI,和后面主板的引导模式对应上。
3. 安装过程中真正需要你做判断的几个点
3.1 UEFI、Secure Boot 与启动项
现在的机器基本都是 UEFI 引导,这块主要看两个开关。
Secure Boot(安全启动):这个功能会校验引导程序的签名。Ubuntu 官方镜像是有签名的,正常情况下开着也能装。但如果后面你要装第三方驱动(尤其是显卡驱动和某些无线网卡驱动),可能会被拦下来,表现为模块加载失败或者直接黑屏。遇到这种情况,进 BIOS 关掉 Secure Boot 是最快的验证手段。
启动顺序:插上 U 盘后进 BIOS 或按快捷键(常见的是 F2、F12、Esc,各家不同)选择从 U 盘启动。有些机器需要先把 UEFI 模式打开,不然只认 Legacy 引导的 U 盘。
这里有个容易误判的地方:安装完成后如果直接进了原来的系统,而不是新装的 Ubuntu,通常是引导顺序没调整,或者双系统下 GRUB 没装上。先别急着重装,进 BIOS 看启动项里有没有 ubuntu,没有的话再用 Live 环境里的 efibootmgr 检查。
3.2 分区方案和用户设置
安装类型那一步,如果选“清除整个磁盘并安装”,向导会自动分区,适合新手。选“其他选项”则进入手动分区,前面规划好的方案在这里落地。
手动分区时注意几点:
- EFI 分区只挂载,不要格式化(双系统时尤其重要,格式化会把 Windows 的引导干掉)。
- 根分区文件系统用 ext4 最稳妥,资料多、工具链成熟。
- 用户名建议全小写,不要带空格和特殊字符。这个看起来是小细节,实际上很多脚本和路径处理会因此出问题。
- 密码不要设得太简单,因为后面
sudo会频繁用到它。
还有一个选项是“安装时下载更新”和“安装第三方软件”。前者建议勾上,能省掉装完之后的一大轮更新;后者包含显卡驱动、无线网卡固件、媒体解码器,如果你用的是 NVIDIA 显卡或者某些需要闭源固件的网卡,勾上会省事很多。但如果你的网络环境不稳定,勾了反而会拖慢安装进度,可以装完再单独处理。
3.3 第一次开机后的十分钟体检
系统装完第一次进桌面,先别急着装软件,花十分钟做一轮体检,把问题在最早的时候暴露出来。
按这个清单走一遍:
bash复制# 1. 确认系统版本和内核
lsb_release -a
uname -r
# 2. 确认磁盘挂载是否符合预期
df -h
lsblk
# 3. 确认网络
ip addr
ping -c 3 archive.ubuntu.com
# 4. 确认显卡和驱动状态
lspci | grep -i vga
ubuntu-drivers devices
# 5. 确认引导模式
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy"
这几条命令的输出基本能覆盖后面 80% 的问题来源。比如 df -h 发现根分区只有 20G,那就要提前考虑清理策略;ubuntu-drivers devices 显示有推荐驱动但没装,那就要处理显卡问题;使用 ping 不通外网,那先解决网络再谈别的。
4. 装完先别急着装软件,把系统底座配稳
4.1 软件源、更新与内核的关系
Ubuntu 装完之后第一件该做的事是换软件源并更新。默认源在国外,国内访问速度不稳定,换成本地镜像能显著缩短下载时间。
在较新的版本里,软件源配置文件的组织方式有过调整,传统上是 /etc/apt/sources.list,新版本逐步转向 /etc/apt/sources.list.d/ 下的结构化配置。落地前先看一眼你系统上是哪种:
bash复制ls /etc/apt/sources.list.d/
cat /etc/apt/sources.list 2>/dev/null | head
确认之后再做替换,不要照着老教程直接覆盖文件,容易把格式写错导致 apt update 全量报错。
更新分两步,含义不一样:
bash复制# 更新软件包索引
sudo apt update
# 升级已安装的软件包
sudo apt upgrade
update 只是刷新“有哪些包、什么版本”的清单,不改变系统;upgrade 才真正下载安装。这两个命令经常被混用,导致有人以为更新了其实什么都没动。
还有一个命令是 sudo apt full-upgrade,它允许在必要时安装或删除包来解决依赖冲突,一般在内核升级或者大版本切换时用。日常更新用 upgrade 就够,full-upgrade 留到明确需要的时候。
内核方面,Ubuntu 会保留几个旧版本,防止新内核起不来时无法回退。查看当前内核和已安装内核:
bash复制uname -r
dpkg --list | grep linux-image
如果某次更新后出现启动异常,在 GRUB 菜单里选“高级选项”可以进旧内核。这是很实用的一条退路,值得提前知道。
4.2 驱动、输入法和字体这三件“小事”
这三件事单独看都不难,但没配好会持续影响使用体验,属于典型的“小事拖成大麻烦”。
驱动。NVIDIA 显卡是最常见的问题源。Ubuntu 提供了 ubuntu-drivers 工具来管理:
bash复制# 查看可用的驱动
ubuntu-drivers devices
# 自动安装推荐驱动
sudo ubuntu-drivers autoinstall
装完重启生效。如果装完进不了图形界面,可以在 GRUB 里进恢复模式,用 apt purge 卸掉驱动回到开源驱动。这个回退路径要提前记住,因为出问题时你很可能已经进不了桌面。
输入法。中文环境需要拼音输入法。常见组合是 fcitx5 加中文引擎,装完之后还要在系统设置里配置输入法框架和切换快捷键,光装包是不够的:
bash复制sudo apt install fcitx5 fcitx5-chinese-addons
装完后在“区域与语言”里把输入法系统设为 fcitx5,再在 fcitx5 配置里添加拼音。很多人卡在“装了但打不出中文”,原因基本都是框架没切过去,或者环境变量没生效,需要重新登录一次。
字体。中文显示成方块是因为缺中文字体。装一套完整的:
bash复制sudo apt install fonts-noto-cjk fonts-noto-cjk-extra
装完刷新字体缓存:
bash复制fc-cache -fv
如果是终端里中文显示宽度不对,那通常是等宽字体的问题,需要在终端设置里指定一个支持中文的等宽字体,或者接受它的显示效果。
4.3 权限、sudo 和目录约定
Linux 的权限模型是很多人第一道真正的坎。这里只说几条最实用的。
普通用户通过 sudo 临时获得管理员权限。sudo 组里的用户可以使用它:
bash复制# 确认当前用户是否在 sudo 组
groups
# 用 root 身份执行单条命令
sudo some-command
有几个习惯值得从第一天就建立:
- 不要用 root 登录日常使用,也不要把普通用户配成免密 sudo。
- 不要把项目文件放在
/或者/usr下面,那是系统目录。 - 个人文件放
~下,系统级配置放/etc,自己编译的软件放/usr/local或~/.local。 - 用
chmod改权限前先想清楚,chmod -R 777不是万能解,它只是把问题藏起来。
目录约定看起来是小事,但它决定了你以后能不能顺利备份、迁移和排查问题。一个把代码、数据、日志全都堆在家目录根下的机器,半年后基本没法整理。
提醒:任何时候看到教程让你
sudo rm -rf或者chmod -R 777,先停下来搞清楚它在做什么,再决定要不要执行。
5. 从“能开机”到“能干活”:开发环境的最小闭环
5.1 包管理器不止一个,要分清它们各自的边界
Ubuntu 上同时存在好几套软件分发机制,混着用是很多环境问题的根源。
| 工具 | 典型用途 | 特点 |
|---|---|---|
apt |
系统软件、库、命令行工具 | 与系统集成度高,版本偏保守 |
snap |
桌面应用、部分服务端软件 | 自带依赖,隔离性好,启动稍慢 |
| 源码编译 | 需要特定版本或定制编译选项 | 灵活但维护成本高 |
| 语言级包管理 | Python 的 pip、Node 的 npm | 只管语言生态,不碰系统 |
| 容器 | 需要完全隔离的运行环境 | 依赖少,但需要额外的运行时 |
关键原则是:系统级的东西交给 apt,语言级的东西交给语言自己的包管理器,不要交叉污染。
举个最常见的反面例子。系统自带的 Python 是很多系统工具的依赖,如果用 pip install 直接往系统环境里装包,或者用 sudo pip 装,很容易把系统 Python 搞坏,最后连 apt 都跑不起来。正确做法是用虚拟环境:
bash复制sudo apt install python3-venv
python3 -m venv ~/venvs/myproject
source ~/venvs/myproject/bin/activate
pip install -r requirements.txt
Node 类似,用版本管理工具隔离不同项目需要的版本,而不是全局装一个然后反复卸载重装。
5.2 远程登录与文件传输
只要你的 Ubuntu 不只是自己用,SSH 就是必备能力。装服务端:
bash复制sudo apt install openssh-server
sudo systemctl enable --now ssh
sudo systemctl status ssh
enable --now 是 systemctl enable 加 start 的组合,一条命令完成开机自启和立即启动。这个写法值得记住,后面配置任何常驻服务都用得上。
安全上有几条基本要求:
- 改掉默认的 22 端口能减少扫描噪音,但不是安全措施本身。
- 优先用密钥登录,关闭密码登录。密钥对用
ssh-keygen生成,公钥放到服务器的~/.ssh/authorized_keys。 - 改完 sshd 配置后先别断开当前连接,用另一个终端测试新连接能进,再关旧的。这是避免把自己锁在门外的标准动作。
文件传输用 scp 或 rsync:
bash复制# 传单个文件
scp ./local-file user@host:/remote/path/
# 同步目录,带进度和压缩
rsync -avz --progress ./local-dir/ user@host:/remote/path/
rsync 的优势是增量传输,第二次同步只传变化的部分,日常备份比 scp 更合适。
5.3 用 systemd 把常驻任务管起来
如果你在机器上跑一个长期运行的程序,不建议用 nohup ... & 这种方式。它的问题是:机器重启后不会自动起来,出错了没人管,日志散落各处。
systemd 是 Ubuntu 默认的服务管理器,写一个单元文件就能把一个程序变成受管服务。示例结构:
ini复制# /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/home/myuser/myapp
ExecStart=/home/myuser/venvs/myproject/bin/python main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
写好之后:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp
# 看日志
journalctl -u myapp -f
这几个命令覆盖了日常运维的大部分需求。Restart=on-failure 让进程崩溃后自动拉起,journalctl -u 把日志统一收进系统日志,比自己在文件里翻要方便得多。
一个容易忽略的点:ExecStart 里如果用到虚拟环境,要写虚拟环境里解释器的绝对路径,不要指望 systemd 会继承你 shell 里的 PATH。这是新手配服务时最常见的失败原因之一。
6. 三个真实使用场景,配不同的配置思路
6.1 本地开发机
这是最常见的场景。配置重点在易用性和工具链完整度上。
建议做法:
- 桌面环境选默认的 GNOME 就够,不要一开始就折腾窗口管理器。
- 装好输入法、字体、浏览器、编辑器,保证基本使用顺畅。
- 开发工具按项目装,用版本管理工具隔离语言运行时。
- 装一个终端复用工具(如 tmux),长时间跑命令时很有用。
- 配置好 Git 的用户名和邮箱,避免提交记录混乱。
这类机器不需要过度优化,反而要避免“为了整洁把系统改得面目全非”。一个能稳定用两年的开发机,通常不是配置最花哨的那台。
6.2 家里的小型服务器
如果拿一台旧机器或者小型主机跑常驻服务,配置思路就完全变了。
重点变成:稳定性、可远程管理、可恢复。
- 装服务器版,不装桌面环境,省资源也少攻击面。
- 配好 SSH 密钥登录,关掉密码登录。
- 开启防火墙,只放行必要端口:
bash复制sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status
- 所有常驻程序都用 systemd 管理,不用
nohup。 - 定期更新,但不要自动重启关键服务,避免半夜服务中断。
- 做好备份,尤其是配置文件和数据库。
这类机器最怕的是“当初随手配的,出问题时没人记得怎么配的”。所以配置文件要么纳入版本管理,要么至少写一份简单的部署笔记。
6.3 容器和隔离环境
当你需要在一台机器上跑多个互不干扰的环境时,容器是最省事的方案。
bash复制sudo apt install docker.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
最后一条把当前用户加入 docker 组,之后不用每条命令都加 sudo。注意这个操作需要重新登录才生效,而且加入 docker 组在权限上接近 root,只在个人开发机上这么做,多人共用的服务器要谨慎。
容器的价值在于:它把“环境配置”这件事从“改机器”变成了“写文件”。一个 Dockerfile 描述清楚依赖,换台机器一条命令就能复现。这比在机器上手工装一堆东西要可靠得多。
但容器不是万能的。需要访问硬件、需要特定内核模块、需要长期保存状态的服务,直接装在宿主机上反而更简单。判断标准是:如果这个环境需要“和机器绑定”,就别硬塞进容器。
7. 出问题怎么查:一条按层排查的路径
7.1 装不进去、卡在引导或黑屏
安装阶段的问题,按这个顺序看:
- 镜像是否完整:重新校验 sha256,这是最容易被跳过也最容易出问题的一步。
- 写入是否成功:U 盘写完后能不能在别的机器上启动,或者用 Live 模式先试试。
- 引导模式是否匹配:BIOS 里是 UEFI 还是 Legacy,U 盘是按哪种方式写的,两边要一致。
- Secure Boot 是否拦截:关掉再试,尤其是装完第三方驱动之后进不了系统的情况。
- 显卡是否导致黑屏:在 GRUB 启动项里加
nomodeset参数,用基础显示模式进系统,再装驱动。
第 5 条是很实用的一招。具体做法是在 GRUB 菜单按 e 编辑启动参数,在 linux 那一行末尾加上 nomodeset,然后按 F10 启动。能进桌面就说明是显卡驱动的问题,进系统后装好驱动再恢复正常启动。
7.2 装进去了,但网络、声音、分辨率不正常
这类问题的排查逻辑是:先确认硬件被识别,再确认驱动加载,最后看配置。
| 现象 | 先查什么 | 常见原因 |
|---|---|---|
| 没有无线网络 | lspci 看网卡型号,dmesg 看固件加载 |
缺固件包,或 Secure Boot 拦截 |
| 没有声音 | aplay -l 看声卡,pavucontrol 看输出设备 |
输出设备选错,或驱动未加载 |
| 分辨率不对 | xrandr 看可用模式 |
显卡驱动未装,或模式未设置 |
| 休眠后唤不醒 | 查看内核日志 journalctl -b |
电源管理或驱动兼容问题 |
以无线网卡为例,最常见的失败原因是缺固件。dmesg | grep -i firmware 能看到加载失败的记录,装对应的 linux-firmware 包通常能解决。如果是有线能通、无线不通,基本可以确定问题在无线驱动这一层。
7.3 用一段时间后变慢或提示磁盘满
用久了变卡,八成和磁盘有关。先看空间:
bash复制df -h
sudo du -sh /var/* 2>/dev/null | sort -h
/var 下面几个目录最容易膨胀:/var/log(日志)、/var/cache/apt(包缓存)、/var/lib/docker(容器镜像)。
清理思路:
bash复制# 清理已下载的包缓存
sudo apt clean
# 清理不再需要的依赖
sudo apt autoremove
# 限制日志占用
sudo journalctl --vacuum-size=500M
日志和容器镜像是最常见的两个大头。journalctl --vacuum-size 能把系统日志控制在一个上限内,避免它无限增长。容器镜像则要定期清理不用的镜像和停止的容器。
如果是“没满但很卡”,那要换个方向查:用 top 或 htop 看 CPU 和内存占用,用 iostat 看磁盘 IO,用 free -h 看交换分区使用情况。内存不足时系统会频繁换页,表现出来的就是整体变慢,这时候加内存比调任何参数都有效。
排查的基本原则是分层:先确定是输入、环境、权限、资源还是配置的问题,再针对那一层动手。跳过定位直接改配置,通常只会让问题变得更难查。
8. 长期使用需要补的几块拼图,以及什么时候别选 Ubuntu
8.1 备份、快照和回滚
一套系统能不能长期用,很大程度上取决于出问题时能不能恢复。
有三个层次的做法:
- 文件级备份:把
~下重要的东西同步到外部硬盘或另一台机器,用rsync就够。 - 系统级快照:如果用 LVM 或者支持快照的文件系统,可以在做大改动前打个快照,出问题直接回滚。
- 配置版本化:把
/etc下改过的配置、部署脚本、Dockerfile 放进 Git,这是成本最低也最有效的一条。
我一般会建议至少做到第一条和第三条。文件备份解决数据丢失,配置版本化解决“半年后忘了当初怎么配的”。后者在实际工作中出现的频率更高。
8.2 哪些场景其实不适合 Ubuntu
写了这么多,反过来也要说清楚边界。
Ubuntu 不是所有场景的最优解:
- 需要特定商业软件:某些行业软件只支持 Windows 或 macOS,硬上 Linux 只会浪费时间。
- 追求绝对稳定的生产核心系统:企业环境里更常见的是 RHEL 系,支持合同和认证体系更完整。
- 完全不想碰命令行的人:Ubuntu 桌面版对普通用户友好,但一旦出问题,几乎一定需要终端。
- 硬件特别新的机器:新硬件驱动支持往往滞后,可能需要等几个内核版本才能正常使用。
- 只是想跑一个特定程序:如果目标只是运行某个应用,容器或虚拟机比装整台系统更划算。
判断标准很简单:如果你的问题本质上是“这台机器要长期承载我的工作”,Ubuntu 是合适的选择;如果只是“我需要跑一下某个东西”,先考虑更轻的方案。
最后回到开头那个朋友。他后来把环境重新整理了一遍:单独分了 /home,用虚拟环境隔离 Python,服务用 systemd 管,配置写进了一个 Markdown 文件。同样的机器,同样的系统,体验完全不一样。
差别不在装的时候点了哪个按钮,而在于装完之后有没有把它当成一套需要维护的系统来对待。这件事跟用哪个发行版关系不大,跟有没有建立起“先想清楚、再动手、留退路”的习惯关系很大。装系统那二十分钟决定的只是你能不能开机,后面那些看起来琐碎的配置和约定,才决定这台机器能不能陪你走完一个项目。
