OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 087

NixOS 配置组织、维护与排错实践

保留版本管理、模块组织、更新备份、安全开发和故障恢复的完整工作清单。

所在专题Nix 命令与长期维护 ↗
约 11 分钟阅读开始阅读

1. 版本管理#

版本范围:原笔记示例围绕 NixOS 24.05、Python 3.11、Node 20 等版本编写。下面保留历史 pin 便于理解;24.05 不应被当作当前安全受支持分支。迁移时选择仍受支持的输入并评估锁定源码和选项变更。

固定 Nixpkgs 版本

避免配置漂移,确保可复现性:

# 使用 flake.nix(推荐)
{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
  };
  # ...
}

# 固定 commit 可在 flake input 中指定具体修订,并提交 flake.lock。
# autoUpgrade 是自动应用更新的独立选择,不是固定版本的方法。
{
  system.autoUpgrade = {
    enable = true;
    flake = "/etc/nixos";
    flags = [ "--update-input" "nixpkgs" ]; # 兼容旧 CLI;核对本机版本
    allowReboot = false;
  };
}

启用 Flakes

{ pkgs, ... }: {
# 在 configuration.nix 中添加
nix = {
  package = pkgs.nixVersions.stable;
  extraOptions = ''
    experimental-features = nix-command flakes
  '';
};
}

2. 配置组织#

推荐目录结构

~/.config/nixos/
├── flake.nix              # Flake 入口
├── flake.lock             # 锁定文件
├── hosts/
│   ├── desktop/           # 桌面主机
│   │   └── default.nix
│   └── server/            # 服务器主机
│       └── default.nix
├── modules/
│   ├── common/            # 通用模块
│   ├── desktop/           # 桌面环境
│   ├── development/       # 开发环境
│   └── services/          # 服务配置
└── pkgs/                  # 自定义包

模块化示例

# modules/desktop/gnome.nix
{ config, lib, pkgs, ... }:

{
  options.my.desktop.gnome.enable = lib.mkEnableOption "GNOME desktop";
  
  config = lib.mkIf config.my.desktop.gnome.enable {
    services.xserver.enable = true;
    services.displayManager.gdm.enable = true;
    services.desktopManager.gnome.enable = true;
    
    environment.systemPackages = with pkgs; [
      gnome-tweaks
      gnomeExtensions.dash-to-dock
    ];
  };
}

3. 日常维护#

系统更新

# 更新 Flake 锁定
nix flake update

# 先做求值与构建检查
nix flake check --no-build
nixos-rebuild build --flake .#workstation
# 确認目标并准备好回滚后,再实际激活
sudo nixos-rebuild switch --flake .#workstation

# 或者直接更新 channel
sudo nix-channel --update
sudo nixos-rebuild switch --upgrade

磁盘清理

# 先检查历史;-d 删除找到的所有旧世代,不会保留最近三代
nix-env --profile /nix/var/nix/profiles/system --list-generations
# 如确认只保留各 profile 当前世代,才考虑:
# sudo nix-collect-garbage -d

# 删除特定版本之前的所有版本
sudo nix-collect-garbage --delete-older-than 30d

# 优化存储(去重)
nix store optimise

备份策略

{ pkgs, ... }: {
# 在 configuration.nix 中启用自动备份
services.borgbackup.jobs.homeBackup = {
  paths = [ "/home" ];
  exclude = [ "*/Downloads" "*/.cache" ];
  repo = "/backup/borg";
  compression = "auto,zstd";
  startAt = "daily";
};
}

4. 安全建议#

{
  # 启用防火墙
  networking.firewall.enable = true;
  
  # SSH 安全
  services.openssh = {
    enable = true;
    settings = {
      PermitRootLogin = "no";
      PasswordAuthentication = false;
      KbdInteractiveAuthentication = false;
    };
  };
  
  # 自动安全更新
  system.autoUpgrade = {
    enable = true;
    allowReboot = false;
  };
  
  # Fail2ban
  services.fail2ban = {
    enable = true;
    maxretry = 3;
  };
}

5. 开发环境#

使用 direnv

{ pkgs, ... }: {
# 启用 direnv
programs.direnv = {
  enable = true;
  enableZshIntegration = true;
  nix-direnv.enable = true;
};
}

项目特定的开发环境

# shell.nix
{ pkgs ? import <nixpkgs> {} }:

pkgs.mkShell {
  packages = with pkgs; [
    nodejs_20
    yarn
    git
  ];
  
  shellHook = ''
    echo "Node.js development environment loaded!"
    node --version
  '';
}

6. 性能优化#

{
  # 只启用 Btrfs 支持;压缩还需在目标 fileSystems 挂载选项设置 compress=zstd
  boot.supportedFilesystems = [ "btrfs" ];
  
  # 垃圾回收设置
  nix.gc = {
    automatic = true;
    dates = "weekly";
    options = "--delete-older-than 30d";
  };
  
  # 自动优化
  nix.settings.auto-optimise-store = true;
  
  # 使用缓存
  nix.settings.substituters = [
    "https://cache.nixos.org"
    "https://nix-community.cachix.org"
  ];
  # 从缓存服务的官方页面核验对应签名公钥,再写入 trusted-public-keys。
  # 不复制未经核验或已过期的示例密钥。
}

7. 故障排查#

配置错误无法启动

# 进入前一个版本
在启动菜单中选择之前的版本

# 或者从 Live USB 修复
# 先用 lsblk / blkid 核对实际根分区与文件系统
# /dev/disk/by-label/ROOT 是占位,按实际布局选择并挂载引导等其他分区
sudo mount /dev/disk/by-label/ROOT /mnt
sudo nixos-enter
# 修复配置
sudo nixos-rebuild switch

清空交换空间

只有确认空闲内存足以接纳已换出的页面、没有关键负载时才停用交换;否则可能导致内存不足。它不是通用性能修复手段。

sudo swapoff -a
sudo swapon -a

查看系统日志

# 查看启动日志
journalctl -b

# 查看特定服务日志
journalctl -u sshd

# 实时日志
journalctl -f

8. 推荐工具#

{ pkgs, ... }: {
environment.systemPackages = with pkgs; [
  # 系统管理
  fastfetch     # 系统信息;原笔记 neofetch 已停止维护
  htop          # 进程管理
  btop          # 系统监控
  iotop         # IO 监控
  
  # 网络工具
  nmap          # 端口扫描
  nettools      # netstat 等
  iperf3        # 网络测速
  
  # 文件管理
  fd            # 快速文件查找
  ripgrep       # 快速文本搜索
  fzf           # 模糊查找
  bat           # 增强版 cat
  eza           # 增强版 ls;原 exa 示例的延续项目
  
  # 开发工具
  git
  vim
  wget
  curl
  jq            # JSON 处理
];
}

9. 学习资源#

可复现、更新与备份的边界

flake.lock 固定输入,自动更新则主动改变输入和系统状态。allowReboot = false 只约束自动重启,不意味着不会应用服务变更。Borg 配置还要核对仓库初始化、权限、加密和恢复演练;系统回滚不能替代 /home 数据备份。

参考与延伸

  1. NixOS 手册 ↗
  2. Nix GC 参数 ↗
  3. Nixpkgs ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Nix 命令与长期维护

  1. 01NixOS 学习路线:基础、Flakes、用户配置与进阶
  2. 02Nix 命令详解:构建、环境、profile 与系统
  3. 03nh:统一 Nix 系统、用户和清理工作流
  4. 04垃圾回收、存储优化与回滚世代
  5. 05NixOS 配置组织、维护与排错实践
CONTINUE READING / 下一篇Nix 开发环境:多语言、数据库与全栈示例

保留 Python、Node、Rust、Go、Java、C/C++、Haskell,以及数据库和 Justfile 的完整配置。