Loading... # NixOS 声明式可重现的 Linux 发行版 # 一、概述 ## 1. 简介 ### A. 是什么 Nix 是一个采用独特方法的包管理和系统配置工具。NixOS 是基于 Nix 构建的 Linux 发行版,完全采用声明式配置。它通过纯函数式包管理理念,实现了可重现、可声明和可靠的系统构建。 ### B. 为什么学 - 解决环境不一致导致的「在我机器上能跑」问题 - 实现系统配置的版本控制和回滚能力 - 提供跨平台的一致性开发环境 - 避免依赖地狱和包冲突 ### C. 学完能做什么 - 使用 Nix 管理开发环境 - 编写 Nix 表达式定义包和环境 - 部署可重现的 Docker 镜像 - 配置和管理 NixOS 系统 ## 2. 前置知识 ### A. 必备技能 - 基本 Linux 命令操作 - 了解包管理器概念(apt、yum 等) - 基础 shell 脚本知识 ### B. 推荐知识 - 函数式编程概念 - Linux 系统管理经验 # 二、环境准备 ## 1. 系统要求 - Linux:主流发行版均支持(Ubuntu、CentOS、Debian、Fedora 等) - macOS:10.15+ - Windows:通过 WSL2 支持 ## 2. 安装步骤 Linux/macOS 单行安装: ```bash curl -L https://nixos.org/nix/install | sh ``` Windows(WSL2): ```bash curl -L https://nixos.org/nix/install | sh ``` 安装完成后需要重新打开终端或执行: ```bash source ~/.nix-profile/etc/profile.d/nix.sh ``` ## 3. 验证安装 ```bash nix --version ``` # 三、核心概念 ## 1. 基本术语 - Nix:包管理器和构建工具 - Nixpkgs:Nix 包集合,包含超过 12 万个包 - NixOS:基于 Nix 的 Linux 发行版 - Nix 表达式:用于定义包和配置的函数式语言 - Derivation:Nix 的构建描述,类似于 Makefile - nix/store:Nix 存储所有包的目录,使用哈希值唯一标识 ## 2. 工作原理 Nix 采用纯函数式构建模型: - 每个包的构建输入完全由其依赖决定 - 相同的输入永远产生相同的输出 - 包存储在 /nix/store 中,路径包含内容哈希 - 多个版本的包可以同时共存 ```mermaid graph LR A[源代码] --> B[Nix 表达式] B --> C[构建器] C --> D[nix/store] D --> E[系统配置] ```  ## 3. 设计原则 ### A. 可重现性 Nix 在隔离环境中构建包,确保: - 如果一个包在一台机器上工作,它将在任何机器上工作 - 没有未声明的依赖 - 构建结果可验证 ### B. 声明式 通过配置文件描述系统状态: - 易于共享和复现开发环境 - 配置即代码 - 支持版本控制 ### C. 可靠性 - 安装或升级一个包不会破坏其他包 - 支持原子性升级和回滚 - 保证系统始终处于一致状态 # 四、快速上手 ## 1. 临时使用软件 使用 nix-shell 创建临时环境: ```bash nix-shell -p python3 ``` 进入环境后,python3 命令可用,退出后环境消失。 ## 2. 多语言环境 一次性安装多个工具: ```bash nix-shell -p python3 nodejs go rustc ``` ## 3. 声明式开发环境 创建 shell.nix 文件: ```nix { pkgs ? import <nixpkgs> { }, }: pkgs.mkShell { name = "dev-environment"; buildInputs = [ pkgs.nodejs pkgs.python3 pkgs.go ]; shellHook = '' echo "Start developing..." ''; } ``` 运行: ```bash nix-shell ``` ## 4. 代码讲解 - pkgs ? import <nixpkgs> { }:导入 Nix 包集合 - mkShell:创建开发环境的辅助函数 - buildInputs:环境所需的包列表 - shellHook:进入环境时执行的 shell 脚本 # 五、进阶内容 ## 1. Nix 包管理 ### A. 搜索包 访问 https://search.nixos.org 搜索可用包 ### B. 安装包到用户配置 ```bash nix-env -iA nixpkgs.python3 ``` ### C. 列出已安装包 ```bash nix-env -q ``` ### D. 升级包 ```bash nix-channel --update nixpkgs nix-env -u '*' ``` ## 2. NixOS 系统配置 NixOS 配置文件位于 /etc/nixos/configuration.nix: ```nix { config, pkgs, ... }: { # 系统国际化 i18n.defaultLocale = "zh_CN.UTF-8"; # 时区设置 time.timeZone = "Asia/Shanghai"; # 网络配置 networking.networkmanager.enable = true; # 安装系统包 environment.systemPackages = with pkgs; [ vim git wget curl ]; # 启用 SSH 服务 services.openssh.enable = true; # 用户配置 users.users.user = { isNormalUser = true; extraGroups = [ "wheel" "networkmanager" ]; }; } ``` 应用配置: ```bash sudo nixos-rebuild switch ``` ## 3. 最佳实践 ### A. 版本控制 将所有配置文件纳入 Git 管理 ### B. 模块化配置 将配置拆分为多个模块,便于维护 ### C. 使用 Flakes Flakes 提供了更现代的 Nix 项目管理方式: - 声明式依赖管理 - 可重现的输入锁定 - 更好的项目结构 # 六、实战案例 ## 1. 场景描述 构建一个包含 Nginx 和 SSL 证书的 Docker 镜像 ## 2. 实现步骤 创建 docker.nix: ```nix { pkgs ? import <nixpkgs> { system = "x86_64-linux"; }, }: pkgs.dockerTools.buildLayeredImage { name = "nix-nginx"; tag = "latest"; contents = [ pkgs.nginx ]; } ``` 构建镜像: ```bash nix-build docker.nix docker load < result ``` ## 3. NixOS 云镜像配置 创建亚马逊 EC2 镜像配置: ```nix { pkgs, ... }: { security.acme.acceptTerms = true; security.acme.email = "nix@example.com"; services.nginx = { enable = true; recommendedGzipSettings = true; recommendedOptimisation = true; recommendedProxySettings = true; recommendedTlsSettings = true; virtualHosts."example.com" = { enableACME = true; forceSSL = true; locations."/".root = "${pkgs.nginx}/html"; }; }; } ``` ## 4. 配置测试 使用 NixOS 测试框架验证配置: ```nix { pkgs ? import <nixpkgs> { }, }: pkgs.nixosTest { name = "example-test"; machine = { pkgs, ... }: { environment.systemPackages = [ pkgs.hello ]; }; testScript = '' machine.succeed('hello | grep "Hello, world!"') ''; } ``` 运行测试: ```bash nix-build test.nix ``` # 七、常见问题 ## 1. 安装问题 ### Q: 安装后命令未找到 A: 需要重新打开终端或 source 配置文件: ```bash source ~/.nix-profile/etc/profile.d/nix.sh ``` ### Q: 权限问题 A: 确保 /nix 目录权限正确,或使用多用户安装模式 ## 2. 配置问题 ### Q: nix-shell 找不到包 A: 更新 nixpkgs channel: ```bash nix-channel --update ``` ### Q: NixOS 配置不生效 A: 检查配置语法,使用以下命令测试: ```bash sudo nixos-rebuild test ``` ## 3. 运行问题 ### Q: 如何回滚系统配置 A: NixOS 自动保存系统代数: ```bash sudo nixos-rebuild switch --rollback ``` ### Q: 磁盘空间占用过大 A: 清理旧的 Nix 存储: ```bash nix-collect-garbage -d ``` *** ## 参考资料 1. [Nix & NixOS 官方网站](https://nixos.org/) 2. [Nix 手册](https://nixos.org/manual/nix/stable/) 3. [Nixpkgs 包搜索](https://search.nixos.org/) 最后修改:2026 年 03 月 23 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏