在懒猫上实现应用持久化:Nix 安装与配置完全指南

隔壁老王

发布于262天前
还没想好签名

一、 前言:我们要做什么,以及为什么这么做?

欢迎来到本篇教程。如果您已经通过 SSH 登录到系统,可能会发现一个特殊的设计:通过 apt 等传统方式安装的软件,在系统重启后会消失。

根据官方说明,这是产品“岩层”架构的一部分,旨在通过保持核心系统(地核层、地幔层)的纯净与不变,来确保长期的、绝对的运行稳定性。这是一个为保障核心业务而做出的严谨设计。不过还是给种子用户开了个口子,lzcos v1.3.2+版本后,root用户的家目录会调整为永久存储,即/root目录得以保留。

虽然还有虚拟机、 playground-docker这两个给用户一定自由度的方案,但是我是用户,我就想折腾底层,不想接受一点的性能损耗。另外我的需求也不多,方便的装一些二进制软件。

本教程的目的,是在完全尊重并兼容这一设计的前提下,利用强大的 Nix 包管理器,为我们自己开辟一个可持久化的应用空间。所有操作都将在系统允许的、可持久化的 /root 目录中进行,我们不会对核心系统进行任何修改。

理论上是没有任何问题的,如果误操作导致系统异常。重启应该会自动恢复的。另外要相信老王的服务,就算坏了也有专业售后兜底。:)

最终目标:实现一个重启后依然存在的、独立的软件环境,让我们可以自由、安全地安装和管理所需的命令行工具。

screenshot_20251029_171142.png

二、 准备工作

在开始之前,请确保您已具备:
1.系统的 SSH root 权限。

2.从https://releases.nixos.org/nix/nix-2.32.2/nix-2.32.2-x86_64-linux.tar.xz (地址以当前2025-10-29最新版,2.32 为例)下载 Nix 的官方安装包。

3.解压至 ~/onix-unpack 目录。任意目录都可以,我的操作是这样的。当然需要先 apt update,然后 apt install xz
运行 tar -xJf data.tar.xz -C ~/onix-unpack


三、 详细安装步骤

请严格按照以下步骤操作,以确保安装过程顺利。

第一步:创建并配置持久化环境

这是整个方案的基石。我们将创建真实的数据存储目录,并使用 bind mount 技术将其映射到 Nix 所需的 /nix 路径。同时,预先设置一个关键配置以确保安装过程顺利。

  1. 创建持久化目录与挂载点
    在终端中执行以下命令:

    # 在可持久化的 /root 目录下,创建用于实际存放 Nix 数据的主目录
    mkdir -p /root/nix_persistent
    
    # 创建 Nix 期望的 /nix 目录,它将作为我们映射的“入口”
    mkdir -p /nix
    
  2. 执行 Bind Mount 路径映射
    这一步将把我们的持久化目录链接到 /nix

    # 将 /root/nix_persistent 目录挂载到 /nix
    # 此后,所有对 /nix 目录的读写操作,都会被系统透明地重定向到 /root/nix_persistent
    mount --bind /root/nix_persistent /nix
    
  3. 预设 Nix 配置
    为了避免在 root 用户下安装时因默认的安全检查而中断,我们预先创建一个配置文件:

    # 创建用户配置目录
    mkdir -p /root/.config/nix
    
    # 写入配置,将 build-users-group 选项设置为空
    # 这将告知 Nix 在我们的单用户环境下,无需进行构建组的相关检查
    echo "build-users-group =" > /root/.config/nix/nix.conf
    

第二步:运行 Nix 官方安装脚本

在准备工作完成后,我们可以开始正式安装。

# 进入存放安装脚本的目录
cd ~/onix-unpack

# 运行单用户模式的安装命令
sh ./install --no-daemon

安装脚本会识别到我们预设的环境与配置,并顺利完成。安装结束后,您会看到提示信息,告知需要重新登录或加载配置文件。

第三步:配置环境自动恢复

为了让我们的 bind mount 映射在系统重启后依然生效,需要将其加入到 Shell 的启动流程中。

我们将使用 sed 命令,安全地将一段自动挂载脚本插入到 /root/.profile 文件的顶部。

# 这行命令会将一段脚本插入到 /root/.profile 文件的第一行
# 该脚本会在每次登录时检查 /nix 是否已挂载,如果未挂载,则自动重新执行挂载操作
sed -i '1i # --- [Auto-Mount Nix Persistence Layer] ---\nif ! mountpoint -q /nix; then\n  mkdir -p /nix && mount --bind /root/nix_persistent /nix\nfi\n# -------------------------------------\n' /root/.profile

图片内容稍有一点出入,本质就是自动绑定挂载 root/nix_persistent 到 /nix

screenshot_20251029_173735.png

其实这一步骤应该也可以使用 systemd --user 免登录运行。不过在目前场景下,终端二进制文件反正也是登录进来使用的,简单就用了 .profile。


四、 验证与使用

至此,全部安装与配置工作已完成。让我们来验证一下成果。

  1. 加载新环境并启用 Flakes
    Flakes 是 Nix 推荐的现代化工作流,提供了更佳的可复现性。

    # 重新加载 Shell 配置,使所有改动立即生效
    source /root/.profile
    
    # 启用 Flakes 实验性功能(可选,但强烈推荐)
    # 我们使用 `>>` 追加到现有配置文件中
    echo "experimental-features = nix-command flakes" >> /root/.config/nix/nix.conf
    
  2. 安装第一个持久化应用
    我们以安装 git 为例:

    # 使用 nix profile 命令将 git 安装到我们的用户环境中
    nix profile install nixpkgs#git
    
  3. 最终验证
    检查 git 是否已成功安装:

    git --version
    

    如果您能看到 git 的版本号输出,那么恭喜您,安装已完美成功!现在,您可以尝试重启系统,再次登录后,git --version 命令依然可用。

screenshot_20251029_174016.png


五、 总结

通过本教程,我们在完全遵循系统设计的前提下,成功地为自己构建了一个独立、安全且可持久化的应用环境。现在,您可以自由探索庞大的 Nix 软件生态,为您的工作流增添更多强大的工具。

评论

1
Alex Liu258天前

反馈2点: 1.xz的安装命令用这个apt install -y xz-utils 2.后续安装git需要把魔法开开,不然装不上 感谢作者的贡献

说点什么呢~
收藏
5
1
0