前言 @

作为一个arch系的长期用户,最早接触archlinux是2019年,后来觉得折腾起来有点累,然后转向了稍微省心点的Manjaro,中间也尝试过CachyOS,为什么现在想尝试nixos?

因为听说nixos可以一份配置快速复现系统,并且方便转移我的各种GUI以及软件配置、用户配置,虽然初期学习成本较高,但觉得综合对比下来,nixos依然是我现阶段的最优解。

目前的最终目标是达成类似 ryan4yin作者配置的效果

nixos

nixos简介 @

NixOS 是一个基于 Nix 包管理器的 Linux 发行版,采用声明式配置来管理整个操作系统。其核心设计理念是声明式系统配置原子化升级回滚,使得系统状态可预测、可重现、可回滚。

发展历史 @

  • 2003 年:Nix 包管理器诞生,由 Eelco Dolstra 开发
  • 2013 年:NixOS 首个稳定版本发布
  • 2016 年:NixOS 16.09 发布,成为首个官方稳定版
  • 2020 年:NixOS 20.09 发布,引入新的初始化系统
  • 2023 年:NixOS 23.11 发布,持续更新至今

优点 @

  • 声明式配置:整个系统(包括软件包、服务、用户、环境变量等)都可以通过单一的 configuration.nix 文件进行声明式管理
  • 原子升级:系统升级是原子性的,要么完全成功,要么回滚到之前状态,不会出现半升级状态
  • 可回滚性:任何配置更改都可以轻松回滚到之前的版本
  • 可重现性:只要配置相同,在任何机器上都能构建出完全相同的系统
  • 多版本并存:同一软件可以安装多个版本,用户可以自由切换
  • 隔离依赖:每个包都是独立隔离的,避免了依赖冲突
  • 强大的沙箱:构建过程在沙箱中运行,确保构建的可重现性

缺点 @

  • 学习曲线陡峭:需要学习 Nix 语言和 NixOS 的配置方式
  • 文档相对分散:官方文档较为分散,社区文档质量参差不齐
  • 启动速度较慢:由于使用 systemd-boot 和 Nix 的延迟加载,首次启动较慢
  • 软件包数量有限:相比 Ubuntu/Debian,AUR 等发行版,NixOS/Nixpkgs 中的包数量较少
  • 二进制缓存依赖:没有二进制缓存时,从源码构建耗时长
  • 与传统 Linux 差异大:一些传统的 Linux 操作方式在 NixOS 中不适用
  • 硬件驱动支持:某些专有驱动(如 NVIDIA)配置复杂

适用场景 @

  • 需要可重现环境的开发者和运维人员
  • 追求系统稳定性和可回滚性的用户
  • 需要在同一机器上测试不同软件版本
  • 偏好声明式配置的管理员
  • Nix 语言/函数式编程爱好者

镜像下载 @

NixOS 官方下载页 获取 Minimal ISO image。

VMware Workstation Pro 安装 @

VMware 官方 下载 Windows 版本,安装前需禁用 Hyper-V。

注意:Windows 环境下需关闭 Hyper-V 功能,否则与 VMware 虚拟化冲突。

虚拟机创建 @

测试环境配置:32GB RAM / i5-13600 / 5TB HDD

配置项 参数
内存 16GB
处理器 1 核 × 6 线程,开启 VT-x/EPT
硬盘 64GB
网络 NAT 模式
3D 加速 启用
固件 UEFI
光盘 挂载 ISO,选择启动时连接

启动 Live 环境与分区 @

进入 Live CD 环境后,使用 cfdisk 进行分区操作:

分区方案:
  /dev/nvme0n1p1 - EFI 分区   512MiB  Type: EFI System
  /dev/nvme0n1p2 - 根分区    剩余空间  Type: Linux filesystem

操作步骤:

  1. New → 输入 512MType → 选择 EFI System
  2. New → 回车分配剩余空间 → Type → 选择 Linux filesystem
  3. Write → 输入 yes 确认
  4. Quit 退出

也可以使用parted进行分区

# 新建 GPT 分区表
parted /dev/nvme0n1 --script mklabel gpt
# 创建 EFI 分区 512MiB
parted /dev/nvme0n1 --script mkpart ESP fat32 1MiB 513MiB
# 设置为 EFI 系统分区
parted /dev/nvme0n1 --script set 1 esp on
# 创建根分区,占用剩余所有空间
parted /dev/nvme0n1 --script mkpart root ext4 513MiB 100%

挂载文件系统 @

# 格式化 EFI 分区
mkfs.fat -F32 /dev/nvme0n1p1

# 格式化根分区(btrfs)
mkfs.btrfs /dev/nvme0n1p2

# 挂载根分区
mount /dev/nvme0n1p2 /mnt

# 创建并挂载 boot 分区
mkdir -p /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot

# 验证分区
lsblk

配置国内镜像源 @

sudo -i

# 订阅频道(使用中科大镜像)
nix-channel --add https://mirrors.ustc.edu.cn/nix-channels/nixpkgs-unstable nixpkgs
nix-channel --add https://mirrors.ustc.edu.cn/nix-channels/nixos-25.11 nixos
nix-channel --list
nix-channel --update

# 启用二进制缓存加速构建(上海交大镜像)
nixos-rebuild --option substituters https://mirror.sjtu.edu.cn/nix-channels/store switch --upgrade

生成初始配置 @

nixos-generate-config --root /mnt

生成配置文件位于 /mnt/etc/nixos/

  • configuration.nix - 系统主配置文件
  • hardware-configuration.nix - 硬件配置(通常无需修改)

配置 configuration.nix @

{ config, lib, pkgs, ... }:

{
  imports = [ ./hardware-configuration.nix ];

  # 启动引导配置
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  # 主机名
  networking.hostName = "nixos";

  # Nix 二进制缓存
  nix.settings.substituters = [ "https://mirror.sjtu.edu.cn/nix-channels/store" ];

  # VMware 虚拟化支持
  virtualisation.vmware.guest.enable = true;

  # 允许安装非自由软件包
  nixpkgs.config.allowUnfree = true;

  # 网络管理
  networking.networkmanager.enable = true;

  # 时区
  time.timeZone = "Asia/Shanghai";

  # 用户配置
  users.mutableUsers = false;
  users.users.lznauy = {
    isNormalUser = true;
    hashedPassword = "$y$j9T$uYfmWiBrhxkmHyoNtal6x0$p5RAOTS4V5.JqOZoL78grCDwMNPuUK7sluQ0Qfz/aU/";
    extraGroups = [ "wheel" "users" ];
  };

  # 系统软件包
  environment.systemPackages = with pkgs; [
    vim wget git curl htop
  ];

  # SSH 服务
  services.openssh.enable = true;
  services.openssh.settings.PermitRootLogin = "no";
  services.openssh.settings.PasswordAuthentication = true;
  services.openssh.settings.AllowUsers = [ "lznauy" ];

  system.stateVersion = "26.05";
}

安装 @

cd /mnt
nixos-install --show-trace --option substituters https://mirror.sjtu.edu.cn/nix-channels/store

安装完成后:

  1. 关闭虚拟机
  2. 移除 ISO 镜像挂载,取消 “启动时连接” 选项
  3. 重新启动通过 UEFI 引导进入系统

注意:添加新用户后需通过 passwd <username> 设置密码。可使用 mkpasswd 生成密码哈希。

日常维护 @

# 应用配置变更
sudo nixos-rebuild switch

# 升级系统
sudo nixos-rebuild switch --upgrade

# 回滚至上一版本
sudo nixos-rebuild switch --rollback

# 查询可用软件包
nix-env -qaP firefox

# 临时安装软件(不写入配置)
nix-env -iA pkgs.firefox

# 清理旧世代
sudo nix-collect-garbage -d

可以通过 nixos Wiki查询相关文档