告别 apt-get:在 NixOS 中如何优雅且“确定”地安装与更新软件
如果你刚从 Ubuntu、CentOS 或者 Arch Linux 迁移到 NixOS,你可能会下意识地在终端里敲下类似 sudo apt install foliate 的命令,然后系统会无情地报错。
在 NixOS 的世界里,没有传统的包管理器命令来随时随地“污染”你的系统状态。NixOS 采用的是**声明式(Declarative)**的配置管理。这意味着你不需要告诉系统“去执行动作”,而是要告诉系统“我期望最终的系统处于什么状态”。
今天,我们就来详细拆解一下,在现代化的 NixOS(基于 Flakes + Home Manager)中,安装和更新软件的完整生命周期。
1. 寻找你需要安装的包
在修改配置文件之前,我们需要知道目标软件在 Nixpkgs 仓库里的确切名称。 最简单的方法是访问官方的包检索网站:NixOS Packages Search
假设我们要安装一款叫 foliate 的电子书阅读器,在搜索框输入后,你会看到它的 Attribute Name 就是 foliate。
2. 声明你的期望:修改配置文件
在传统的 Linux 中,软件通常直接安装在全局(污染系统依赖)。而在 NixOS 中,我们可以非常优雅地控制软件的作用域。
通常有两种级别的安装方式:系统级(System-wide) 和 用户级(User-level, 通过 Home Manager)。对于日常使用的桌面软件(如阅读器、浏览器、音乐播放器),强烈建议安装在用户级别。
做法:编辑用户的配置文件
假设你的配置文件位于 /etc/nixos/home/gateman.nix。打开它,找到 home.packages 列表,将 foliate 添加进去:
{ config, pkgs, … }:
{
# … 其他配置 …
home.packages = with pkgs; [
# 你的日常开发和通讯工具
spotify
foliate # <— 在这里添加你需要安装的新软件
google–chrome
vscode
git
];
# … 其他配置 …
}
这一步的核心思想是: 配置文件就是你系统的“架构蓝图”。只要蓝图里有,系统里就必须有。
3. 见证奇迹:执行构建与切换
蓝图修改好后,我们需要让 NixOS 核心引擎去读取它并“落实”这个状态。 在终端中进入你的配置根目录(例如 /etc/nixos),然后执行这句核心魔法命令:
cd /etc/nixos
sudo nixos-rebuild switch –flake .
这句命令在后台到底做了什么?
当你按下回车,NixOS 绝对不会简单地把文件解压到 /usr/bin 下。它执行了一个严谨的工程学过程:
整个过程不需要重启系统。执行完毕后,你在启动器里就能立刻看到 Foliate 的图标了!
4. 如何更新系统和软件?(Flake.lock 的魔法)
在用了 Flake 的 NixOS 里,更新系统和软件的思路和传统 Linux 也不太一样。
因为使用了 Flake 管理,你系统里所有的软件版本都被死死地“锁定”在 /etc/nixos/flake.lock 这个文件里了。如果只跑 rebuild 命令,它永远只会照着旧的锁死版本装。配置文件并没有直接写“我要安装 3.1 版本的 Foliate”,而是通过 flake.lock 锁定了整个 nixpkgs (NixOS 官方软件源) 的某个确切的 Git Commit Hash。
只要有这个 flake.lock 兜底,你把这套配置拿到世界上的任何一台电脑上去 build,装出来的每一个软件连一个字节都不会差,绝对一模一样!
更新系统只需要利落的三步:
第一步:更新锁定文件 (Lock file) 让 Nix 去上游拉取最新的包版本记录:
cd /etc/nixos
sudo nix flake update
这步跑完,你的 flake.lock 文件就会被更新到最新状态。
第二步:重新构建并切换 用和装软件完全一样的命令,让新版本真正落地:
sudo nixos-rebuild switch –flake .
系统发现 lock 文件变了,就会自动去下载有更新的软件,打包成一个全新的系统快照并热切换过去。
第三步:提交更新记录 为了保证在别的机器上也能复刻这个最新状态,别忘了把更新后的 flake.lock 提交到你的 GitHub:
git add flake.lock
git commit -m "chore: update flake inputs"
git push origin main
5. 后悔药:无痛回滚(Rollback)
NixOS 为什么被称为“永远不会挂的 Linux”?
假设你刚才装的某个软件搞崩了桌面环境,或者某次更新引入了 Bug,在传统 Linux 下卸载残留可能会让人头疼。但在 NixOS 中,你只需要:
总结
在 NixOS 中安装与更新软件:
- 不使用 命令行的临时动词(如 install, upgrade)。
- 而是使用 配置文件中的名词(声明包名)+ 锁定文件(flake.lock)+ nixos-rebuild switch(落实状态)。
这种高度确定的、基于代码配置(Infrastructure as Code)的系统管理模式,一旦习惯,就再也回不去传统 Linux 那些充满不确定性的依赖地狱了。





