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

NixOS 配置基础:选项与模块

从引导、网络、用户、软件包到服务组织一份系统配置。

所在专题NixOS 系统基础与配置 ↗
约 10 分钟阅读开始阅读

配置文件结构#

NixOS 的主要配置文件位于 /etc/nixos/:

/etc/nixos/
├── configuration.nix      # 主配置文件
└── hardware-configuration.nix  # 硬件配置(自动生成)

配置文件的基本结构#

{ config, pkgs, ... }:

{
  imports = [
    ./hardware-configuration.nix
  ];
  
  # 你的配置...
  
  system.stateVersion = "24.05"; # 示例初装版本;保留自己的初装值
}

参数说明:

  • config: 整个系统的配置状态
  • pkgs: nixpkgs 包集合
  • ...: 允许传递其他参数(忽略不用的)

常用配置选项#

引导配置

UEFI/systemd-boot 与 BIOS/GRUB 是两种示例,按实际安装模式选择;GRUB 整盘目标必须核对,不能照抄 /dev/sda。

# UEFI 引导
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;

# 传统 BIOS 引导
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/sda";
boot.loader.grub.useOSProber = true;

网络配置

下列静态地址使用文档专用网段,并非可用的真实网络。需按实际网络替换;桌面 NetworkManager 与静态接口方案应明确由谁管理同一接口。

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

# NetworkManager(推荐桌面使用)
networking.networkmanager.enable = true;

# 静态 IP(服务器使用)
networking.interfaces.eth0.ipv4.addresses = [ {
  address = "192.0.2.10";
  prefixLength = 24;
} ];
networking.defaultGateway = "192.0.2.1";
networking.nameservers = [ "192.0.2.53" "192.0.2.54" ];

本地化配置

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

# 区域设置
i18n.defaultLocale = "zh_CN.UTF-8";
i18n.extraLocaleSettings = {
  LC_ADDRESS = "zh_CN.UTF-8";
  LC_IDENTIFICATION = "zh_CN.UTF-8";
  LC_MEASUREMENT = "zh_CN.UTF-8";
  LC_MONETARY = "zh_CN.UTF-8";
  LC_NAME = "zh_CN.UTF-8";
  LC_NUMERIC = "zh_CN.UTF-8";
  LC_PAPER = "zh_CN.UTF-8";
  LC_TELEPHONE = "zh_CN.UTF-8";
  LC_TIME = "zh_CN.UTF-8";
};

# 中文输入法
i18n.inputMethod = {
  enable = true;
  type = "fcitx5";
  fcitx5.addons = with pkgs; [
    fcitx5-rime
    fcitx5-chinese-addons
  ];
};

用户配置

docker 组拥有较高权限,仅确需时加入。SSH 禁用密码登录前,应先验证密钥登录可用,避免锁住管理入口。

users.users.alice = {
  isNormalUser = true;
  description = "Alice";
  extraGroups = [ "networkmanager" "wheel" "docker" ];
  # 安装时交互设置密码;不要将明文密码写入公开配置。
  
  # 需要声明密码时,可使用部署时提供的 hashedPasswordFile。
  # 不要把密码哈希写进公开仓库或可读的 Nix store。
  
  # 设置默认 shell
  shell = pkgs.zsh;
  
  # SSH 公钥授权(不负责打开防火墙端口)
  openssh.authorizedKeys.keys = [
    "<完整 SSH 公钥,占位符不可直接使用>"
  ];
};

软件包管理

# 系统级安装
environment.systemPackages = with pkgs; [
  vim
  git
  curl
  wget
  htop
  firefox
];

# 启用程序
programs.firefox.enable = true;
programs.git.enable = true;
programs.zsh.enable = true;

服务配置

# OpenSSH
services.openssh = {
  enable = true;
  settings = {
    PermitRootLogin = "no";
    PasswordAuthentication = false;
  };
};

# Docker
virtualisation.docker = {
  enable = true;
  enableOnBoot = true;
};

# 防火墙
networking.firewall.enable = true;
networking.firewall.allowedTCPPorts = [ 22 80 443 ];

重建系统#

build 只构建;dry-build 只显示构建计划;test 会立即激活;switch 立即激活并设为启动默认。它们都不能单独证明实际服务行为正常。

修改配置后,需要重建系统使其生效:

# 临时激活配置(会立即改变运行系统,但不设为启动默认项)
sudo nixos-rebuild test

# 应用配置
sudo nixos-rebuild switch

# 更新并重建
sudo nixos-rebuild switch --upgrade

回滚配置

# 查看历史版本
sudo nixos-rebuild list-generations

# 切换到特定版本
sudo nix-env --profile /nix/var/nix/profiles/system --switch-generation 42
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch

# 删除旧版本并回收(确认当前系统稳定、允许放弃旧回滚点后)
sudo nix-collect-garbage --delete-older-than 30d

模块化配置#

将配置拆分到多个文件:

/etc/nixos/
├── configuration.nix
├── hardware-configuration.nix
├── users.nix
├── desktop.nix
└── services.nix

在 configuration.nix 中导入:

imports = [
  ./hardware-configuration.nix
  ./users.nix
  ./desktop.nix
  ./services.nix
];

示例:users.nix

{ config, pkgs, ... }:

{
  users.users.alice = {
    isNormalUser = true;
    extraGroups = [ "wheel" "networkmanager" ];
  };
  
  users.users.bob = {
    isNormalUser = true;
    extraGroups = [ "networkmanager" ];
  };
}

常用命令#

# 编辑配置
sudo nano /etc/nixos/configuration.nix

# 求值并列出将要构建/下载的路径(不执行构建)
nixos-rebuild dry-build

# 构建并预览激活操作(预览不保证包含全部影响)
nixos-rebuild dry-activate

# 查看当前配置选项值
nixos-option networking.hostName

# 搜索可用选项
man configuration.nix

参考资源#



参考与延伸

  1. NixOS 手册 ↗
  2. Nix 语言手册 ↗

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

沿专题继续阅读

NixOS 系统基础与配置

  1. 01NixOS:声明式系统的基础
  2. 02安装 NixOS:介质、分区与初始配置
  3. 03NixOS 配置基础:选项与模块
  4. 04用 Flake 与 Home Manager 管理系统
  5. 05NixOS 命令行:新旧接口与日常维护
  6. 06NixOS 世代管理与垃圾回收
  7. 07Specialisation:一个世代的多个配置变体
  8. 08配置可重现,应用为什么还会“失忆”?
CONTINUE READING / 下一篇用 Flake 与 Home Manager 管理系统

把依赖入口、系统模块、用户配置和项目开发环境分清职责。