JuNest!

有些时候可能会拿到一些没有 root 权限的机器,找管理员安装软件不方便,而自己编译安装软件管理起来也比较麻烦,还要处理各种依赖。在群友 SteamedFish 的推荐下用上了 JuNest 这个工具。如果之前有使用过 ArchLinux 的包管理的话,用起来会很舒服~ 没有的话 pacman 也挺好学的。
主要应用场景就是在没有 root 权限的机器上安装各种软件)
这个项目托管在 GitHub : https://github.com/fsquillace/junest

起因

我自己拿到了一台服务器的账号,但是没有 root 权限,上面缺很多软件,还有一些软件比较老旧。host 机器的操作系统是 Debian,一开始我尝试直接使用 apt download 下载软件包,然后 dpkg 安装到我的家目录,后来发现依赖处理起来很麻烦。然后在群友的推荐下去了解了 nixgentoo-prefixlinuxbrew 等工具,一番文档看下来,发现它们大多在安装时候需要 root 权限(后续使用可能不用),而完全不需要 root 权限的 portable-nix 现在看起来缺乏维护。最后了解到了 junest,太好用了!于是写篇博客记录一下,主要介绍一下安装方法,和后续使用中我自己的一些习惯(之后可能会写一下如何直接 ssh 连入到 junest 的容器中去,主要应用场景就是给 vscode remote 用了)。

准备

读项目介绍

JuNest (Jailed User Nest) is a lightweight Arch Linux based distribution that allows the creation of disposable and partially isolated GNU/Linux environments within any generic GNU/Linux host OS and without requiring root privileges to install packages.

JuNest is built around pacman, the Arch Linux package manager, which allows access to a wide range of packages from the Arch Linux repositories.

The main advantages of using JuNest include:

  • Install packages without root privileges.
  • Create partially isolated environments in which you can install packages without risking mishaps on production systems.
  • Access a wider range of packages, particularly on GNU/Linux distros with comparatively limited repositories (such as CentOS and Red Hat).
  • Run on a different architecture from the host OS via QEMU.
  • Available for x86_64 and arm architectures but you can build your own image from scratch too!
  • All Arch Linux lovers can enjoy their favourite distro everywhere!

JuNest follows the Arch Linux philosophy.

准备系统

你至少要有一个可以登录的账户,全过程不需要 root 权限,junest 支持 namespaceprootchroot 三种后端,其中 chroot 需要 root 权限,就不多做讨论了。前两者我更推荐 namespace 的实现,具体区别可以去阅读 junset 的文档(其实在 junest 的文档里安装使用也写得很清楚了)。可以查阅这个表格来查看自己的 host 系统是否默认开启了用户命名空间。ArchLinux 和比较新版本的 Debian、Ubuntu 都是开了的。

安装

junest 还是有一些依赖的,需要服务器上已经满足以下依赖
bash (>=4.0) GNU coreutils
另外安装过程中有用到 git

使用 ssh 链接到服务器,将 junest 仓库 clone 到 ~/.local/share/junest

# 新建目录
mkdir ~/.local/share/junest
# clone 仓库(网络问题是另外的话题)
git clone https://github.com/fsquillace/junest.git ~/.local/share/junest

将 junest 添加到 PATH,以便你可以方便的使用它

export PATH=~/.local/share/junest/bin:$PATH

如果不想每次都执行上述 export 命令可以将它写入到 ~/.bashrc 中,追加到文件末尾即可。完成编辑后需要执行 source ~/.bashrc 生效,或者干脆登出 ssh 重新登录。

现在你可以设置 JUNEST_HOME 这个环境变量以控制 junest 的安装位置,默认是 .junest,我是使用了默认的位置

使用以下命令完成安装

junest setup

等待执行完成,没有出错的话就完成了安装。

使用 junest 环境

在你完成安装之后,ssh 连入服务器是在 host 机器的环境当中,现在你使用的各种工具都是 host 机器提供的。
有以下几种方式可以使用 junest 里的 archlinux 提供的软件。

  1. 使用 junest 命令进入到容器里

    # 进入容器
     junest
     # 现在已经在 junest 里面了,所以可以使用 pacman
     pacman --version
    
  2. 给 junest 命令传递参数(?)

    # 现在是在 host 环境上,直接运行以下命令来使用 junest 容器里的 pacman
     junest pacman --version
    
  3. 直接在 host 机器上使用 junest 里安装的程序

    我不推荐这种方式,原因是这种情况会优先使用 host 机器上的程序,如果你 host 机器上安装了老版本(不符合需求的)程序,junest 里安装了新的版本,在这种情况下会优先使用 host 机器上的版本。
    如果确实这种方式的,可以参考官方文档:https://github.com/fsquillace/junest/tree/master?tab=readme-ov-file#run-junest-installed-programs-directly-from-host-os

我自己比较推荐第一种方式,就是直接进入到 junest 容器中,完全使用 junest 里的程序,和 host 机器划清界限(
可以在 ~/.bashrc 中追加以下内容来使每次 ssh 连入后自动进入 junest 环境。

if [ ! -f /usr/bin/pacman ]; then
    junest
fi

之后的配置

通过 junest 命令进入环境之后,你面对的就是一个全新的 archlinux 系统了,在这里你拥有(虚假的)root 权限,可以使用 sudo 命令
再一切开始之前,你需要编辑 pacman 的配置文件来启用一个镜像站点。

如果你在 junest 里,那么你需要编辑的文件是 /etc/pacman.d/mirrorlist,如果 junest 环境里尚未有你喜欢的编辑工具,可以使用 exit 命令或 Ctrl+D 退出 junest 到 host 环境,然后利用 host 环境里已经有的编辑工具去编辑 ~/.junest/etc/pacman.d/mirrorlist

在上面提及的 mirrorlist 文件最前段添加你想使用的镜像站站点,比如,要使用山东科技大学的开源镜像网站,添加以下内容

Server = https://mirrors.sdust.edu.cn/archlinux/$repo/os/$arch
# 清华大学 tuna 镜像站的话就是以下内容
# Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch

完成上述编辑之后,确保你回到 junest 环境中,执行以下命令来更新一下 junest 里的 archlinux 同时安装一些相当基础的软件

sudo pacman -Syyu
sudo pacman -S glibc

完成之后你就可以用 pacman 来安装自己所需的软件包了,例如

# 安装 vim、ninja、cmake 和 python
sudo pacman -S vim ninja cmake python

关于 pacman 的用法可以去看 archlinux 的文档,另外需要注意 archlinux 上有些包名可能和你正在使用的发行版不一样,可以用 -Ss 参数来查找软件包,例如

$ pacman -Ss ninja
extra/gn 0.2130.7367b0df-1
    Meta-build system that generates build files for Ninja
extra/ninja 1.11.1-3 [installed]
    Small build system with a focus on speed
extra/ninjas2 0.2.0-3
    A sample slicer audio plugin
extra/ninjas2-lv2 0.2.0-3 (lv2-plugins pro-audio)
    A sample slicer audio plugin - LV2 plugin
extra/ninjas2-standalone 0.2.0-3 (pro-audio)
    A sample slicer audio plugin - JACK standalone
extra/ninjas2-vst 0.2.0-3 (vst-plugins pro-audio)
    A sample slicer audio plugin - VST plugin
extra/samurai 1.2-2
    ninja-compatible build tool written in C

具体的用法还是去参考 archlinux 的文档吧~

现在你可以在 junest 里自由的安装并使用各种所需的软件而全程不需要 host 机器的 root 权限。

挖坑

有时候可能会有直接 ssh 连接到 junest 容器里的需求(而不是先连接到 host 机器,再使用 junest 命令进入容器),我的应用场景就是给 vscode remote 用。大概需要以下步骤

  • 给 junest 里的 archlinux 安装一个打过补丁的 openssh(为的是解决一点小小的权限问题)

  • 配置并启动 junest 里的 sshd 服务

  • 可能的,如果你的 host 机器有防火墙,不能将 junest 里的 sshd 服务暴露到你可以访问的网络上,就需要配置下跳板

关于上述步骤可以参考 @ayaka_45434/installing-packages-on-linux-without-sudo-privilege-using-junest

具体步骤和可能踩的坑我可能也许大概会再水一篇 blog :)

EOF

快去看 It's MyGO 吧,相当好看😭😭😭