NixOS 入门
NixOS 入门
内容施工中
本节内容正在修缮中,当前内容可能已经过时,仅供参考。
何谓 nix-channel
nix-channel
是一个命令行工具,用于订阅系统频道和软件频道。
命令行
nix-channel
命令行工具的使用:
nix-channel {--add url [name] | --remove name | --list | --update [names…] | --rollback [generation] }
看起来,这个命令行工具提供的功能有:订阅频道,退订频道,列出频道,更新频道,还能回滚“生成”。
频道是什么
上面我们演示了命令行工具的使用方式,却没有告知频道从哪里获取。
频道最直接的体现是一个形如 https://nixos.org/channels/nixos22.11
的 URL。
官方提供了官方频道集合。订阅了其中的频道以后,就会从相应的频道获取更新,大致和你使用其他发行版的软件源类似,不过我们后面会详述 NixOS 中的“频道”概念和传统发行版中“软件源”的区别。
请你尝试访问上面的 URL。正如我们所说,这是一个频道集合,根目录下的每一个子目录就代表一个频道,官方提供了若干个频道:
2022/8/4 22:51:25 0.1 kB nixos-21.11
2022/8/4 22:59:10 0.1 kB nixos-21.11-aarch64
2022/8/2 23:24:22 0.1 kB nixos-21.11-small
2023/1/3 23:39:40 0.1 kB nixos-22.05
2023/1/3 22:43:29 0.1 kB nixos-22.05-aarch64
2023/1/2 04:11:11 0.1 kB nixos-22.05-small
2023/3/16 05:19:03 0.1 kB nixos-22.11
2023/3/16 22:18:18 0.1 kB nixos-22.11-small
2023/3/16 14:55:20 0.1 kB nixos-unstable
2023/3/16 21:27:06 0.1 kB nixos-unstable-small
2023/1/2 21:05:38 0.1 kB nixpkgs-22.05-darwin
2023/3/17 00:30:11 0.1 kB nixpkgs-22.11-darwin
2023/3/16 04:06:35 0.1 kB nixpkgs-unstable
项目结构
我们以官方频道 nixpkgs-unstable
为例,查看每个频道大致的构成。它们似乎都提供了nixexprs.tar.xz
,从文件名我们就了解到这是一个包含了若干 nix 文件的 tar 压缩档(Tarball)。
Tarball
Tarball 是 tar
文件格式的全称,不是 Nix 独有。它可以将多个文件打包在一起。如果你想在打包的时候压缩一下,还可以使用 gzip,bzip2 等软件压缩该档案。当你对 tar
文件启用压缩以后,后缀名会变更为 tar.gz
, tar.bz2
等,具体取决于你使用的压缩软件。
于是我们解压它,列出目录树:
├─.github
├─doc
├─lib
├─maintainers
├─nixos
└─pkgs
├─applications
│ ├─accessibility
│ │ ├─contrast
│ │ └─wvkbd
│ ├─audio
│ │ ├─a2jmidid
│ │ ├─ario
│ │ ├─csound
│ │ │ ├─csound-manual
│ │ │ └─csound-qt
......
仅供演示
以上目录树是笔者为了方便演示而精简过的部分,实际构成肯定有差别。
上面的每个子目录中都有一个 default.nix
文件,这是导入该目录时默认被求值的文件。每个包名文件夹下面的 nix
文件,这些文件和脚本类似,运行它们时,会从五湖四海获取源码和其他资源,再根据脚本的描述构建出相应的二进制包。
提示
如果你还没有学习过 Nix 表达式语言,大抵是看不懂的,你可以前往 Nix 语言概览 进行初步学习。
每个频道都应该提供一个名为 nixexprs
的 Tarball。其中 default.nix
既是根目录也是每一级目录的入口点。
系统频道与软件仓库频道
频道在 NixOS 中大致被分为两类:系统频道和软件仓库频道。
系统频道
系统频道可以从 URL 中直观的体现。形如 https://nixos.org/channels/nixos22.11
你很快就了解到这是一个 22.11 版本的 NixOS 的频道。
默认订阅的频道
NixOS 默认订阅了官方频道 nixos
,即使你安装完系统什么都不做,它们也是存在的:
sudo nix-channel --list # 列出频道
nixos https://nixos.org/channels/nixos22.11
这个频道提供了组成系统的一些驱动,设施等等。
注意
这里的 nixos
与 https://nixos.org/channels/nixos22.11
并不是并列关系,前者是频道名,后面是被订阅的 URL。
当你有两个及两个以上频道的时候,你就会理解我的意思:
nixos https://nixos.org/channels/nixos22.11
nixpkgs https://nixos.org/channels/nixpkgs-unstable
除非升级系统或更换镜像频道,否则不要动系统默认的 nixos
频道。
一些特殊的频道
- 稳定(stable)频道。如
nixos-22.11
。这些频道只能得到保守的错误修复和软件包升级。例如,频道更新可能会导致系统上的Linux内核从 4.19.34 升级到 4.19.38(一个小错误修复),但不会从 4.19.x 升级到 4.20.x(一个可能会破坏一切的重大更改)。在创建下一个稳定分支之前,通常会保持稳定的频道。 - 不稳定(unstable)频道。这与
nixos
的主要开发分支相对应,因此可能有破坏性更新,不建议用于生产系统。 - 小型(small)频道,如
nixos-22.11-small
或nix-unstable-small
。这些频道与上述稳定和不稳定频道相同,只是它们包含较少的二进制包。这意味着它们比常规通道更新得更快(例如,当一个关键的安全补丁被提交到 NixOS 的源代码树时),但可能有更多的包需要从源代码构建。它们主要用于服务器环境,因此包含很少的 GUI 应用程序。
要查看可用的频道,请转到官方频道。(请注意,各种频道的 URI 重定向到一个包含最新版本频道的目录,还包括 ISO 映像和 VirtualBox 设备。)
请注意,在发布过程中,尚未发布的频道也将出现在此处。请参阅官方 Getting NixOS 页面以查找最新支持的稳定版本。
升级系统 #TODO
你可以使用以下命令获取当前的 nixos
频道
nix-channel --list | grep nixos
要切换到不同的NixOS通道,请执行
nix-channel --add https://nixos.org/channels/channel-name nixos
以 nixos
22.11 为例,命令为
nix-channel --add https://nixos.org/channels/nixos-22.11 nixos
使用以下命令以开始切换
nixos-rebuild switch --upgrade
该命令相当于 nix-channel --update nixos
; nixos-rebuild switch
注
频道的切换是以用户为单位的。当你不以 root
权限执行时,不会影响 /etc/nixos/configuration.nix
的配置。
注意
在频道之间来回切换通常是安全的。唯一的例外是,一个较新的NixOS也可能有一个较低的 Nix版本,这可能涉及到Nix数据库模式的升级。这是不容易撤消的,所以在这种情况下,您将无法返回到原始频道。
软件仓库频道
软件仓库频道不仅仅可以为 NixOS 使用,其他 Linux 发行版也可以安装 Nix 包管理器从中获取软件包,甚至 Darwin 也可以。
订阅 nixpkgs-unstable
频道
nixpkgs 仓库
nixpkgs 仓库更新非常快,所以没有稳定版。不过 darwin 是例外,因为 Nix 包管理器不能保证实时兼容当前的 darwin 平台,所以要做版本控制。
sudo nix-channel --add https://nixos.org/channels/nixpkgs-unstable # 添加频道,不过我更喜欢称它为 “订阅”
sudo nix-channel --update # 更新频道
如此,你便订阅上了官方的 nixpkgs-unstable 软件源。
推荐订阅镜像频道
上文仅供教学。在下一节我们会指引大家订阅国内能正常访问的镜像频道,键入下面的命令以退订官方的 nixpkgs-unstable
频道:
sudo nix-channel --remove nixpkgs-unstable
自定义频道名
默认情况下,频道名是截取自 URL 的最后一级:
nix-channel --add https://host/nixpkgs-unstable
我们列出频道名:
nixpkgs-unstable https://host/nixpkgs-unstable
如果我们需要手动命名频道,增加一个参数即可:
nix-channel --add https://host/nixpkgs-unstable nixpkgs
使用镜像频道
由于不可抗力的因素,大陆对于环大陆主机的访问显得异常艰难,所以我们需要使用国内的镜像频道来替代我们对官方频道(镜像频道通常由大学和企业公益性提供),下面列出了一些在中国可用的一些镜像频道:
- 中国教育和科研计算机网(清华大学)
https://mirrors.cernet.edu.cn/nix-channels/store
- 中国科学技术大学
https://mirrors.ustc.edu.cn/nix-channels/store
- 上海交通大学
https://mirror.sjtu.edu.cn/nix-channels/store
- 北京外国语大学
https://mirrors.bfsu.edu.cn/nix-channels/store
- 南京大学
https://mirror.nju.edu.cn/nix-channels/store
- 中国科学院软件研究所
https://mirror.iscas.ac.cn/nix-channels/store
我们使用镜像源替代官方的系统频道和软件仓库频道:
sudo nix-channel --add https://mirrors.ustc.edu.cn/nix-channels/nixpkgs-unstable nixpkgs # 订阅镜像仓库频道
sudo nix-channel --add https://mirrors.ustc.edu.cn/nix-channels/nixos-22.11 nixos # 请注意系统版本
sudo nix-channel --list # 列出频道
注
特地修改频道名是因为许多表达式都会把 nixpkgs 而不是 nixpkgs-unstable 作输入。
二进制构建缓存
源码分发是指将软件的源代码打包并分发给用户(Gentoo),二进制分发则是将已编译好的二进制程序直接分发给用户(例如 Debian,RHEL)。NixOS 默认是源码分发形式,不过我们可以添加二进制缓存源来让 NixOS 从缓存主机获取已经构建好的软件包。
为 NixOS 添加二进制缓存源
只需要修改 NixOS 配置中的 substituters
即可:
nix.settings.substituters = [ "https://mirrors.ustc.edu.cn/nix-channels/store" ];
由于官方的二进制缓存源是默认添加的,你可以通过下面的方式只启用自己指定的二进制缓存源:
# 记得导入 lib
nix.settings.substituters = lib.mkForce [ "https://mirrors.cernet.edu.cn/nix-channels/store" ];
当前可用的二进制缓存主机列表
- 中国科研和教育计算机网
https://mirrors.cernet.edu.cn/nix-channels/store
- 中国科技大学
https://mirrors.ustc.edu.cn/nix-channels/store
- 上海交通大学
https://mirror.sjtu.edu.cn/nix-channels/store
- 中国教育和科研计算机网
https://mirrors.cernet.edu.cn/nix-channels/store
- 北京外国语大学
https://mirrors.bfsu.edu.cn/nix-channels/store
- 南京大学
https://mirror.nju.edu.cn/nix-channels/store
- 中国科学院软件研究所
https://mirror.iscas.ac.cn/nix-channels/store
Cachix 服务
Cachix 服务是 Nix 二进制缓存服务实现的方式之一,你可以使用它在服务器构建缓存,然后连接到该服务器的主机可以分享这些缓存,从而避免了二次构建。了解详情请参阅 Cachix 官网。
Nix 生态构成简述
Nix 生态主要由 Nix 表达式语言,NixOS,Nix 包管理器,Nixpkgs,NixOps,Hydra 构成。以下只是梗概,并不需要你完全理解或记住它。
名称 | 描述 |
---|---|
Nix 表达式语言 | Nix 表达式语言是一种函数式编程语言,用于描述软件包的构建过程、依赖关系和环境变量等信息。它支持函数定义、递归、模式匹配等特性,还支持嵌套语法,可描述复杂的依赖关系和构建过程。Nix 还支持原子事务,使得所有的包和环境都是原子的,不会相互影响。Nix 表达式语言可用于定义软件包和环境,也可用于描述系统配置。它是一种强大、灵活、可重复和可扩展的语言,用于管理软件包和环境。 |
NixOS | NixOS 是一种基于 Nix 包管理器的 Linux 发行版,具有高度可配置性、可重复性和安全性。它采用声明性配置,使用配置文件明确描述系统状态,使得配置更易于维护。NixOS 适用于需要高度可定制性的用例,如服务器和开发环境。 |
Nix 包管理器 | Nix 是跨平台的功能强大的包管理器,采用函数式编程思想描述依赖关系和多版本软件包管理,并提供一系列跨平台工具方便管理和部署。 |
NixOps | NixOps是基于NixOS的云部署管理工具,支持多云平台,提供简单的命令行接口,可创建、部署、升级和回滚NixOS。用户可通过编写Nix表达式自定义部署和配置,使其成为灵活、可扩展和可定制的工具。适合需要管理大型、复杂基础设施的组织。 |
Hydra | Hydra 是在 NixOS 中使用的 CI/CD 系统,它可以自动构建、测试和部署软件包,并决定是否发布和部署。Hydra 可以在不同环境下测试软件包,适用于开发、测试和部署任何类型的软件。 |
Nixpkgs | nixpkgs 是 Nix 软件包管理器的官方软件包集合,包含数以万计的软件包,并提供了构建、测试和部署工具,支持多平台和多架构,适用于开发、测试和部署各种类型的软件。 |