The command interfaces in this article were checked against the official Distrobox 1.8.2.5 scripts. Image tags and distribution package names are examples; before use, confirm that the image is still supported, its repositories are available, and the versions match your machine. The examples have not been tested by running them.
TL;DR Distrobox is a set of POSIX Shell scripts that wraps OCI container runtimes such as Podman and Docker, letting you use the user-space environments of supported Linux distributions on immutable distributions such as Fedora Silverblue, SteamOS, and Vanilla OS. Whereas conventional containers emphasize isolation, Distrobox aims for deep integration with the host: the HOME directory, GPU, audio, USB devices, and D-Bus are integrated automatically, subject to the backend, session, and device environment.
1. Why use Distrobox?#
1.1 The problem: the “walled gardens” of traditional Linux package management
Each Linux distribution is a “walled garden”: AUR (Arch) users want to use Ubuntu PPAs, Fedora COPR users need packages from aur.chaotic.cx, and Steam Deck users want to install development toolchains on immutable SteamOS. Within these walls, the following requirements inherently clash:
| Need | Traditional approach | Pain point |
|---|---|---|
Install yay on Fedora Silverblue |
Layer packages onto the system with rpm-ostree |
The system layer needs maintenance, and the RPM layer cannot directly install Arch AUR packages |
| Run an Ubuntu-specific ROS version on Arch | Set up LXC/chroot manually | Network, D-Bus, sound, and other integration must be configured manually |
| Develop on an immutable distribution | Flatpak SDK / VM | Flatpak lacks CLI toolchains; VMs have high overhead |
| Test how software behaves on different distros | Run docker run manually with numerous mount arguments |
10+ arguments, with a trip to the documentation every time |
Distrobox was designed to address precisely these scenarios.
1.2 Distrobox’s design philosophy
The official project describes Distrobox as a user-space integration tool built on existing container backends: it runs other distributions’ environments through Podman, Docker, or Lilipod and connects them to host files and desktop resources.
The core idea in one sentence: containers are for integration, rather than isolation.
Conventional containers (Docker/Podman) default to isolation from the host: files, network ports, and devices must each be explicitly mapped in. Distrobox takes the opposite approach, sharing multiple host resources by default to turn the container into a “transparent” user-space overlay.
flowchart LR
A["Host OS<br/>(不可变 / 任意发行版)"]
B["Distrobox CLI<br/>(POSIX Shell)"]
C["OCI Runtime<br/>(Podman / Docker / Lilipod)"]
D["Guest Container<br/>(Ubuntu 24.04)"]
E["Host Integration"]
F["HOME 目录<br/>X11/Wayland<br/>PipeWire/PulseAudio<br/>D-Bus / SSH Agent<br/>GPU / USB / udev<br/>Network"]
A --> B --> C --> D
D --> E --> F
style D fill:#2d6,stroke:#333
style E fill:#da0,stroke:#333
style F fill:#28f,stroke:#333,color:#fff1.3 Comparing alternatives
| Tool | Purpose | Isolation | Host integration | Distribution support |
|---|---|---|---|---|
| Distrobox | User-space integration layer | Very low (deliberate sharing) | Automatic HOME and desktop resource integration; GPU requires compatible drivers | Compatible OCI user-space images |
| Toolbox | Fedora development environment | Low | Automatic integration, with support for multiple hosts | Multiple supported distributions |
| Flatpak | GUI application sandbox | High (sandbox) | Low (permissions must be granted explicitly) | Cross-distribution, primarily for application delivery |
| Podman run | General-purpose container execution | Medium (isolated by default) | Everything must be mounted manually | Compatible OCI user-space images |
| Docker | Running microservices | Depends on permissions and mount configuration | Very low (root daemon) | Compatible OCI user-space images |
| QEMU/KVM VM | Full virtualization | A separate kernel boundary | Sharing must be configured | Any OS |
| chroot / LXC | System containers | Low | Moderate (manual configuration) | Same kernel family |
Toolbx is also based on Podman and already supports multiple distributions and host environments; it cannot accurately be described as “Fedora only.” Distrobox differs more in backend choices, application export, assemble manifests, and initialization. Consult both projects’ compatibility lists when comparing them.
2. Architecture overview#
2.1 The overall layers
Distrobox is not “a new container engine,” but a user-friendly wrapper around OCI runtimes. Written in POSIX Shell (compatible with bash/dash/ash/zsh), it requires a working POSIX /bin/sh, needs no language runtime, and adds no extra runtime dependencies.
flowchart TD
subgraph "Host Userspace"
CLI["distrobox CLI<br/>(distrobox 入口与独立辅助脚本)"]
MOUNT["Host Integration Layer<br/>自动挂载/转发"]
subgraph "共享资源(自动配置)"
HOME_HOST["🏠 HOME 目录 (rw)"]
GFX["🎨 X11 / Wayland socket"]
AUDIO["🔊 PipeWire / PulseAudio socket"]
DBUS["🔗 D-Bus session bus"]
SSH_A["🔑 SSH agent socket"]
GPU["🎮 GPU device nodes (/dev/dri)"]
USB["💾 udev / removable devices"]
NET["🌐 宿主机网络 (host network)"]
ULIMIT["⚙️ ulimits / tty 共享"]
end
end
subgraph "Container Runtime"
PODMAN["Podman (推荐, rootless)"]
DOCKER["Docker (备选, rootful by default)"]
LILIPOD["Lilipod (轻量, 实验性)"]
end
subgraph "Guest Containers"
C1["container: ubuntu:24.04<br/>HOME → 共享<br/>GPU → 可访问<br/>pipewire → 可播放"]
C2["container: archlinux:latest<br/>HOME → 共享<br/>GPU → 可访问<br/>pipewire → 可播放"]
end
CLI --> PODMAN
CLI --> DOCKER
CLI --> LILIPOD
PODMAN --> C1
PODMAN --> C2
MOUNT -.- C1
MOUNT -.- C2
HOME_HOST -.- C1 & C2
GFX -.- C1 & C2
AUDIO -.- C1 & C2
DBUS -.- C1 & C2
SSH_A -.- C1 & C2
GPU -.- C1 & C2
USB -.- C1 & C2
NET -.- C1 & C2
ULIMIT -.- C1 & C2
style CLI fill:#e90,stroke:#333,color:#fff
style PODMAN fill:#06c,stroke:#333,color:#fff2.2 Why POSIX Shell?
Portability first All of Distrobox’s logic is written in POSIX Shell, with no dependency on a Python/Ruby/Go runtime. This means it can run on Alpine Linux’s
busybox ashor Ubuntu’sdash(/bin/sh) without an additional language runtime; a backend and common system utilities are still dependencies.
In the official source, each function is implemented as a separate script, and the main distrobox entry point forwards supported subcommands to scripts in the same directory. They are not all symbolic links to one file, nor are they all implemented by branching on $0.
distrobox 主入口与命令分发
distrobox-create 创建与挂载配置
distrobox-enter 启动、初始化与进入
distrobox-list / stop / rm 生命周期操作
distrobox-upgrade 发行版包升级
distrobox-assemble INI 清单处理
distrobox-export 在容器内生成宿主 app/bin 入口
distrobox-host-exec 从容器调用宿主命令
distrobox-ephemeral 临时容器流程
distrobox-generate-entry 容器终端入口
distrobox-init 容器内部初始化Installation paths vary with the distribution and installation prefix. Use command -v distrobox, file, and readlink to inspect the actual installation. The list above illustrates the structure; it is not captured command output.
2.3 Host integration (automatically configured resources)
This is the central difference between Distrobox and conventional containers. The following are the default integration mechanisms, still subject to session, backend, permission, and device support, and are configured automatically by distrobox-create:
| Resource | Implementation | Result |
|---|---|---|
| HOME directory | --volume /home/user:/home/user:rslave |
The container can directly read and write the host HOME |
| X11 | Mounts /tmp/.X11-unix and sets $DISPLAY |
GUI programs appear directly on the host screen |
| Wayland | Mounts $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY |
Native Wayland rendering |
| PipeWire / PulseAudio | Mounts sockets and sets environment variables | Audio playback and recording inside the container |
| D-Bus | Mounts the session bus socket | Connects to the host session bus; individual applications still need to be compatible |
| SSH Agent | Mounts the $SSH_AUTH_SOCK socket |
Can use SSH credentials already loaded on the host, which also broadens the trust boundary |
| GPU (/dev/dri) | Mounts /dev/dri render nodes |
GPU acceleration inside the container (OpenGL/Vulkan) |
| USB / removable | Mounts /run/media, /mnt, and /media |
Access to USB drives and external hard drives inside the container |
| Networking | --network host |
The container shares the host’s network stack |
| udev | Mounts /run/udev |
Device event notifications work normally |
| systemd journal | Mounts the journal socket | Logs are written to the host’s journald |
| ulimits | --ulimit host |
Inherits host limits and remains subject to cgroup and system limits |
The security implications of sharing HOME Because HOME is shared with read/write access, programs inside the container can freely modify your configuration files (
~/.bashrc,~/.config/, and so on). This is a design trade-off: convenience > isolation.distrobox-ephemeralalso shares host resources and cannot serve as a secure sandbox for untrusted code. Such testing requires a separately designed restricted Podman container or virtual machine, with sharing of home, desktop sockets, devices, credentials, and similar resources disabled. Rootless mode only reduces privileges; it does not prevent changes to the user’s own files.
3. A closer comparison with similar tools#
3.1 Distrobox vs Toolbox
The two tools are essentially built on the same idea: using OCI containers as development environments. Their differences are:
| Dimension | Distrobox | Toolbox |
|---|---|---|
| Original purpose | Make any distro your user space | Enable CLI tool installation on Fedora Silverblue |
| Default backend | Podman (recommended) or Docker | Podman only |
| Distribution support | Any OCI image (Ubuntu/Arch/Alpine/...) | Supports images from multiple distributions |
| pre-init hook | Supported | Not supported |
| Multiple init systems | Can use systemd, OpenRC, and others, depending on image and initialization compatibility | systemd only |
| Application export | distrobox-export exports .desktop files and binaries to the host |
toolbox run invokes commands from the host |
| Manifest management (assemble) | Batch creation from INI manifests; not a plugin system | None |
3.2 Distrobox vs Flatpak
Flatpak and Distrobox solve problems at different levels:
- Flatpak: provides a sandboxed environment for GUI applications. Applications request permissions through the Portal API, and the host system recognizes them as “Flatpak applications.”
- Distrobox: provides a complete user space for CLI users. Tools installed inside the container with
apt installordnf installbehave as if they were installed natively.
They complement each other more than they compete. A common combination is to use Distrobox for development environments and Flatpak for GUI applications such as GIMP and Blender.
3.3 Distrobox vs. plain podman run
Comparing commands for the same goal, “run a GUI program with GPU support inside an Ubuntu container,” using the two approaches:
# ========== 纯 podman run(你要手动写所有参数)==========
podman run --rm -it \
--name my-ubuntu \
--hostname my-ubuntu \
--network host \
--volume /home/user:/home/user:rslave \
--volume /tmp/.X11-unix:/tmp/.X11-unix:ro \
--volume $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY \
--volume $XDG_RUNTIME_DIR/pipewire-0:$XDG_RUNTIME_DIR/pipewire-0 \
--volume /dev/dri:/dev/dri \
--volume /run/udev:/run/udev:ro \
--env DISPLAY=$DISPLAY \
--env WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
--env XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
--security-opt label=disable \
--ulimit host \
docker.io/library/ubuntu:24.04 \
/bin/bash
# ========== Distrobox(全自动)==========
distrobox create --name my-ubuntu --image ubuntu:24.04
distrobox enter my-ubuntuRemember this formula
distrobox-create=podman create+ default host integration arguments + init system detection + user creation + package manager configuration.
3.4 Distrobox vs VM
| Dimension | Distrobox | QEMU/KVM VM |
|---|---|---|
| Kernel | Shares the host kernel | Independent kernel |
| Startup speed | Usually fast, excluding first-time initialization | Depends on the guest, storage, and hardware |
| Memory overhead | Mainly the container processes | Requires allocating guest memory |
| GPU sharing | Native (render nodes on the same kernel) | Requires GPU passthrough / virtio-gpu |
| Use cases | Development, CLI tools, GUI applications | Running a different kernel, running Windows, and tests that require a separate kernel; sharing and device configuration still affect security |
4. Core concepts at a glance#
4.1 Container vs Image
- Image: a read-only filesystem template. For example,
ubuntu:24.04is a tarball containing the Ubuntu 24.04 base filesystem. - Container: a runnable instance of an image. It adds a writable layer on top of the image and runs processes. Each environment created by Distrobox is a container.
- Key point: a container is not a lightweight VM. It neither virtualizes hardware nor boots its own kernel; it simply uses Linux namespaces and cgroups to isolate process views. Distrobox goes further and removes most namespace isolation (network, IPC, PID, and so on), letting processes inside the container almost “see through” to the host.
4.2 Main commands and helper scripts
| Command | Function | Typical usage |
|---|---|---|
distrobox-create |
Create a new container | distrobox create -n arch -i archlinux:latest |
distrobox-enter |
Enter the container’s shell | distrobox enter arch |
distrobox-list |
List all containers | distrobox list |
distrobox-stop |
Stop a running container | distrobox stop arch |
distrobox-rm |
Remove a container | distrobox rm arch |
distrobox-upgrade |
Upgrade all packages inside a container | distrobox upgrade arch |
distrobox-export |
Export applications/binaries to the host | distrobox-export --app firefox |
distrobox-host-exec |
Run host commands from inside a container | distrobox-host-exec flatpak run md.obsidian.Obsidian |
distrobox-ephemeral |
Create a disposable temporary container | distrobox ephemeral -i alpine:edge |
distrobox-assemble |
Manage containers declaratively in batches | distrobox assemble create --file ./distrobox.ini |
distrobox-generate-entry |
Generate a shortcut for entering a container | distrobox generate-entry arch |
distrobox-init |
Initialize the container internally (users usually do not need to call this directly) | Triggered by the initialization process on first entry |
4.3 Rootless mode and trust boundaries
Podman can run as an ordinary user; Docker also has a rootless mode, so “truly rootless” is not exclusive to Podman. Distrobox generally recommends rootless Podman to reduce the backend’s host privileges.
# 在普通用户的宿主终端检查 rootless 后端
podman info --format '{{.Host.Security.Rootless}}'
podman unshare cat /proc/self/uid_map
podman unshare cat /proc/self/gid_mapThe UID shown inside a container is mapped to the host UID through a user namespace. An ordinary Podman container may differ from Distrobox’s keep-id configuration, so it is inaccurate to claim that root in every container maps to the current host user or a fixed subordinate UID. Distrobox creates a matching guest user account, and ordinary file operations usually preserve appropriate ownership; inspect the actual mapping to be sure.
A rootful backend has greater host privileges, but applications entered through Distrobox do not necessarily run as root. Rootless mode can still modify a read/write-mounted HOME, use shared sockets, or use the host execution bridge, so writing to HOME cannot be called “safe.” Run only trusted applications, and treat shared configuration and credentials as host assets.
4.4 The “enter” model: entering rather than running
Distrobox uses container runtime operations such as create/start/exec underneath, adding user initialization and host integration on top. Its core interaction model is entering:
# ❌ Docker 思维:每次跑一个命令
docker exec my-container apt install neovim
docker exec my-container nvim /home/user/code/main.py
# ✅ Distrobox 思维:进入容器,把它当成一个"shell 环境"
distrobox enter my-ubuntu
# 现在你在容器内,和宿主机的 shell 没区别:
$ sudo apt install neovim
$ nvim ~/code/main.py # HOME 共享,直接编辑宿主文件
$ firefox # GUI 应用直接显示在宿主机
$ exit # 退出回宿主机This seemingly small distinction has far-reaching effects: enter means you immerse yourself in the container as part of the host, rather than “remotely invoke a command inside a container.” This is also why Distrobox automatically sets a shell prompt prefix, so you always know which environment you are in.
# Distrobox 自动修改了容器内的 prompt:
📦[my-ubuntu] $ pwd
/home/user # ← 就是你的宿主 HOME
📦[my-ubuntu] $ cat /etc/os-release
NAME="Ubuntu"
VERSION_ID="24.04"
📦[my-ubuntu] $ exit
logout
$ pwd # 回到宿主机
/home/user4.5 Physical storage of container data
A Distrobox container is not a “single large standalone file” like a virtual machine disk image. Its data is distributed across the host filesystem. In rootless Podman mode (which must be enabled in the host configuration), the container is stored according to Podman’s storage layout:
# 查看容器存储根目录
podman info --format '{{.Store.GraphRoot}}'
# 输出通常是:/home/用户/.local/share/containers/storageflowchart LR
A["~/.local/share/containers/storage"] --> B["overlay/"]
A --> C["overlay-containers/"]
A --> D["overlay-images/"]
A --> E["volumes/"]
B --> B1["容器可写层<br/>你在容器里 pacman/apt 装的包<br/>改动都在这里"]
C --> C1["容器运行时元数据<br/>每个容器一个 hash 目录"]
D --> D1["拉取的基础镜像层<br/>arch-toolbox / ubuntu:latest"]
E --> E1["命名数据卷<br/>Distrobox 默认很少用"]| Content | Physical location |
|---|---|
Packages installed with pacman -S inside the container |
~/.local/share/containers/storage/overlay/<hash>/diff/ |
| The container’s base image (read-only layers) | Image layers under the same path |
Files you see after running cd ~ inside the container |
The host’s actual /home/用户/, with no copy |
Changes to /etc and /usr inside the container |
Written to the container’s writable overlay layer |
An intuitive summary: common overlay storage backends organize containers into layered directory trees, with the actual layout reported by podman info, rooted at ~/.local/share/containers/storage/. Meanwhile, $HOME is the “shared living room” between host and container, not part of the container’s private storage.
View the writable layer path for a specific container:
podman ps -a # 列出容器及其 hash ID
podman inspect arch --format '{{.GraphDriver.Data.UpperDir}}' # 查看可写层绝对路径Cleaning up storage (inspect usage first; the last two commands delete cached images or unused resources, so choose whether to run them only after confirming your recovery plan):
podman system df # 查看镜像/容器/卷占用
podman image prune -a # 删除未被任何容器使用的镜像
podman system prune # 综合清理Further reading
This documentation series continues with:
- 02. Installation and Configuration — installation across distributions and strategies for choosing images
- 03. Basic Usage — the complete workflow for creating, entering, and managing containers
- 04. Application Export and Integration — exporting GUI applications as host desktop entries
- 05. Advanced Workflows — in-depth GPU, audio, and D-Bus configuration
- 08. Internals and FAQ — common questions and debugging tips
References & further reading
- Distrobox security implications ↗
- Distrobox create ↗
- Distrobox enter ↗
- Distrobox compatibility ↗
- Toolbx installation and cross-distro usage ↗
- Podman rootless ↗
Adapted from technical notes. Examples use generic names.
Continue along a reading path
Distrobox: userspace, desktop integration, and recoverable environments
- 01Distrobox fundamentals: userspace and host integration
- 02Distrobox installation and backend configuration
- 03Distrobox image and container lifecycles
- 04What does Distrobox actually export?
- 05Distrobox desktop discovery and background-service integration
- 06Distrobox declarative manifests and advanced workflows
- 07Distrobox on NixOS: package environments and host paths
- 08Distrobox backups: images, package lists, and shared data
- 09Distrobox internals: packages, configuration, and command resolution