本文的命令接口按 Distrobox 1.8.2.5 官方脚本核对;镜像标签与发行版包名是示例,使用前确认镜像仍受支持、仓库可用及本机实际版本。示例未做运行验证。
本文定位 本篇覆盖 Distrobox 的高级工作流:声明式批量管理、init 容器运行 systemd 服务、GPU 加速与硬件直通、多容器协作架构,以及桌面环境 / 虚拟化 / ChromeOS 等特殊场景。适合已经熟悉基本
distrobox-create/distrobox-enter操作的读者。
1. distrobox-assemble:声明式容器管理#
distrobox-assemble 相当于 Docker Compose 之于 Docker,允许你通过一个 INI 格式的 manifest 文件批量创建/销毁容器。manifest 默认路径为当前工作目录的 ./distrobox.ini;用户配置目录的文件要用 --file 指定,也支持本地自定义路径或远程 URL。
1.1 Manifest 全字段示例
# ~/.config/distrobox/distrobox.ini
[dev]
image=archlinux:latest
pull=true
init=false
entry=true
start_now=false
additional_packages="base-devel git neovim zsh bat ripgrep"
hostname="arch-dev"
exported_bins="/usr/bin/nvim"
exported_bins="/usr/bin/bat"
exported_bins="/usr/bin/rg"
[server]
image=ubuntu:22.04
pull=true
init=true
entry=false
start_now=false
additional_packages="nginx certbot python3-certbot-nginx postgresql systemd"
init_hooks="systemctl enable nginx && systemctl enable postgresql"
volume="/opt/data:/data"
[llvm-toolchain]
image=registry.fedoraproject.org/fedora:41
pull=false
init=false
additional_packages="clang lldb llvm cmake ninja-build gdb"
[cuda-dev]
image=nvidia/cuda:12.0-devel-ubuntu22.04
pull=false
init=false
nvidia=true
additional_packages="python3 python3-pip cmake"
hostname="cuda-box"
[libvirt-host]
image=registry.opensuse.org/opensuse/distrobox:latest
pull=true
init=true
root=true
unshare_all=true
additional_flags="-p 2222:22"
exported_apps="virt-manager"1.2 Manifest 字段速查表
类型说明:
bool:true或falsestring:单行字符串,如home="/home/user/dbox"string_list:空格分隔的多个字符串,如additional_packages="htop vim git"。可多次声明自动叠加:
[ubuntu]
additional_packages="git vim tmux"
additional_packages="htop iftop iotop" # 自动合并| 字段 | 类型 | 说明 |
|---|---|---|
image |
string | OCI 镜像地址(必填) |
pull |
bool | 每次 create 前强制拉取最新镜像(默认 false) |
init |
bool | 启用 init 系统(systemd / OpenRC) |
entry |
bool | 自动生成 desktop entry(应用启动器) |
root |
bool | 以 rootful 模式运行容器 |
start_now |
bool | 创建后立即启动容器 |
replace |
bool | 强制替换同名容器 |
clone |
string | 复制已有容器的文件系统状态 |
include |
string | 继承另一个 manifest entry 的属性 |
additional_packages |
string_list | 空格分隔的额外安装包 |
additional_flags |
string_list | 传给底层容器引擎的额外 flag |
init_hooks |
string_list | 容器初始化后执行的 shell 命令(按 && 串联) |
pre_init_hooks |
string_list | 初始化前执行的命令 |
home |
string | 自定义 HOME 目录路径 |
hostname |
string | 设置容器 hostname |
volume |
string_list | 额外 volume 挂载(host_path:guest_path) |
exported_apps |
string_list | 自动导出桌面应用 |
exported_bins |
string_list | 自动导出二进制 |
exported_bins_path |
string | 导出二进制存放路径(默认 $HOME/.local/bin) |
nvidia |
bool | 启用 NVIDIA GPU 支持 |
unshare_all |
bool | 启用支持的 unshare 选项(设备/sysfs、附加组、IPC、网络、进程);不是撤销所有挂载 |
unshare_netns |
bool | 仅解绑网络 namespace |
unshare_devsys |
bool | 仅解绑 /dev |
unshare_ipc |
bool | 仅解绑 IPC namespace |
unshare_process |
bool | 仅解绑 PID namespace |
unshare_groups |
bool | 不共享宿主机附加用户组 |
1.3 Clone 与 Include 示例
Clone(复制已有、已初始化的容器):
[ubuntu]
additional_packages="git vim tmux"
image=ubuntu:latest
init=false
[deno_ubuntu]
clone=ubuntu
pre_init_hooks=curl -fsSL https://deno.land/install.sh | sh;
[bun_ubuntu]
clone=ubuntu
pre_init_hooks=curl -fsSL https://bun.sh/install | bash;pre-init bootstrap 示例会在 guest 初始化早期运行下载脚本;应先审查并固定上游脚本,不能假定所有工具或用户 HOME 已准备好。被 clone 的容器必须已初始化并停止;克隆不是只复制 manifest,也不是跨发行版替换 image 的工具。若要 LLVM Fedora 环境,应直接创建 Fedora 容器,不设置 clone=dev。
Include(继承另一个 entry 的属性):
[ubuntu]
image=ubuntu:latest
additional_packages="git vim tmux nodejs htop zsh fish"
[ubuntu-nvidia]
include=ubuntu
nvidia=trueinclude 将被引用 entry 的字段插入当前定义,支持递归并检测循环。重复 key 采用累积处理,不等于常见配置语言的“子项覆盖父项”;list 字段可合并,image/bool 等单值字段应避免重复并检查 dry-run。
自定义登录 Shell:
[ubuntu]
image=ubuntu:latest
pre_init_hooks="export SHELL=/bin/bash;"1.4 assemble 命令
# 从当前目录 ./distrobox.ini 创建全部容器
distrobox assemble create
# 指定自定义 manifest 文件
distrobox assemble create --file ./my-distrobox.ini
# 从远程 URL 拉取 manifest 并创建(v1.8.0+)
distrobox assemble create --file https://example.com/distrobox.ini
# 只创建 manifest 中名为 "dev" 的容器
distrobox assemble create --name dev
# 预览模式:只打印将要执行的操作,不实际执行
distrobox assemble create --dry-run
# 强制替换已存在的同名容器
distrobox assemble create --replace
# 删除 manifest 中定义的全部容器
distrobox assemble rm
# 列出 manifest 中定义的容器及其当前状态
distrobox list多个 exported_bins 可以用官方文档支持的空格列表或重复字段,重复写法便于逐项审查。这里不沿用未经证实的“1.16.x 多路径 bug”说法:
exported_bins="/usr/bin/typst"
exported_bins="/usr/bin/julia"导出需要初始化后的容器内存在相应程序。exported_services 不是支持的字段,后台服务需单独管理。
manifest 可版本管理 将
distrobox.ini放入 dotfiles 仓库,配合distrobox assemble create --file可以重建同一份容器意图,但镜像 tag、包仓库与下载脚本会变动。远程 manifest 与 hooks 都是可信代码输入,建议先下载审阅、固定版本后再使用本地 --file。
2. Init 容器:在容器内跑 systemd#
--init flag 在容器内启用一个可工作的 init 系统,使你可以运行需要进程管理、socket 激活、定时任务的长期服务。
2.1 支持的 Init 系统
| Init 系统 | 典型发行版 |
|---|---|
| systemd | Ubuntu, Debian, Fedora, Arch, openSUSE 等 |
| OpenRC | Alpine Linux |
--init 让 guest 内运行其发行版 init 系统,并启用独立进程命名空间;它不只是 OCI 后端 --init 的轻量 reaper。基础镜像可能不含 systemd/OpenRC,需选兼容镜像并安装相应包。第一次初始化完成后再验证 PID 1 与 unit 状态。
2.2 Init Hooks 使用
--init-hooks 中的命令在包安装与用户设置等初始化步骤之后执行;不能据此保证 systemd 已在线。多个命令用 && 串联:
distrobox create --name dbserver --image ubuntu:22.04 --init \
--additional-packages "postgresql nginx systemd" \
--init-hooks "systemctl enable postgresql && systemctl enable nginx"--pre-init-hooks 则在基础包配置之前执行,此时 additional_packages 尚未安装。涉及已安装软件配置文件的工作应放到后面的 init hook,例如:
distrobox create --name webdev --image fedora:41 --init \
--additional-packages "httpd php php-fpm mariadb-server systemd" \
--init-hooks "printf 'ServerName localhost\n' >> /etc/httpd/conf/httpd.conf; systemctl enable httpd mariadb"2.3 让 Init 容器在宿主机启动时自动运行
使用用户级 systemd 服务控制容器启停:
# ~/.config/systemd/user/distrobox-dbserver.service
[Unit]
Description=Distrobox Container: dbserver
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/podman start dbserver
ExecStop=/usr/bin/podman stop dbserver
RemainAfterExit=yes
[Install]
WantedBy=default.target# 启用服务
systemctl --user enable distrobox-dbserver.service
systemctl --user start distrobox-dbserver.serviceInit 容器的限制
- 部分 systemd 功能(如
PrivateTmp、ProtectSystem)需要额外权限,可能在容器内失败systemctl操作需要 root 或--usermode,rootless --init 容器也可用 guest sudo 管理容器内 system services;宿主 user unit 与 guest system unit 是不同层次- 某些需要内核模块的 systemd 单元(如
systemd-networkd)通常无法在容器内工作
2.4 典型应用场景
| 场景 | 示例 |
|---|---|
| 本地 Web 开发栈 | nginx + php-fpm + mariadb,全部在一个 init 容器内 |
| CI 模拟环境 | GitLab Runner / Jenkins agent 在容器内,通过 systemd 管理 |
| 数据库服务 | PostgreSQL / MySQL 作为常驻服务,宿主机通过 socket 连接 |
| 消息队列 | Redis / RabbitMQ 在 init 容器内运行 |
| 虚拟化宿主 | libvirt/QEMU 在容器内管理虚拟机(见第 5 节) |
3. GPU 加速与硬件直通#
3.1 NVIDIA GPU
NVIDIA GPU 直通是 Distrobox 最成熟的 GPU 加速方案,--nvidia 尝试集成宿主驱动;CDI 是另一条路径,需要 NVIDIA Container Toolkit 生成可用 CDI 配置。
# 方式一:使用 --nvidia flag(推荐)
distrobox create --name cuda-dev \
--image nvidia/cuda:12.0-devel-ubuntu22.04 \
--nvidia \
--additional-packages "python3 python3-pip cmake"
# 方式二:通过 --additional-flags 手动指定
distrobox create --name ml-workspace \
--image pytorch/pytorch:2.0-cuda11.7-cudnn8-devel \
--additional-flags "--device nvidia.com/gpu=all" \
--additional-packages "jupyter python3-pip"验证 GPU 是否可用:
# 进入容器后执行
distrobox enter cuda-dev
# NVIDIA 官方工具
nvidia-smi
# 应显示 GPU 型号、驱动版本、CUDA 版本
# OpenGL 验证
glxinfo | grep "OpenGL renderer"
# 应显示 NVIDIA 相关信息
# CUDA 可用性测试
python3 -c "import torch; print(torch.cuda.is_available())"NVIDIA 前置条件需要分层验证:宿主驱动正常、容器设备可见、用户空间驱动库匹配、CUDA/框架版本兼容。CDI 示例要求先依照 NVIDIA 官方文档配置 toolkit/CDI;--nvidia 并不普遍以 toolkit 为必需依赖。nvidia-smi 可用也不代表已完成 Torch 计算验证,上面的 Torch 测试还要求先安装兼容的 PyTorch。
3.2 AMD / Intel GPU
AMD 和 Intel GPU 的直通相对简单,因为开源驱动(Mesa)直接通过宿主设备共享到容器:
# AMD ROCm(AI/ML 计算)
distrobox create --name rocm-dev \
--image rocm/dev-ubuntu-22.04:latest \
--additional-flags "--device /dev/kfd --device /dev/dri" \
--additional-packages "rocm-libs miopen-hip rocblas"
# Intel GPU(QSV 编解码 / OpenCL)
distrobox create --name intel-gpu \
--image ubuntu:22.04 \
--additional-flags "--device /dev/dri" \
--additional-packages "intel-media-va-driver intel-opencl-icd"验证 AMD GPU:
# OpenGL
glxinfo | grep "OpenGL renderer"
# ROCm
rocm-smi
# 应显示 AMD GPU 信息
# Vulkan
vulkaninfo | grep "deviceName"Wayland / X11 图形加速 Distrobox 默认自动共享宿主机的 Wayland socket (
$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY) 和 X11 socket (/tmp/.X11-unix),因此 socket 集成只解决显示连接;图形加速还需 guest 图形库、设备权限和驱动兼容,ROCm/oneAPI 支持尤其需核对具体硬件。
3.3 GPU 支持对比总览
| GPU 厂商 | 计算加速 | 图形加速 | 额外配置 |
|---|---|---|---|
| NVIDIA | CUDA, cuDNN, TensorRT | GLX/EGL(匹配宿主驱动库) | --nvidia 或 --device nvidia.com/gpu=all |
| AMD | ROCm, HIP, OpenCL | Mesa(自动共享 /dev/dri) | 设备权限 + 受支持硬件/ROCm 版本 |
| Intel | oneAPI, OpenCL | Mesa(自动共享 /dev/dri) | 设备权限 + 兼容 oneAPI/OpenCL 运行时 |
4. 多容器协作模式#
4.1 默认隔离与共享语义
Distrobox 容器的默认行为奠定了协作基础:
| 资源 | 默认行为 | 含义 |
|---|---|---|
| $HOME | 共享(bind mount) | 所有容器看到同一份家目录,天然文件共享 |
| 网络 | 共享宿主机网络栈 | 容器间通过 localhost 直接通信 |
| 进程 | 普通容器默认共享 PID;--init/--unshare-process 独立 | ps aux 能看到宿主和所有容器的进程 |
| 显示 | 共享 X11/Wayland socket | 任何容器的 GUI 应用可直接显示在宿主桌面 |
| 音频 | 共享 PulseAudio/PipeWire socket | 容器应用可直接播放声音 |
4.2 三种经典协作模式
graph TB
subgraph Host["宿主机 Host OS"]
HOME["/home/$USER (共享)"]
DISPLAY["X11/Wayland Display"]
NET["Host Network Stack"]
PULSE["PulseAudio / PipeWire"]
end
subgraph Pattern1["模式一:Dev 容器 + Service 容器"]
DEV["dev-box<br/>Arch Linux<br/>neovim / tmux / git"]
DB["db-box<br/>Ubuntu 22.04 --init<br/>PostgreSQL :5432<br/>Redis :6379"]
DEV -->|"localhost:5432"| DB
end
subgraph Pattern2["模式二:按发行版分工"]
AUR["aur-box<br/>Arch Linux<br/>yay / AUR packages"]
APT["deb-box<br/>Ubuntu<br/>apt packages"]
COPR["rpm-box<br/>Fedora<br/>copr / dnf packages"]
end
subgraph Pattern3["模式三:按项目隔离构建环境"]
PROJ1["proj-alpha<br/>gcc-12 / cmake-3.25"]
PROJ2["proj-beta<br/>clang-16 / bazel-6"]
PROJ3["proj-gamma<br/>rustc-1.78 / cargo"]
end
HOME --> DEV
HOME --> DB
HOME --> AUR
HOME --> APT
HOME --> COPR
HOME --> PROJ1
HOME --> PROJ2
HOME --> PROJ3
DISPLAY --> DEV
DISPLAY --> AUR
DISPLAY --> APT
DISPLAY --> COPR
NET --> DEV
NET --> DB
NET --> AUR
NET --> APT
NET --> COPR
NET --> PROJ1
NET --> PROJ2
NET --> PROJ3
PULSE --> DEV
PULSE --> AUR模式一:Dev 容器 + Service 容器
将一个 init 容器专用于运行后台服务(数据库、缓存、消息队列),另一个容器用于开发编辑,二者通过 localhost 通信:
# 创建服务容器(init,后台运行 PostgreSQL 和 Redis)
distrobox create --name svc-stack --image ubuntu:22.04 --init \
--additional-packages "postgresql redis-server systemd" \
--init-hooks "systemctl enable postgresql && systemctl enable redis-server"
# 创建开发容器(轻量,装编辑器/工具链)
distrobox create --name dev-box --image archlinux:latest \
--additional-packages "neovim git tmux nodejs python"
# 开发时
distrobox enter dev-box
# 在 dev-box 内通过 localhost:5432 连接 svc-stack 的 PostgreSQL
psql -h localhost -U postgres模式二:按发行版分工
不同发行版擅长的领域不同,可以为每种"包管理器生态"建立独立容器:
# Arch Linux:AUR 天堂
distrobox create --name aur-box --image archlinux:latest \
--additional-packages "base-devel git"
# 首次进入后,审查 AUR PKGBUILD,以普通 guest 用户构建 yay/paru
# Ubuntu:Deb 生态与企业软件
distrobox create --name deb-box --image ubuntu:22.04 \
--additional-packages "software-properties-common"
# Fedora:Copr 与前沿 RPM
distrobox create --name rpm-box --image fedora:41 \
--additional-packages "dnf-plugins-core"模式三:按项目隔离构建环境
按项目分离包环境可减少版本冲突,但固定版本包必须在所选仓库中实际存在;以下名称与版本表达式仅展示意图,不能保证历史仓库仍提供这些包:
# 项目 A:GCC 12 + CMake 3.25
distrobox create --name proj-alpha --image ubuntu:22.04 \
--additional-packages "gcc-12 g++-12 cmake=3.25*"
# 项目 B:Clang 16 + Bazel 6
distrobox create --name proj-beta --image fedora:41 \
--additional-packages "clang16 lld bazel6"
# 项目 C:Rust nightly
distrobox create --name proj-gamma --image archlinux:latest \
--additional-packages "rustup"
# 进容器后
rustup default nightly容器间共享环境变量 因为
$HOME共享,你可以将公共环境变量写入~/.profile或~/.bashrc,所有容器都能读取。Distrobox 不会自动把任意*.conf当逐容器配置读取;可在 hooks、实际支持的后端参数或 shell 的 CONTAINER_ID 分支中显式设置。
5. 特殊场景#
5.1 在 Distrobox 中运行完整桌面环境(DE)
可以在容器中运行最新的 GNOME / KDE Plasma / Hyprland,以 display manager 会话的方式登录:
# 创建 init 容器(必须有 systemd)
distrobox create --name fedora-rawhide \
--init \
--additional-packages "systemd" \
--image registry.fedoraproject.org/fedora:rawhide
distrobox enter fedora-rawhide
# 安装 GNOME
sudo dnf group install gnome-desktop
# 安装 KDE Plasma
# sudo dnf group install kde在宿主机上创建 display manager 会话入口(以 GNOME 为例):
# /usr/local/share/wayland-sessions/distrobox-gnome.desktop
[Desktop Entry]
Name=GNOME on Wayland (distrobox fedora-rawhide)
Comment=This session logs you into GNOME in a Distrobox container
Exec=/usr/local/bin/distrobox-enter -n fedora-rawhide -- /usr/bin/gnome-session
Type=Application
DesktopNames=GNOME
X-GDM-SessionRegisters=true不要通过递归 chown /tmp/.X11-unix 修复桌面会话;它是宿主 X server 管理的共享目录。应检查 DISPLAY、XAUTHORITY、实际 socket 权限与 display manager 日志,优先使用宿主会话的正确授权。以上入口的 distrobox-enter 路径需替换为本机 command -v distrobox-enter 的结果,NixOS 路径由声明式配置提供。
实验性支持 在容器内运行完整 DE 是实验性特性。部分 DE 组件(如蓝牙、电源管理、Wi-Fi 面板)依赖宿主级 dbus 或硬件访问,可能不可用。不推荐在关键生产环境使用。
5.2 在 Distrobox 中运行 libvirt/QEMU 虚拟化
以下是一个需要较高权限的 libvirt system 连接方案,须先准备 /dev/kvm 权限、guest 包和服务。qemu session 等其他方案并不都需要 rootful;--unshare-all 也不会撤销所有宿主文件共享:
distrobox create --name libvirtd \
--root \
--init \
--unshare-all \
--image registry.opensuse.org/opensuse/distrobox:latest \
--additional-flags "-p 2222:22" \
--init-hooks "zypper in -y --no-recommends openssh-server \
patterns-server-kvm_server patterns-server-kvm_tools \
qemu-arm qemu-ppc qemu-s390x qemu-extra && \
systemctl enable sshd.service && \
systemctl enable virtqemud.socket virtnetworkd.socket \
virtstoraged.socket virtnodedevd.socket && \
usermod -aG libvirt \$USER" \
--additional-packages "virt-manager"
# 导出 virt-manager 到宿主机应用菜单
distrobox enter --root libvirtd -- distrobox-export --app virt-manager对应的 assemble manifest:
[libvirt]
image=registry.opensuse.org/opensuse/distrobox:latest
pull=true
init=true
root=true
unshare_all=true
additional_flags="-p 2222:22"
exported_apps="virt-manager"qemu:///session vs qemu:///system rootful 容器内
qemu:///system可能遇到/dev/ptmx冲突(Issue # 1129)。若遇到此问题,使用qemu:///session级别通常可以绕过。
5.3 Steam Deck / SteamOS
SteamOS 根文件系统是只读的(A/B 更新机制),Distrobox 是安装额外软件的首选方案:
# SteamOS 图形访问依赖实际桌面会话,先检查 DISPLAY/XAUTHORITY
# 不要把无条件 xhost 放入每次读取的配置文件
distrobox create --name arch-extras \
--image docker.io/archlinux:latest \
--additional-packages "firefox vlc gimp"
# 导出到宿主应用菜单;Steam Game Mode 另需手动添加非 Steam 游戏入口
distrobox enter arch-extras -- distrobox-export --app firefoxSteam Deck 用户常用 Distrobox 安装:
- 桌面应用(Firefox、VLC、LibreOffice)
- 开发工具(VS Code、Go、Rust toolchain)
- 系统工具(htop、neofetch、rsync)
- 模拟器(通过 RetroArch flatpak 或原生安装)
5.4 ChromeOS (Crostini) 环境
在 ChromeOS 的 Linux 开发环境(Crostini)中,Distrobox 可以在默认的 Debian 容器内再嵌套其他发行版:
# ChromeOS 先启用 Linux 开发环境(设置 > 开发者 > Linux)
# 默认得到 Debian 容器,在其中安装 distrobox
sudo apt update && sudo apt install podman distrobox
# 再套一层 Arch / Ubuntu / Fedora
distrobox create --name arch-on-chromeos --image archlinux:latest
distrobox enter arch-on-chromeos5.5 immutable OS(Fedora Silverblue / Kinoite / openSUSE MicroOS)
不可变发行版是 Distrobox 的最佳搭档:
# 在 Silverblue 上无需 rpm-ostree layer,直接用容器
distrobox create --name toolbox \
--image registry.fedoraproject.org/fedora-toolbox:41 \
--additional-packages "gcc gcc-c++ make git neovim"
# 日常使用就进容器
distrobox enter toolbox不可变 OS 用户的典型容器划分:
| 容器名 | 镜像 | 用途 |
|---|---|---|
toolbox |
fedora-toolbox | 日常 CLI 工具、编译 |
aur |
archlinux | AUR 包(如 paru、yay) |
ubuntu-dev |
ubuntu:22.04 | 特定版本 lib 依赖的项目构建 |
ml-gpu |
nvidia/cuda | GPU 加速的 AI/ML 训练 |
6. 容器生命周期自动化#
6.1 自动更新全部容器
通过 systemd timer 周期升级所有容器内的包,先确认可接受自动变更并有备份。路径是传统发行版示例,NixOS 用配置生成的 store/profile 路径。升级日志保留在 journal,失败应查看 unit 状态:
# ~/.config/systemd/user/distrobox-upgrade.service
[Unit]
Description=distrobox-upgrade: Automatic Container Update
[Service]
Type=oneshot
ExecStart=/usr/bin/distrobox-upgrade --all
# ~/.config/systemd/user/distrobox-upgrade.timer
[Unit]
Description=distrobox-upgrade: Weekly Update Trigger
[Timer]
OnCalendar=weekly
Persistent=true
[Install]
WantedBy=timers.targetsystemctl --user daemon-reload
systemctl --user enable distrobox-upgrade.timer
systemctl --user start distrobox-upgrade.timer6.2 Podman Quadlet 与 assemble 的边界
Podman Quadlet 从声明式 .container 文件生成 systemd 单元,但不会自动重建 Distrobox 的 guest 初始化、挂载和导出流程。不能只写 Exec=distrobox-init 就认为得到等价的 Distrobox。以下是独立的普通 Podman 开发容器示例,使用前创建 projects 目录,并查已安装 Podman 版本支持的 Quadlet 字段:
# ~/.config/containers/systemd/plain-dev.container
[Container]
Image=docker.io/library/alpine:latest
ContainerName=plain-dev
Volume=%h/projects:/projects
WorkingDir=/projects
Exec=sleep infinity
[Service]
Restart=on-failure
[Install]
WantedBy=default.target不要把宿主 Podman graphroot ~/.local/share/containers/storage 挂载为 guest 开发目录,否则可能损坏宿主容器存储。Quadlet 的生成单元在 daemon-reload 后由 systemd 管理,具体启动与日志检查按官方文档进行。
assemble 还是 Quadlets?
- assemble:专为 Distrobox 设计,自动处理 HOME 共享、显示转发、包安装和导出,减少重复配置
- Quadlet:Podman 原生方案,控制粒度更细;若要求 Distrobox 体验,需自行完整实现其契约
关键要点总结#
你应该掌握的
distrobox.inimanifest 的完整字段集及assemble create/rm 与 distrobox list命令--init容器的生命周期、init hooks 时机和 systemd 服务联动- NVIDIA / AMD / Intel 三种 GPU 直通方案的区别与验证方法
- 三种多容器协作模式(Dev+Service / 按发行版分工 / 按项目隔离)
- 桌面环境、libvirt、Steam Deck / ChromeOS / immutable OS 等特殊场景的基本命令
参考与延伸
- Distrobox security implications ↗
- Distrobox create ↗
- Distrobox enter ↗
- Distrobox assemble ↗
- Podman Quadlet ↗
- NVIDIA CDI ↗
根据技术笔记重新整理,示例使用通用名称。