欢迎光临
我们一直在努力

在 NixOS 中如何优雅且“确定”地安装与更新软件

告别 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 # <— 在这里添加你需要安装的新软件
googlechrome
vscode
git
];

# … 其他配置 …
}

这一步的核心思想是: 配置文件就是你系统的“架构蓝图”。只要蓝图里有,系统里就必须有。

3. 见证奇迹:执行构建与切换

蓝图修改好后,我们需要让 NixOS 核心引擎去读取它并“落实”这个状态。 在终端中进入你的配置根目录(例如 /etc/nixos),然后执行这句核心魔法命令:

cd /etc/nixos
sudo nixos-rebuild switch –flake .

这句命令在后台到底做了什么?

当你按下回车,NixOS 绝对不会简单地把文件解压到 /usr/bin 下。它执行了一个严谨的工程学过程:

  • 读取 Flake 图谱:系统读取当前目录下的 flake.nix,解析出所有的依赖关系。
  • 构建与下载:Nix 检查发现配置里多出了 foliate。它会去远程缓存服务器(Cache)下载对应的预编译二进制包。
  • 存入 Nix Store:所有下载的文件都会被放入一个只读的独特目录中,比如 /nix/store/xxxxxx-foliate-2.0.0/。每一个包都有一个根据自身及其依赖计算出的 Hash 目录名,绝对不会与其他软件产生依赖冲突。
  • 生成新的一代(Generation):系统把所有你需要的软件,用符号链接(Symlink)的方式,统一串联成一个新的“系统快照”。
  • 切换(Switch):最后一步,系统将你当前的环境变量(比如 $PATH)指向这个全新的快照。
  • 整个过程不需要重启系统。执行完毕后,你在启动器里就能立刻看到 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 中,你只需要:

  • 如果是安装软件导致的:把配置文件里的软件名删掉,再次运行 sudo nixos-rebuild switch –flake .。它就会从你当前的系统快照中消失。
  • 如果是更新导致的:把 flake.lock 回退到上一个版本(比如用 git revert 或 git checkout),然后重新构建即可。
  • 更极端的救援(无需进系统):如果你在开机时按住方向键,你会发现 Bootloader(如 GRUB或 systemd-boot)菜单里列出了系统历史上的每一次构建(Generations)。选择上一个时间点的记录回车启动,你的系统就会 100% 恢复到安装/更新软件之前的状态。
  • 总结

    在 NixOS 中安装与更新软件:

    • 不使用 命令行的临时动词(如 install, upgrade)。
    • 而是使用 配置文件中的名词(声明包名)+ 锁定文件(flake.lock)+ nixos-rebuild switch(落实状态)。

    这种高度确定的、基于代码配置(Infrastructure as Code)的系统管理模式,一旦习惯,就再也回不去传统 Linux 那些充满不确定性的依赖地狱了。

    赞(0)
    未经允许不得转载:171主机测评 » 在 NixOS 中如何优雅且“确定”地安装与更新软件
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址