JuNest!
有些时候可能会拿到一些没有 root 权限的机器,找管理员安装软件不方便,而自己编译安装软件管理起来也比较麻烦,还要处理各种依赖。在群友 SteamedFish 的推荐下用上了 JuNest 这个工具。如果之前有使用过 ArchLinux 的包管理的话,用起来会很舒服~ 没有的话
pacman
也挺好学的。
主要应用场景就是在没有 root 权限的机器上安装各种软件)
这个项目托管在 GitHub : https://github.com/fsquillace/junest
起因
我自己拿到了一台服务器的账号,但是没有 root 权限,上面缺很多软件,还有一些软件比较老旧。host 机器的操作系统是 Debian,一开始我尝试直接使用 apt download 下载软件包,然后 dpkg 安装到我的家目录,后来发现依赖处理起来很麻烦。然后在群友的推荐下去了解了 nix
、gentoo-prefix
和 linuxbrew
等工具,一番文档看下来,发现它们大多在安装时候需要 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
andarm
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 支持 namespace
、proot
和 chroot
三种后端,其中 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 提供的软件。
使用 junest 命令进入到容器里
# 进入容器 junest # 现在已经在 junest 里面了,所以可以使用 pacman pacman --version
给 junest 命令传递参数(?)
# 现在是在 host 环境上,直接运行以下命令来使用 junest 容器里的 pacman junest pacman --version
直接在 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 吧,相当好看😭😭😭