Distrobox
Distrobox 是一个容器封装层,它允许用户安装与宿主机不同的 Linux 容器版本,同时与宿主机保持紧密集成,从而允许在另一个发行版上运行为某个特定发行版设计的二进制文件。
Distrobox 本身不是容器管理器,它依赖于 Podman 或 Docker 来创建容器。
摘自 Distrobox 文档:
- 在终端中使用任何 Linux 发行版。实现软件的向后和向前兼容性,并自由使用任何您感到舒适的发行版。Distrobox 使用 Podman 或 Docker 根据您的选择创建 Linux 发行版容器。创建的容器将与宿主机紧密集成,允许共享用户的 HOME 目录、外部存储、外部 USB 设备、图形应用 (X11/Wayland) 以及音频。
安全影响
Distrobox 的主要目标并非将容器与宿主机进行沙箱隔离。由于该项目的紧密集成特性,完全隔离是不可能的,因为在 Distrobox 中运行的容器将拥有对您的主文件夹和应用程序目录的完整访问权限。
建议使用 Podman 而非 Docker,因为默认情况下 Docker 会以 root 身份运行容器,而 root 容器将拥有对宿主机文件系统的无限制访问权限。目前 Rootless Docker 尚不可用,但正在开发中。
虽然无法实现完全的沙箱隔离,但 Distrobox 通过其“不共享模式”提供了一些隔离功能。详情请参阅 #不共享模式。
安装
具有 root 权限
首先,请参考 Podman 或 Docker 的页面,并确保您能够安装并运行一个 Hello World 容器。
没有 root 权限/不可变文件系统
如果您没有系统的 root 权限,或者您使用的是不可变发行版,可以将 Distrobox 安装到您的主文件夹中。这样做需要使用 curl-to-sh 管道,由于存在安全风险,这是一种不受支持的安装方法。
有关指令,请参阅 Distrobox 替代安装方法文档。
卸载
Distrobox 为无 root 安装提供了一个卸载脚本。只有在您执行无 root 安装时才需要此脚本;如果您是通过 Pacman 安装的,则应按通常方式卸载。
图形化前端
- BoxBuddy — Distrobox 的图形用户界面。
- DistroShelf — 用于在 Linux 上管理 Distrobox 容器的图形界面。
- Kontainer — 一个用于轻松管理 Distrobox 容器的原生 KDE 应用程序。
用法
- 在接下来的章节中,
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。
不共享模式 (Unsharing mode)
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
技巧与提示
运行图形化应用
在运行图形化应用时,您应该首先安装 GPU 驱动程序:Fedora 中安装 mesa-dri-drivers,Arch 中安装 mesa,或者安装该发行版对应的 Mesa 软件包。
如果您遇到授权错误,请参阅 Toolbox#X11 applications not starting 寻求解决方案。
您可以使用 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
在宿主机上执行命令
在容器内部时,可以使用 distrobox-host-exec command 在宿主机上运行命令。此命令要求安装 flatpak,否则它将无法工作,且不会弹出明显的错误消息 [1]。