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 包管理器
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.nix 和 hardware-configuration.nix
配置 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.nix 的 modules ,所以系统还是不变。
如果开启了 Flake, Nix 会忽略未被 Git 管理的文件,只会读取已经 Stage 或 Commit 的文件。 如果新建文件,记得进行 Stage。
Tips
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
<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,会自动进行合并。
参数
依赖
nativeBuildInputs依赖的平台是构建时的平台buildInputs依赖的平台与目标平台相符
自定义 nixpkgs
通过 override 与 overlays 修改 nixpkgs