Skip to content

Nix 入门

Zero to Nix

Nix 系统功能

[!quote] - nixos-why - nixos-initial-config-flake-deploy - nix-flake-latex - practical-nix-flakes - nixos 中文教程 - nixos-config - ~misterio/nix-config - jordanisaacs/dotfiles - Scrive Nix Workshop - Scrive Nix Workshop - Nixpkgs Users and Contributors Guide - myme.no - NixOS: The Ultimate Dev Environment?

Nix 包管理器

Introduction

Nix 包管理器把二进制程序存储在 /nix/store/... 的路径里。中间的哈希值对应了软件包配置文件里的所有输入。Nix 包管理器在沙盒中进行编译,编译脚本只能读取到 /nix/store 中依赖组件的路径。

NixOS

NixOS 的所有二进制程序和配置文件都在 /nix/store 里,没有一个统一的目录。因此 NixOS 会调整 PATH 加入软件包的 bin 目录,这样就可以在 bash 下直接使用对应的命令;同时 NixOS 会把一些配置文件链接到 /etc 下,这样软件就可以在正常的位置找到它们。

可使用 nixos-infect 将现有系统替换为 NixOS

基础配置

nixos-generate-config/etc/nixos 下生成初始配置文件
configuration.nixhardware-configuration.nix

配置 Flakes

Flakes

nix-channel --list 列出当前配置的软件源列表, nix-channel --update 用于更新软件源。 但是 nix-channel 的配置不归 configuration.nix 管,由于软件源不断更新,同一配置文件的系统,可能会有软件版本的差异。

nix = {
    package = pkgs.nixUnstable;
    extraOptions = ''
        experimental-features = nix-command flakes
    '';
};

/etc/nixos 下创建一个 flake.nix,用于定义软件源 input

{
    inputs = {
        nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    };

    outputs = { self, nixpkgs, ...}@inputs: {
    # 定义名为 nixos 的系统
        nixosConfigurations."nixos" = nixpkgs.lib.nixosSystem {
            system = "x86_64-linux";
            modules = [
                ./configuration.nix
            ];
        };
    };
}

然后 nix flake update 生成一个 flake.lock 用于指定特定版本的 nixpkgs 软件源。

之后 nixos-rebuild switch 会优先读取 flake.nix ,将所有软件升级到这个特定版本。因为 configuration.nix 被加入到 flake.nixmodules ,所以系统还是不变。

如果开启了 Flake, Nix 会忽略未被 Git 管理的文件,只会读取已经 Stage 或 Commit 的文件。 如果新建文件,记得进行 Stage。

Tips

configuration highlights

bash 默认的 shebang 是 #!/bin/bash,但在 NixOS 由于某些原因不能用,必须改为 #!/usr/bin/env bash,在 GitHub CI 中也会有效。

SSL certificate problem when running git in pure shell · Issue #795 · NixOS/nix · GitHub

pure 的 shell 环境中如果使用 SSL 需要配置环境变量

Nix 语言功能

Nix 范例

[!quote] Nix By Example · Nix Cookbook Learn nix in Y Minutes

Search Path

In the Nix language — nix.dev documentation

<nixpkgs> 通过环境变量 $NIX_PATH 寻找,NIX_PATH 是在 nix-channel 设置的值,

nix-shell 需要查找 <nixpkgs>nixos-rebuild 需要查找 <nixos-config>

List 定义

Nix lang: short syntax to add element to a list - #10 by dramforever - Learn - NixOS Discourse

Nix 中的 list 是 declarative 而不是 imperative,在多个地方定义 list,会自动进行合并。

参数

依赖

NixOS - Nixpkgs 22.05 manual

  • nativeBuildInputs 依赖的平台是构建时的平台
  • buildInputs 依赖的平台与目标平台相符

自定义 nixpkgs

Customizing packages in Nix

通过 override 与 overlays 修改 nixpkgs