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 -f8. 推荐工具#
{ 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 数据备份。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。