Nix:纯粹功能型的Linux软件包管理器

Nix是一款功能强大的纯粹功能型的软件包管理系统,为可靠且可重复的软件包管理而设计,按照GNU LGPLv2.1的条款发布。它是一款不太知名的Linux发行版NixOS中主要的软件包管理系统。

Nix提供原子升级及回滚、多个版本的软件包安装、多用户软件包管理以及为软件包轻松安装构建环境,无论开发人员使用哪种编程语言和工具。

在Nix下,软件包是用“Nix表达式”这种功能型软件包语言构建的。这种功能型软件包管理方法确保安装或升级一个软件包不会破坏其他软件包。

Nix还有多用户支持,这意味着普通(或非特权)系统用户可以安全地安装软件包,每个用户由配置文件(Nix商店中出现在用户Path中的软件包集合)来识别。

如果一个用户安装了软件包,另一个用户试图安装同一个软件包,不会再次构建或下载该软件包。

它目前支持Linux(i686、x86_64)和Mac OS X(x86_64)。然而,它的移植性相当强,你可以在支持POSIX线程、有C++11编译器的大多数平台上试用它。

我们在本文中将介绍如何在Linux中安装(在多用户模式下)和使用Nix软件包管理器。我们将讨论与常用工具有关的一些基本的软件包管理任务。

如何在Linux中安装Nix软件包管理器?

我们将在多用户模式下安装最新版本的Nix(v2.1.3)。幸好,有一个现成的安装脚本,你可以在系统上使用下列curl命令,以普通用户的身份从shell运行。

$ sh <(curl https://nixos.org/nix/install) --daemon

运行上述命令将下载最新的nix二进制打包文件,你将进入多用户nix安装屏幕,如屏幕截图所示:

Nix:纯粹功能型的Linux软件包管理器

图1:在Linux中安装Nix软件包管理器

想查看安装过程中发生的详细情况,请键入y并按回车键。如果你对结果满意、准备好继续,请键入y并按回车键。

Nix:纯粹功能型的Linux软件包管理器

图2:Nix安装摘要

脚本将根据需要多次调用sudo命令。你需要回答y并按回车键来允许它使用sudo。

Nix:纯粹功能型的Linux软件包管理器

图3:Nix安装继续

然后,安装程序会运行几个测试,生成Nix配置报告,在用户ID 30001和30032之间创建构建用户,以及组ID为30000的组。出现提示时输入y以继续。它将为不同的构建用户设置构建组,并创建Nix的基本目录结构。

它会修改文件/etc/bashrc(以及面向zsh的/etc/zshrc),如果这些文件存在的话。请注意,它先用.backup-before-nix扩展名备份上述文件,安装程序还会创建文件/etc/profile.d/nix.sh。

安装程序还将设置nix-daemon服务和nix-daemon套接字服务,为nix-daemon加载systemd单元,并启动上述两个服务。

安装完成后,你需要打开新的终端窗口,以便开始使用Nix。或者,关闭并重新打开shell,让最近的更改生效。然后获取文件/etc/profile.d/nix.sh(因为它不是shell启动文件,打开新的shell不会获取它)。

$ source /etc/profile.d/nix.sh

接下来,运行下列命令从官方项目网站下载一些路径,这些路径是Nix运行所必需的。所有路径下载并拷贝到正确的位置后,你将看到系统和Nix安装类型摘要,如屏幕截图所示:

$ nix-shell -p nix-info --run "nix-info -m"

Nix:纯粹功能型的Linux软件包管理器

图4:Nix安装和系统摘要

如何在Linux中使用Nix软件包管理器?

在Nix下,软件包管理由nix-env实用程序完成。它用于安装、升级和删除/擦除软件包,以及查询已安装或可用于安装的软件包。

所有软件包都在Nix通道中,该通道是一个URL,指向含有Nix表达式集合和指向二进制缓存的指针的存储库。

默认通道是Nixpkgs,订阅通道列表存储在~/.nix-channels中,你可以使用下列命令将它们列出来(没有输出表示没有通道)。

$ nix-channel --list

想添加Nix通道,请使用下列命令:

$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable

在安装任何软件包之前,先要更新Nix通道;这类似于在APT软件包管理器下运行apt update。

$ nix-channel --update

Nix:纯粹功能型的Linux软件包管理器

图5:更新Nix通道

可以使用下列命令查询可供安装的软件包。

$ nix-env -qa

Nix:纯粹功能型的Linux软件包管理器

图6:查询可供安装的软件包

在这个例子中,我们将使用前一个命令与grep一起安装Apache Tomcat服务器,以查找可供安装的软件包,如图所示:

$ nix-env -qa | grep“apache-tomcat”

Nix:纯粹功能型的Linux软件包管理器

图7:查找可供安装的软件包

想安装软件包,请指定软件包版本,比如apache-tomcat-9.0.2,使用下列命令:

$ nix-env -i apache-tomcat-9.0.2

Nix:纯粹功能型的Linux软件包管理器

图8:使用Nix安装软件包

在本地系统上,Nix将软件包存储在Nix商店中,默认情况下是在/nix/store目录,其中每个软件包都有各自唯一的子目录。比如,apache-tomcat软件包存储在:

/nix/store/95gmgnxlrcpkhlm00fa5ax8kvd6189py-apache-tomcat-9.0.2

在此路径中,随机字符95gmgnxlrcpkhlm00fa5ax8kvd6189py是软件包的唯一标识符,它考虑到了所有依赖项。

你可以使用下列命令列出已安装的软件包。

$ nix-env –q

Nix:纯粹功能型的Linux软件包管理器

图9:列出已安装的软件包

想升级apache-tomcat软件包,可以使用-u upgrade参数选项符,如图所示:

$ nix-env -u apache-tomcat

如果你想删除/擦除apache-tomcat,请使用-e标志。这里,软件包并不立即从系统中删除,只是处于未使用状态。这很有用,因为也许你想要执行回滚,或者它可能在其他用户的配置文件中。

$ nix-env -e apache-tomcat

删除软件包后,你可以使用nix-collect-garbage实用程序进行一些垃圾回收。

$ nix-collect-garbage

如何在Linux中删除Nix软件包管理器?

想卸载Nix,一次性删除所有与Nix有关的文件。

$ sudo rm -rf /etc/profile/nix.sh /etc/nix /nix ~root/.nix-profile ~root/.nix-defexpr ~root/.nix-channels ~/.nix-profile ~/.nix-defexpr ~/.nix-channels

在带有systemd的系统上,运行下列命令,停止所有与Nix有关的服务并禁用它们。

$ sudo systemctl stop nix-daemon.socket 
$ sudo systemctl stop nix-daemon.service 
$ sudo systemctl disable nix-daemon.socket 
$ sudo systemctl disable nix-daemon.service 
$ sudo systemctl daemon-reload

此外,你需要删除/etc/profile、/etc/bashrc和/etc/zshrc这些文件中的任何引用Nix的项。

欲知详情,请参阅我们介绍的上述实用程序的参考手册页。

$ man nix-channel 
$ man nix-env

你可以在项目官网https://nixos.org/nix/找到Nix软件包管理器的说明文档。

结束语

Nix是一种纯粹功能型的软件包管理器,为可靠且可重复的软件包管理而设计。它提供了很有意思的软件包管理概念,与Linux中的YUM和APT等常用工具大不相同。

我们在本文中介绍了如何在多用户模式下安装nix,讨论了如何用Nix进行软件包管理,欢迎留言交流。