Distrobox

出自 ArchWiki

Distrobox 是一个容器包装层,允许用户安装与主机不同的容器化 Linux 版本,同时提供与主机的紧密集成,从而允许在一个发行版上运行为另一个发行版设计的二进制文件。

Distrobox 本身不是容器管理器,它依赖于 PodmanDocker 来创建容器。

来自 Distrobox 文档

在您的终端中使用任何 Linux 发行版。实现软件的向前和向后兼容性,并自由使用您更喜欢的任何发行版。Distrobox 使用 Podman 或 Docker 来创建使用您选择的 Linux 发行版的容器。创建的容器将与主机紧密集成,允许共享用户的 HOME 目录、外部存储、外部 USB 设备和图形应用程序 (X11/Wayland) 以及音频。

安全隐患

Distrobox 的主要目标不是将容器与主机隔离。由于该项目紧密集成的性质,完全隔离是不可能的,因为在 Distrobox 内运行的容器将完全访问您的主文件夹和应用程序目录。

建议使用 Podman 而不是 Docker,因为默认情况下 Docker 将以 root 身份运行容器,而 rootful 容器将无限制地访问您的主机文件系统。Rootless Docker 目前无法工作,但正在开发中。

虽然完全沙盒化是不可能的,但 Distrobox 通过其取消共享模式提供了一些隔离功能。有关详细信息,请参阅 #取消共享模式

安装

使用 root 权限

首先按照 PodmanDocker 的页面进行操作,并确保您能够安装和运行 Hello World 容器。

安装 distroboxdistrobox-gitAUR

不使用 root 权限/不可变文件系统

如果您没有系统的 root 权限,或者您正在使用不可变的发行版,则可以将 Distrobox 安装到您的主文件夹中。这样做需要使用 curl-to-sh 管道,这是一种不受支持的安装方法,因为它存在安全风险。

您可以在 Distrobox 文档页面 上找到说明

卸载

Distrobox 为 rootless 安装提供了一个卸载脚本,此脚本仅在您以 rootless 方式安装时才需要,如果您通过 Pacman 安装,则应以通常的方式 卸载

用法

注意
  • 在以下部分中,name 是一个变量,可以是您想要的任何名称。在所有情况下,将 name 替换为您选择的实际名称
  • 有关任何子类别中支持的选项的完整列表,请使用 --help,例如,要查看所有创建选项,请使用 distrobox create --help
  • 支持的发行版及其镜像名称的完整列表可以在 https://distrobox.it/compatibility/#containers-distros 找到
  • 有关更高级的用法技巧,请参阅 Distrobox 文档页面 https://distrobox.it/usage/usage/

要创建新容器,请运行以下命令

$ distrobox create -n name

要列出已安装的容器,请运行以下命令

$ distrobox list

要与已安装的容器交互,请运行以下命令

$ distrobox enter name

或者您可以直接向容器发送命令,使用

$ distrobox enter name -- command-to-execute

要停止正在运行的容器,请运行以下命令

$ distrobox stop name

要删除容器,请运行以下命令

$ distrobox rm name

要将特定发行版安装到容器中,请运行以下命令(在本例中是 Ubuntu)

$ distrobox create --image ubuntu:22.04

安装可以完全自定义,如下所示(在本例中,它是一个名为 test 的容器,运行 Gentoo 并具有 root 权限)

$ distrobox create -i docker.io/gentoo/stage3:latest -n test --root

如果您需要您的容器具有主机的 root 权限,则建议您使用 --root 标志而不是 sudo distrobox

取消共享模式

Distrobox 允许用户通过其 unshare 功能部分隔离某些系统方面。默认情况下,以下组件在主机和容器之间共享

devsysfsipcnetnsprocess$HOMEApplication access

您可以使用以下列出的命令在创建新容器时选择 unshare 其中一些组件

共享
共享 命令 用法
devsysfs --unshare-devsysfs 不共享来自主机的设备和 sysfs 目录。
ipc --unshare-ipc 不与主机共享 ipc 命名空间。
netns --unshare-netns 不与主机共享网络命名空间。
process --unshare-process 不与主机共享进程命名空间。
全部 --unshare-all 激活所有 unshare 标志。

请注意,无法取消共享 $HOMEApplication access,因为这些对于 Distrobox 的核心功能是必需的。

警告: 虽然取消共享功能在容器和主机之间提供了一些隔离,但它不构成完整的安全沙箱。您不应依赖它来实现完全的安全隔离。

配置

可以通过两种方式配置 Distrobox,可以使用配置文件或使用 环境变量

配置文件

Distrobox 检查以下位置的配置文件,从最不重要到最重要

  • /usr/share/distrobox/distrobox.conf
  • /usr/etc/distrobox/distrobox.conf
  • /etc/distrobox/distrobox.conf
  • ~/.config/distrobox/distrobox.conf
  • ~/.distroboxrc

配置文件示例如下

container_always_pull="1"
container_generate_entry=0
container_manager="docker"
container_image_default="registry.opensuse.org/opensuse/toolbox:latest"
container_name_default="test-name-1"
container_user_custom_home="$HOME/.local/share/container-home-test"
container_init_hook="~/.local/distrobox/a_custom_default_init_hook.sh"
container_pre_init_hook="~/a_custom_default_pre_init_hook.sh"
non_interactive="1"
skip_workdir="0"

环境变量

以下变量可用,应使用 用户变量 进行设置

DBX_CONTAINER_ALWAYS_PULL
DBX_CONTAINER_CUSTOM_HOME
DBX_CONTAINER_IMAGE
DBX_CONTAINER_MANAGER
DBX_CONTAINER_NAME
DBX_CONTAINER_ENTRY
DBX_NON_INTERACTIVE
DBX_SKIP_WORKDIR

技巧与窍门

运行图形化应用

运行图形化应用程序时,您应该首先在 Fedora 中安装 mesa-dri-drivers GPU 驱动程序,在 Arch 中安装 mesa,或发行版的等效 Mesa 软件包。

如果您遇到授权错误,请参阅 Toolbox#X11 应用程序无法启动 以获取修复方法。

您可以从外部使用 distrobox enter -- appname 运行 Distrobox 内部安装的应用程序,或者通过在容器内运行 distrobox-export 将它们与桌面集成。

在容器内使用 systemd

在容器内运行以下命令,使主机 systemd 在容器内可访问

# ln -s /run/host/run/systemd/system /run/systemd
# mkdir -p /run/dbus
# ln -s /run/host/run/dbus/system_bus_socket /run/dbus

参见