Distrobox
Distrobox 是一个容器包装层,允许用户安装与主机不同的容器化 Linux 版本,同时提供与主机的紧密集成,从而允许在一个发行版上运行为另一个发行版设计的二进制文件。
Distrobox 本身不是容器管理器,它依赖于 Podman 或 Docker 来创建容器。
来自 Distrobox 文档
- 在您的终端中使用任何 Linux 发行版。实现软件的向前和向后兼容性,并自由使用您更喜欢的任何发行版。Distrobox 使用 Podman 或 Docker 来创建使用您选择的 Linux 发行版的容器。创建的容器将与主机紧密集成,允许共享用户的 HOME 目录、外部存储、外部 USB 设备和图形应用程序 (X11/Wayland) 以及音频。
安全隐患
Distrobox 的主要目标不是将容器与主机隔离。由于该项目紧密集成的性质,完全隔离是不可能的,因为在 Distrobox 内运行的容器将完全访问您的主文件夹和应用程序目录。
建议使用 Podman 而不是 Docker,因为默认情况下 Docker 将以 root 身份运行容器,而 rootful 容器将无限制地访问您的主机文件系统。Rootless Docker 目前无法工作,但正在开发中。
虽然完全沙盒化是不可能的,但 Distrobox 通过其取消共享模式提供了一些隔离功能。有关详细信息,请参阅 #取消共享模式。
安装
使用 root 权限
首先按照 Podman 或 Docker 的页面进行操作,并确保您能够安装和运行 Hello World 容器。
安装 distrobox 或 distrobox-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
功能部分隔离某些系统方面。默认情况下,以下组件在主机和容器之间共享
devsysfs
、ipc
、netns
、process
、$HOME
和 Application access
。
您可以使用以下列出的命令在创建新容器时选择 unshare
其中一些组件
共享 | 命令 | 用法 |
---|---|---|
devsysfs | --unshare-devsysfs |
不共享来自主机的设备和 sysfs 目录。 |
ipc | --unshare-ipc |
不与主机共享 ipc 命名空间。 |
netns | --unshare-netns |
不与主机共享网络命名空间。 |
process | --unshare-process |
不与主机共享进程命名空间。 |
全部 | --unshare-all |
激活所有 unshare 标志。 |
请注意,无法取消共享 $HOME
和 Application 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