前言 @
作为一个arch系的长期用户,最早接触archlinux是2019年,后来觉得折腾起来有点累,然后转向了稍微省心点的Manjaro,中间也尝试过CachyOS,为什么现在想尝试nixos?
因为听说nixos可以一份配置快速复现系统,并且方便转移我的各种GUI以及软件配置、用户配置,虽然初期学习成本较高,但觉得综合对比下来,nixos依然是我现阶段的最优解。
目前的最终目标是达成类似 ryan4yin作者配置的效果
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
操作步骤:
New→ 输入512M→Type→ 选择EFI SystemNew→ 回车分配剩余空间 →Type→ 选择Linux filesystemWrite→ 输入yes确认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
安装完成后:
- 关闭虚拟机
- 移除 ISO 镜像挂载,取消 “启动时连接” 选项
- 重新启动通过 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查询相关文档