Featured image of post Nix生态

Nix生态

Nix生态都有哪些工具?

简介

第一次接触NixOS是在2018年,公司在网关上安装了一个NixOS,那时感觉好先进啊(当然现在也很先进),所有的配置都集中到一个文件,无痛迁移和回滚,超级好用,给我打开了新世界的大门。

出于工作和学习的目的,我入手了一台Intel NUC,安装了NixOS,取代ISP的光猫,作为网关,一直用到了现在。

昨天,把NixOS从20.09升级到了22.11;在这个过程中,发现自己对于NixOS仍是一知半解,只是会使用,对于底层机制比如Nix Language等不太了解。于是,决定深入学习一下,方便以后的使用。

今天,先学习一下Nix的生态,掌握Nix的大概轮廓。

Nix生态

Nix生态共有三部分:

  • Nix包管理器
  • Nixpkgs
  • NixOS

Nix是一种语言,也是一个包管理器;Nixpkgs是软件包的集合,为Nix包管理器和NixOS提供软件源,类似于apt和rpm中的Repo;NixOS是一个Linux发行版,集成了Nix包管理器。

Nix包管理器

基本包管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出channel
nix-channel --list
# 添加新的channle
nix-channel --add https://nixos.org/channels/nixpkgs-unstable
# 更新channel
nix-channel --update
# 查看可用的包
nix-env --query --available
# 从nixpkgs channel安装jq
nix-env --install --attr nixpkgs.jq
# 卸载jq
nix-env --uninstall
# 更新jq
nix-env --upgrade --attr nixpkgs.jq
# 更新所有的包
nix-env --upgrade
# 列出所有的版本
nix-env --list-generations
# 回滚到上一个版本
nix-env --rollback
# 垃圾回收
nix-env --delete-generations old;nix-collect-garbage # 或者nix-collect-garbage -d

垃圾回收

nix-env 更新(-u)或者卸载(-e)操作,实际上并不会删除任何包,它们只是创建了一个新的用户环境,不再包含被更新或者删除的包。

如果你真的想删除package或者generation ,你必须执行nix-collect-garbage,这样才会真的从/nix/store 中删除相关的包。

/nix

/nix 目录存放着绝大部分Nix相关的文件,其下有两个目录:

1
2
3
4
$ tree -L 1 /nix
/nix
├── store # 下载的Nix包
└── var   # Nix运行相关的文件

如果你想更深入探究NixOS,那么请留意这个目录。

Nixpkgs

<Nixpkgs> 包括两个部分:

  • Nix包管理器的包集合
  • NixOS实现

其目录结构如下:

.github
doc
lib
maintainers
nixos
pkgs
.editorconfig
.git-blame-ignore-revs
.gitattributes
.gitignore
.mailmap
.version
CONTRIBUTING.md
COPYING
README.md
default.nix
flake.nix

其中pkgs目录下是所有的Nix包的定义,nixos目录下是NixOS操作系统的定义。

对于pkgs,如果你不开发Nix包,或者在其他操作系统上使用Nix包管理器,那么你可以暂时忽略pkgs,因为日常使用最多的操作就是nix-env --installnix-env --uninstall ,可以不用了解Nix的打包机制。

如果你使用NixOS,那么你需要研究下nixos/modules下的内容,这里面定义了所有的系统配置,可以做为/etc/nixos/configuration.nix 的参考。

NixOS

NixOS是一个Linux发行版,基于Nix包管理器构建。对于我来说,最大的好处是,所有的配置汇总在一个文件,可以实现无痛回滚和迁移。

你能想象你不再依赖/etc/吗?无论什么软件,Nginx,Apache,Cron,所有的软件配置,全都放置到一个文件里(妈妈再也不用担心我找不到配置文件了),只需要/etc/nixos/configuration.nix 就够了,简直不要太爽。

过去,无论是Debian系列,还是RHEL系列,各种配置文件散乱地存放在系统的角落,当迁移的时候,你甚至都不知道有哪些服务;在NixOS的世界里,这些都不是问题,你只需要一个配置文件。

在NixOS里,最重要的就是/etc/nixos/configuration.nix 配置文件,系统的所有配置,都要在这里更改,为此,你需要学习下Nix语言;这个之前已经讲过了,这里不再赘述,接下来讲一讲配置文件,如下是配置文件结构:

{ config, pkgs, ... }:

{ option definitions
}

上述代码是一个Nix函数,接受至少configpkgs两个参数,忽略其他的参数,并返回一个Nix Set类型的值。接下来,我们就来感受下,NixOS的配置到底是什么?执行sudo nix repl <nixpkgs> 1,你会得到一个Nix的Shell,一个交互的Nix解释器(类似于你执行python 或者irb ),在这个Shell里,你可以查看Nixpkgs的相关信息;执行sudo nix repl <nixpkgs/nixos> 2,在这个shell里,有三个重要的变量,分别是configoptionspkgs

参考


  1. <nixpkgs>是一个Nix Path类型的变量,在NIX_PATH可以找到:nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos ↩︎

  2. 同<nixpkgs> ↩︎

使用 Hugo 构建
主题 StackJimmy 设计