Nix 包管理器简介——一个纯粹的功能包管理器

在本文中,我们将讨论 Nix 包管理器。 如果您在任何 Linux 发行版上阅读本文,您可能知道包管理器是什么。 但对于初学者来说,包管理器是用于在设备上安装、删除、升级包的软件。 然而,像 apt 和 Pacman 这样的传统包管理器存在多个缺陷,这使得它们无法可靠地用于需要高度稳定的系统(如服务器)的环境中。

然而,Nix 被设计成一个可靠且可重复的包管理系统,可以解决传统包管理器带来的常见问题。 但要了解解决方案,我们必须先了解问题。

目录

传统包管理器的缺点

更改无法撤消: 传统的包管理器如 apt 或 Pacman 将所有包全局安装在 /usr/local/bin 中。 如果您更新或重新配置任何软件包,它只会更新 /usr/local/bin 中的相应文件,从而永久更改该软件包的状态,而无法恢复到旧版本。

更新不是原子的 (立即的):在任何更新期间,对包的更改将在整个更新期间应用。 C。 这意味着,如果对新配置的升级中断——例如,中途断电——系统仍将处于一致状态:i,它可能会破坏整个系统,因为驱动程序更新了一半,依赖项安装了一半。

依赖地狱: 这个问题甚至有一个整体 维基百科 专用于它的页面。 假设您必须安装一个依赖于包 B 和包 C 的包 A 。 B 和 C 又依赖于 D 的两个不同版本。这是一个问题,因为传统的包管理器不能同时使用同一个包的两个版本。 所以在这种情况下,我们可以安装 B 或 D,但不能同时安装,因此我们不能安装 A。这种特殊的问题风格称为 钻石依赖冲突.

钻石依赖冲突

还有很多其他的依赖问题,比如循环依赖冲突和线性依赖冲突,都是由于传统的包管理器不能同时安装同一个包的两个版本而引起的。

Nix 如何解决这些问题

正如标题中提到的,Nix 是一个纯粹的功能包管理器。 简单来说,这意味着 Nix 构建的所有包都附加了一个唯一的哈希,该哈希是由包的依赖项派生的。

把它想象成一台机器,它接受与包相关的所有输入,即它的依赖项、所有依赖项的版本、C/CXX 标志、源、配置文件、环境变量、外部补丁等,然后输出一个表达式(Nix Expression) 然后生成一个具有唯一哈希的包,该哈希无法更改并将其存储在 /nix/store/some-unique-package-name 中。 为了 example,我的路径 bash 壳是

/nix/store/hrpvwkjz04s9i4nmli843hyw9z4pwhww-bash-4.4-p23 

通过更改依赖版本或使用不同的依赖重新编译包将导致具有不同哈希的完全不同的包。

多个版本: 由于散列方案,不同版本的包最终在 Nix 存储中的不同路径中,因此它们不会相互干扰。 重温依赖地狱的问题,由于包 D 的两个版本现在是完全不同的包,您可以使用一个版本构建包 B,而使用另一个版本构建包 C,而不会发生任何冲突。

原子更改和回滚:由于更新的包与现有的包完全不同,旧包不会被删除,但新包将简单地符号链接在旧包上。 由于当前正在使用的软件包没有进行任何更改,因此即使更新过程中断,也不会破坏系统。 实际的更改,即在旧版本上链接新版本的包是在瞬间(原子)完成的。

由于旧版本的包仍然存在,这意味着您可以随时将机器回滚到旧包。

如果您认为整个多个版本的 shebang 会占用太多空间,您可以随时运行垃圾收集命令,该命令将删除您未使用的包。

再现性: 通过 Nix,很容易复制开发环境。 您所要做的就是检查任何包的配置文件,其中提到了包的所有内容,将其复制到系统中,并使用相同的依赖版本和环境变量重新构建包。 并且很清楚这两个环境是否一致,因为复制环境中的所有包都应该具有与原始环境相同的哈希值。

如何安装 Nix

如果您对 Nix 感到兴奋并想试用 Nix,但又不想离开您花费数月建立的舒适发行版,我有个好消息。 您可以在任何 Linux 发行版上安装 Nix 包管理器,只需一个 单一命令. 只需在终端中执行以下命令。

$ curl -L https://nixos.org/nix/install | sh

但是,如果您想要完整的体验,您可以随时下载并安装 尼克斯操作系统 它使用 Nix 不仅用于包管理,还用于管理系统配置(例如,在 /etc)。 这意味着很容易将系统的整个配置回滚到较早的状态。

如何使用 Nix 包管理器?

让我们开始为您的 Linux 发行版使用 Nix 包管理器。

1. 简介

Nix 上的不同用户可以安装不同的软件包集并具有不同的配置。 对配置文件所做的任何更改都不会影响任何其他配置文件,因为它们是沙盒的。

2.渠道

通道是由 Nix 正式验证的包(及其定义)的 git 存储库列表。 这类似于 Ubuntu/Debian/Arch 中存储库的概念。 有多个基于不同验证级别的渠道。 您可以找到频道列表 这里.

列出当前频道:

$ nix-channel --list

订阅新频道:

nix-channel --add https://some.channel/url my-alias

删除频道:

nix-channel --remove channel-alias

更新渠道:

nix-channel --update channel-alias

更新所有频道:

nix-channel --update

3. 搜索包

在当前频道列表中搜索包:

nix search <pkg-name>

它将列出一堆包含关键字的应用程序 <nixpkgs.pkg-name> 格式。

不过你也可以上网 尼克斯商店 并搜索包含如何安装说明的软件包。

在线 Nix 套餐

4. 安装包

要在当前配置文件中安装任何包,请使用

nix-env -iA <nixpkgs.pkg-name>

“-A”标志使我们能够选择一个特定的频道来下载包。 如果要从默认频道安装,请使用

nix-env -i <pkg-name>

5. 卸载包

要在当前配置文件中安装任何包,请使用

nix-env -e <pkg-name>

6.升级包

要升级任何特定软件包,请使用

nix-env -u subversion

要升级配置文件中的所有软件包,请使用

nix-env -u

7. 回滚

你可以回滚你最后 nix-env 通过使用命令

nix-env --rollback

每次你执行一个 nix-env 操作,创建用户环境的新用户代。 为了 example,当我们安装 tdesktop 时,会创建一个新一代。 您可以使用列出所有世代

nix-env --list-generations

并使用

nix-env --switch-generation <gen-number>
尼克斯世代尼克斯世代

8.垃圾清除

您可以使用删除旧代

nix-env --delete-generations old

删除特定的世代,使用

nix-env --delete-generations 1 2

结论

恭喜。 现在您了解了 Nix 和 Nix 中的基本包管理,您将不必担心可怕的依赖地狱和新的更新会破坏您的系统。 要了解有关 Nix 的更多信息,您可以使用官方 尼克斯维基. 玩得开心!