#user #nix #namespaces #linux #root #permissions #version

bin+lib nix-user-chroot

无需root权限安装和运行nix

4个稳定版本

1.2.2 2021年5月2日
1.2.1 2021年3月12日
1.1.1 2021年1月9日

Unix APIs 排名第 555

每月下载 22

MIT 许可证

17KB
276

nix-user-chroot

Build Status

Rust 对 lethalman 版本的重写,以明确许可证情况。这个分支还使得使用nix沙盒成为可能!

作为普通用户运行和安装nix,无需root权限。Nix-user-chroot需要用户命名空间来完成其任务(从Linux 3.8开始可用)。请注意,在某些Linux发行版(如Red Hat Linux、CentOS)中使用默认内核时,对于未授权用户来说此功能不可用。它应该在Ubuntu、Debian和Arch Linux中可用。

检查您的内核是否支持未授权用户的用户命名空间

$ unshare --user --pid echo YES
YES

输出应为 YES。如果命令不存在,可以检查内核编译选项

$ zgrep CONFIG_USER_NS /proc/config.gz
CONFIG_USER_NS=y

在某些系统(如Debian或Ubuntu)上,内核配置在另一个位置,因此请使用

$ grep CONFIG_USER_NS /boot/config-$(uname -r)
CONFIG_USER_NS=y

在基于Debian的系统上,此功能可能默认禁用。但是,它们提供了一个sysctl开关,可以在运行时启用它。

在RedHat / CentOS 7.4上,用户命名空间默认禁用,但可以通过以下方式启用

  1. 通过 grubbynamespace.unpriv_enable=1 添加到内核引导参数中
  2. echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf 以增加允许的命名空间数量,超过默认的0。

有关更多详细信息,请参阅 RedHat 文档

下载静态二进制文件

检出 最新版本 并下载与您的架构匹配的二进制文件。

使用cargo安装

$ cargo install nix-user-chroot

从源代码构建

$ git clone https://github.com/nix-community/nix-user-chroot
$ cd nix-user-chroot
$ cargo build --release

如果您使用rustup,还可以构建一个静态链接版本

$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target=x86_64-unknown-linux-musl

安装

这将从chroot下载并解压最新的nix二进制tar包

$ mkdir -m 0755 ~/.nix
$ nix-user-chroot ~/.nix bash -c "curl -L https://nixos.org/nix/install | bash"

本文中描述的安装方法在NixOS上无法正常工作,因为您从一个空的nix存储开始,因此缺少bash和coreutils等工具。在NixOS上,您根本不需要使用nix-user-chroot,因为您可以使用以下命令获得类似的功能:nix run --store ~/.nix nixpkgs.bash nixpkgs.coreutils

用法

安装后,您始终可以使用以下方式进入nix用户chroot:

$ nix-user-chroot ~/.nix bash -l

您现在位于一个用户chroot,其中/由您的用户所有,因此/nix也由您的用户所有。其他所有内容都是从真实根目录绑定挂载的。

nix配置不在/etc/nix中,而在/nix/etc/nix中,这样您就可以修改它。这是通过NIX_CONF_DIR完成的,您可以在任何时候覆盖它。

Nixpkgs中的具有OpenGL或CUDA支持的库和应用程序需要从/run/opengl-driver/lib加载库。为了方便,nix-user-chroot将把/nix/var/nix/opengl-driver/lib(如果存在)绑定挂载到该位置。您仍然需要在这里链接系统库,因为它们的原始位置是发行版相关的。例如,在Ubuntu 20.04上支持CUDA:

$ mkdir -p /nix/var/nix/opengl-driver/lib
$ ln -s /usr/lib/x86_64-linux-gnu/libcuda.so.1 /nix/var/nix/opengl-driver/lib

如果您第一次进入nix用户chroot时此目录不存在,您需要重新进入以将/run/opengl-driver/lib挂载。

愿望清单

这些是作者希望看到的功能,如果您想参与这项工作,请告诉我

添加一个--install标志

而不是

$ mkdir -m 0755 ~/.nix
$ nix-user-chroot ~/.nix bash -c "curl -L https://nixos.org/nix/install | bash"

它应该是这样的

$ nix-user-chroot --install

这假设我们默认将安装到$XDG_DATA_HOME$HOME/.data/nix

添加一个setuid版本

由于并非所有Linux发行版默认允许用户命名空间,因此我们需要为那些安装setuid二进制文件的包提供包以实现相同的功能。

类似的项目

nix-portable

依赖项

~1.5MB
~37K SLoC