Toolbox

Silverblue 作为不可变操作系统,是非常适合用于进行容器相关的开发的。我们也非常欢迎你在 Silverblue 使用 buildahpodman 完成容器相关的工作。

Silverblue 也提供了 Toolbox ,利用容器提供了一个开发工具和程序库部署与使用的解决方案。

为什么使用 Toolbox?

Toolbox 提供了专为应用程序开发和调试打造的容器化环境。在 Fedora Silverblue 这样的不可变操作系统上,Toolbox 提供了一种基于软件包的环境以方便用户安装工具和软件库。当然 Toolbox 也可被用于其它的基于软件包的系统。

通过 toolbox 容器化你的工作流会给你带来以下好处:

  • 它使得宿主系统干净且稳定,也有效避免了安装大量开发工具和软件包之后可能发生的混乱。

  • 不管你运行的哪个版本的 Fedora,所有受支持的发行版都在 toolbox 中可用。

  • 容器是隔离和组织不同项目依赖的好方法。

  • 容器是做实验的好地方:一旦出了问题,只需要删除容器重新开始就行了。

工作原理

Toolbox 提供了创建、进入、列举和删除容器的实现。与此同时,Toolbox 将容器集成到了常规的工作环境中,以便日常开发使用。

容器往往基于是高度精简的发行版镜像创建的,这一精简过程会导致几乎没有工具和文档可用。但是 toolbox 团队维护一组完整的含有工具以及文档的 Fedora 镜像,保证良好的开箱即用体验。

所有 Toolbox 容器都可以通过命令行进入。每一个容器都提供了:

  • 已有的账户及其权限

  • 用户目录以及其他几个目录的访问能力

  • 对于系统以及会话的 D-Bus,系统日志以及 Kerberos 认证信息的访问权限

  • 常见命令行工具,包括软件包管理器(例如 Fedora 附带的 DNF)

可以说 Toolbox 容器无论是在哪个角度看都和 Linux 命令行环境相差无几。但也是基于上面的几点,你不应将 Toolbox 容器视为可以执行未经试验脚本的沙箱。

在多数情况下,当你在容器中执行一条命令,容器内的应用程序会被使用。但有些时候使用的会是宿主系统的程序(利用 flatpak-spawn)。一个例子就是 toolbox 这个命令本身,它使得在 Toolbox 容器内使用 Toolbox 成为可能。

安装

Fedora Silverblue

Fedora Silverblue 30 或更高版本已经预装了 Toolbox。在旧版系统上,你可以使用下面的命令安装 Toolbox:

$ rpm-ostree install toolbox

这会将 toolbox 作为一个堆叠的 RPM 被安装。

Fedora Workstation

可以在 Fedora Workstation(或者 Fedora 的任意一个基于软件包的版本)可以使用下面的命令安装 Toolbox:

$ sudo dnf install toolbox

创建第一个 Toolbox 实例

当 Toolbox 被安装后,执行下面的两个命令以开启你的 Toolbox 之旅:

$ toolbox create

这会下载 OCI 映像文件并利用它创建一个 Toolbox 容器。接下来我们执行:

$ toolbox enter

在进入 Toolbox 容器后,你就可以访问常见的命令行工具,并使用软件包管理器(例如 Fedora 的 DNF)安装更多新的工具。

当你处于 Toolbox 环境时,你会发现命令提示符会有一个菱形标记作为前缀。如果你使用了自定义的 Shell 主题,这颗菱形就会消失。

命令与用法

toolbox create [options] <name>

创建一个 Toolbox 容器。如果没有 OCI 映像可用会先作下载,默认情况下下载的是与宿主环境对应的映像。如果找不到匹配的映像,则会默认下载 Fedora 映像。

如果不添加任何参数, toolbox create 会自动为容器命名。如果需要创建多个容器,使用 <name> 参数为容器命名。

如果你希望指定映像搭载发行版的版本(例如你希望在 Fedora 34 上获取 Fedora 32 的映像),使用 --release <release> | -r <release> 选项。

要想使用其他发行版的映像创建 Toolbox 容器(例如在 Fedora 上使用 RHEL 的映像),使用 --distro <distro> | -d <distro> 选项。

要使用不同的映像文件,使用 --image <name> | -i <name> 选项。

toolbox enter [options] <name>

进入容器以作交互使用。如果不添加任何参数, toolbox enter 会打开默认的 Toolbox 容器。

如果你有多个容器,可以使用 name 指定你需要进入的容器。

要想指定你要进入容器的发行版(例如在 RHEL 使用 Fedora 的 Toolbox),使用 --distro <distro> |-d <distro> 选项。

要想指定你要进入容器的版本(例如在 RHEL 8.3 使用 RHEL 8.1 的 Toolbox),使用 --release <release> | -r <release> 选项。

toolbox run [options] <cmd> <arg …​>

在容器环境中执行特定命令,但不进入容器。如果不添加任何参数, toolbox run 会在默认的 Toolbox 容器执行你的命令。

如果你有多个容器,可以使用 --container <name> | -c <name> 指定你需要使用的容器。

要想指定执行命令所用容器的发行版(例如在 RHEL 使用 Fedora 的 Toolbox),使用 --distro <distro> |-d <distro> 选项。

要想指定执行命令所用版本(例如在 RHEL 8.3 使用 RHEL 8.1 的 Toolbox),使用 --release <release> | -r <release> 选项。

toolbox list [options]

列出本地可用的 Toolbox 容器和映像。

如果希望只列出容器,使用 --containers | -c 选项。

如果希望只列出映像,使用 --images | -i 选项。

toolbox rm [options] <name …​>

移除一个或多个 Toolbox 容器。

使用 --force | -f 参数以强制删除正在运行的容器。

--all | -a 选项将移除所有 Toolbox 容器。

toolbox rmi [options] <name …​>

移除一个或多个 Toolbox 映像。

如果需要移除指定映像的同时移除所有使用该映像创建的容器,使用 --force | -f 选项。

--all | -a 选项将移除所有 Toolbox 映像。

toolbox --help

显示 Toolbox 帮助文档。

离开 Toolbox 环境

要回到宿主环境,可以执行 exit 或者退出当前 Shell(也就是按下 Ctrl+D)。

背后实现

Toolbox 使用了下面的技术:

交流与沟通

要报告问题、提出建议、贡献代码修复,可以前往 Toolbox 在 GitHub 上的页面

要联系 Toolbox 用户和开发者,可以前往 Fedora 的 Discourse 论坛 ,或者加入 Freenode 的 #silverblue IRC 频道。