Use Toolbox

Toolbox lets you create and enter mutable container environments on Fedora Silverblue or any Fedora system, giving you a full development shell without modifying the host OS.

The scenario

You just installed Fedora Silverblue or you are running a clean Workstation setup. You try to compile a C project or install a Node.js package globally. The package manager refuses to touch the base system. On Silverblue, the root filesystem is read-only by design. On Workstation, you want to keep the host pristine for daily driving. You need a place to run sudo dnf install gcc without breaking your desktop. You open a terminal and type toolbox create. The command hangs or fails with a podman error. You need to understand what Toolbox actually does, how to configure it correctly, and how to keep it from fighting your host system.

What is actually happening

Toolbox wraps Podman in a thin CLI layer that automates container lifecycle management. It does not virtualize your hardware. It creates a lightweight Linux container that shares your host kernel, network stack, and user namespace. The container mounts your home directory directly into /home/youruser. When you run toolbox enter, you are not SSHing into a remote server. You are dropping into a shell that lives on your machine but operates in an isolated filesystem namespace.

Think of it like a dedicated workbench bolted to your main desk. The workbench has its own tools, its own clutter, and its own power strip. Your main desk stays clean. When you need a file from your main desk, you just reach over. When you finish work, you wipe the bench. The underlying floor and walls never change.

This isolation matters because Fedora updates the host system independently. Your toolbox container keeps its own package versions. You can run Fedora 40 tools on a Fedora 42 host, or vice versa. The container does not inherit host updates automatically. You control when it changes. Run dnf upgrade --refresh inside the container when you want to pull new packages. Run it on the host when you want to update your desktop. They are separate transactions.

The home directory mount is a bind mount, not a copy. Your dotfiles, project directories, and configuration files live on the host filesystem. The container sees them through a transparent bridge. This means your ~/.bashrc and ~/.config directories are shared. If you modify a config file inside the container, the host sees it immediately. If you modify it on the host, the container sees it immediately. This shared state is intentional. It keeps your development environment consistent across sessions.

Setting up and entering a toolbox

On standard Fedora Workstation, Toolbox is not installed by default. You need to pull it from the repositories first. Run this command to install the CLI and its Podman backend:

sudo dnf install -y toolbox
# WHY: pulls the toolbox CLI and podman package from the default repositories
# WHY: -y skips the confirmation prompt so the command runs non-interactively

Once installed, create your first container. The default behavior matches your host Fedora release. This keeps package compatibility predictable and reduces dependency conflicts.

toolbox create
# WHY: downloads the fedora-toolbox image matching your current host release
# WHY: sets up the container filesystem and configures the home directory mount

Enter the container immediately after creation. The command drops you into a rootless shell inside the container. Your prompt changes to reflect the container name.

toolbox enter
# WHY: starts the podman container and attaches your terminal to its bash session
# WHY: preserves your current working directory so you do not lose your place

If you need a different Fedora release for legacy software or testing, specify the release and a custom container name. This prevents naming collisions when you run multiple environments side by side.

toolbox create --release 40 --container fedora40-legacy
# WHY: pulls the older base image instead of matching the host release
# WHY: assigns a custom name so you can target it explicitly later
toolbox enter fedora40-legacy
# WHY: starts the specific container you just named

Inside the container, you have full package manager access. Install compilers, language runtimes, or development libraries without touching the host system.

sudo dnf install -y gcc make python3-devel nodejs
# WHY: runs dnf inside the container namespace, not on the host
# WHY: -y accepts the transaction automatically for scripting or quick setup

Reboot before you debug. Half the time the symptom is gone.

Managing your containers

You will accumulate containers over time. Old projects leave behind unused toolboxes that consume disk space. List everything currently registered with Podman to see what is taking up room.

toolbox list
# WHY: queries podman for all containers matching the toolbox naming convention
# WHY: shows container name, image, and creation date for quick auditing

Stop a running container when you are done with a session. This frees up the shell process and pauses background tasks, but keeps the filesystem intact for your next session.

toolbox stop fedora40-legacy
# WHY: sends a graceful shutdown signal to the container init process
# WHY: preserves all installed packages and modified files inside the container

Remove a container when the project is finished or the environment is broken. This deletes the container layer and reclaims disk space. Your home directory files remain untouched because they live on the host.

toolbox rm fedora40-legacy
# WHY: removes the container metadata and writable layer from podman storage
# WHY: does not delete your actual home directory files or host configurations

Run toolbox list first. Read the actual error before guessing.

Verify it worked

Confirm the container is running and isolated. Check the process tree from inside the container to verify you are in a separate PID namespace.

toolbox enter
# WHY: drops you into the active container shell
ps aux | head
# WHY: shows processes running inside the container namespace
# WHY: confirms you only see container-local daemons and your shell

Check the filesystem mount points to ensure your home directory is correctly bridged. This is the mechanism that makes your dotfiles and projects immediately available.

findmnt /home
# WHY: displays the mount source and target for your home directory
# WHY: verifies the bind mount is active and pointing to the host path

Verify package isolation by checking a tool that exists in the container but not on the host. This proves the environment is truly separate.

which gcc
# WHY: locates the compiler binary inside the container filesystem
# WHY: confirms the path points to /usr/bin/gcc inside the container, not the host
exit
# WHY: returns you to the host shell to compare environments
which gcc
# WHY: should return nothing or a different path if gcc is not installed on the host

Snapshot the system before the upgrade. Future-you will thank you.

Common pitfalls and error messages

Toolbox relies on Podman, which requires a running container runtime and proper user namespace configuration. If your host lacks the necessary kernel parameters or if another container tool is interfering, you will see failures.

The most common issue is a missing or misconfigured storage driver. Podman defaults to overlay on Fedora, which requires the fuse-overlayfs package. If you see this error, install the missing driver before creating a container.

Error: creating container storage: initializing graphdriver: driver not supported: overlay

Fix it by installing the FUSE overlay filesystem package and restarting your session.

sudo dnf install -y fuse-overlayfs
# WHY: provides the userspace overlay filesystem driver required by podman
# WHY: resolves the storage initialization failure for rootless containers

Another frequent problem is network conflicts. Toolbox shares the host network namespace by default. If you are running a local proxy, firewall rule, or VPN client that binds to 0.0.0.0, the container may fail to reach external repositories. Check your host firewall configuration and ensure outbound traffic is allowed. Always run firewall-cmd --reload after changing rules. Otherwise the runtime config and the persistent config diverge.

firewall-cmd --list-all
# WHY: displays active zones, services, and port rules on the host
# WHY: helps identify rules that might block container network traffic

SELinux denials occasionally surface when Toolbox tries to mount directories or access host sockets. The container runs with a specific SELinux context that allows most operations. If you see an AVC denial in the journal, do not disable SELinux. Adjust the policy or check your home directory permissions. Use journalctl -xe to read the actual error before guessing. The x flag adds explanatory text and the e flag jumps to the end.

journalctl -t setroubleshoot | tail -n 20
# WHY: filters the journal for SELinux troubleshooting messages
# WHY: shows the one-line summary that explains what was blocked and why

Config files in /etc/ are user-modified. Files in /usr/lib/ ship with the package. Edit /etc/. Never edit /usr/lib/. This rule applies inside the container just as it does on the host.

Trust the package manager. Manual file edits drift, snapshots stay.

When to use Toolbox versus alternatives

Use Toolbox when you want a Fedora-native container that shares your host network and home directory without extra configuration. Use Distrobox when you need to run Ubuntu, Arch, or Alpine containers on Fedora and want automatic host integration for GUI apps. Use a full virtual machine when you need hardware virtualization, a different kernel, or complete network isolation. Stay on the host system when you only need a single package and do not want container overhead.

Where to go next