简介
第一次接触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包管理器
基本包管理
|
|
垃圾回收
nix-env
更新(-u
)或者卸载(-e
)操作,实际上并不会删除任何包,它们只是创建了一个新的用户环境,不再包含被更新或者删除的包。
如果你真的想删除package
或者generation
,你必须执行nix-collect-garbage
,这样才会真的从/nix/store
中删除相关的包。
/nix
/nix
目录存放着绝大部分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 --install
和nix-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函数,接受至少config
和pkgs
两个参数,忽略其他的参数,并返回一个Nix Set类型的值。接下来,我们就来感受下,NixOS的配置到底是什么?执行sudo nix repl <nixpkgs>
1,你会得到一个Nix的Shell,一个交互的Nix解释器(类似于你执行python
或者irb
),在这个Shell里,你可以查看Nixpkgs的相关信息;执行sudo nix repl <nixpkgs/nixos>
2,在这个shell里,有三个重要的变量,分别是config
,options
和pkgs
。