Skip to content

Troubleshooting

LabPod passwords are separate from Linux passwords. Check the LabPod credential:

Terminal window
sudo labpod admin --db /var/lib/labpod/labpod.db list-users # confirm the account exists
sudo labpod admin --db /var/lib/labpod/labpod.db set-password alice
Terminal window
# Run these as root
labpod admin --db /var/lib/labpod/labpod.db list-users # confirm the account exists
labpod admin --db /var/lib/labpod/labpod.db set-password alice

Check journald for failed-login records:

Terminal window
sudo journalctl -u labpod --since "5 minutes ago" | grep login_failed
Terminal window
# Run these as root
journalctl -u labpod --since "5 minutes ago" | grep login_failed

LabPod waits up to LABPOD_WORKSPACE_START_TIMEOUT (default 15 minutes) for podman run -d to complete. On timeout the workspace transitions to failed. To investigate while it’s still starting:

Terminal window
sudo runuser -u <owner> -- podman ps -a --filter name=labpod-ws-<id>
sudo runuser -u <owner> -- podman inspect labpod-ws-<id>
sudo runuser -u <owner> -- podman logs labpod-ws-<id>
Terminal window
# Run these as root
runuser -u <owner> -- podman ps -a --filter name=labpod-ws-<id>
runuser -u <owner> -- podman inspect labpod-ws-<id>
runuser -u <owner> -- podman logs labpod-ws-<id>

Common causes:

  • Missing image - select the template and choose the confirmed Pull action for a registry image. For an administrator-built image, Pull copies the shared master into the user’s store; ask the administrator to build it first. Dockerfile-backed personal templates need Build.
  • Out of disk - check /home usage; the Resources page shows disk pressure.
  • Port conflict - rare; LabPod allocates from a managed pool (10000–19999 by default).

Workspace start fails on a /work container label

Section titled “Workspace start fails on a /work container label”

The user may see:

Couldn’t start the workspace because LabPod couldn’t apply the container label to /work/<path>. In Files, download it first if needed, then delete it from /work; or move it outside ~/work from your host account.

On SELinux hosts, LabPod mounts each user’s ~/work directory into containers as /work with a shared container label. Rootless Podman applies that label as the workspace owner. If ~/work contains root-owned or otherwise protected files, Podman cannot relabel them and the workspace fails before the container starts.

Ask the user to inspect the path shown in the error. From their host account, they can move the item outside ~/work:

Terminal window
mkdir -p ~/labpod-unmounted
mv ~/work/<path> ~/labpod-unmounted/

If they do not need the item, they can delete it from LabPod’s Files page instead. To find other files in ~/work that the user does not own:

Terminal window
find ~/work -not -user "$USER" -ls

If the file should stay in ~/work, fix ownership instead:

Terminal window
sudo chown -R <user>:<user> /home/<user>/work/<path>
Terminal window
# Run these as root
chown -R <user>:<user> /home/<user>/work/<path>

Do not disable SELinux labeling for the workspace mount. That weakens the isolation LabPod relies on for user-owned bind mounts.

Some Jupyter-based images show jovyan in terminals, file paths, prompts, or notebook UI even when the LabPod user is named something else.

LabPod’s built-in templates (PyTorch, TensorFlow, Data Science, and the PyTorch Demo) use LabPod-built ghcr.io/labpod/* images that have no jovyan account, so you will not see this on them. It can still appear on a template pointing at an upstream Jupyter Docker Stacks image (quay.io/jupyter/*-notebook), where the jovyan account is baked into the image and LabPod does not rewrite the image username at startup. LabPod runs the container with --userns=keep-id, so the numeric UID/GID inside the container matches the LabPod Linux user on the host.

Users can ignore the displayed name. Files written under /work still belong to their host LabPod account because ownership follows the UID, not the image’s display username. However, a template image that already reserves the workspace owner’s numeric UID is rejected before Start, because it would direct applications to a non-persistent home. Template authors must leave that UID free.

To verify from inside the workspace:

Terminal window
id
touch /work/labpod-uid-check.txt
ls -ln /work/labpod-uid-check.txt

On the host, the same file should show the LabPod user’s UID:

Terminal window
ls -ln /home/<user>/work/labpod-uid-check.txt

Do not rename the image account as a workaround. If a template needs a different visible username, build a custom image that creates that account consistently.

Admin Resources page shows untracked GPU usage

Section titled “Admin Resources page shows untracked GPU usage”

The indicator fires when nvidia-smi sees GPU processes that don’t belong to any LabPod workspace cgroup. Usually:

  • A user is running training directly on the host outside any container.
  • A workspace was deleted but left a stray GPU process.

Find and free the process:

Terminal window
nvidia-smi --query-compute-apps=pid,process_name,used_memory,gpu_uuid --format=csv
sudo kill -TERM <pid>
# After 30 seconds if still alive:
sudo kill -KILL <pid>
Terminal window
# Run these as root
nvidia-smi --query-compute-apps=pid,process_name,used_memory,gpu_uuid --format=csv
kill -TERM <pid>
# After 30 seconds if still alive:
kill -KILL <pid>

Read the message and fix accordingly. doctor checks:

CheckFix
Required command binariesInstall the missing package or re-run the public install script for LabPod-managed files
cgroup modeUpgrade to cgroup v2 or accept degraded CPU/MEM enforcement
Fractional GPU libraryVerify LABPOD_GPU_SHARING_LIB_PATH points to the correct file
Workspace helper tree (/opt/labpod/inject)Re-run the public install script to restore helper files
GPU process inspectorInstall nvidia-smi or set LABPOD_GPU_PROCESS_INSPECTOR=none
Port guardConfirm nft is installed and the service runs as root
TLS certificateCheck LABPOD_TLS_CERT/LABPOD_TLS_KEY paths or LABPOD_TLS_SELF_SIGNED

Check the journal first:

Terminal window
sudo journalctl -u labpod -n 200 --no-pager
sudo labpod admin doctor
Terminal window
# Run these as root
journalctl -u labpod -n 200 --no-pager
labpod admin doctor

If a migration is failing:

Terminal window
sudo labpod admin --db /var/lib/labpod/labpod.db migrate # idempotent; safe to retry
Terminal window
# Run these as root
labpod admin --db /var/lib/labpod/labpod.db migrate # idempotent; safe to retry

If the migration itself is broken, restore the pre-upgrade-*.db snapshot created by the install script during the upgrade:

Terminal window
sudo systemctl stop labpod
sudo labpod admin --db /var/lib/labpod/labpod.db restore \
/var/lib/labpod/backups/pre-upgrade-<stamp>.db
sudo systemctl start labpod
Terminal window
# Run these as root
systemctl stop labpod
labpod admin --db /var/lib/labpod/labpod.db restore \
/var/lib/labpod/backups/pre-upgrade-<stamp>.db
systemctl start labpod

If the installer stops before downtime with an invalid configuration message, repair the named setting and re-run it. The preflight checks configuration paths, TLS material, GPU-sharing library, inject tree, and startup booleans before replacing the executable or stopping the API. Run install.sh --check to report all configuration problems in one pass.

Check what’s consuming space:

Terminal window
du -sh /var/lib/labpod/ # database + backups (usually small, <100 MB)
du -sh /var/lib/labpod/backups/ # backup rotation directory
sudo podman system df # root's image layers
sudo -u <user> podman system df # per-user image layers
Terminal window
# Run these as root
du -sh /var/lib/labpod/ # database + backups (usually small, <100 MB)
du -sh /var/lib/labpod/backups/ # backup rotation directory
podman system df # root's image layers
runuser -u <user> -- podman system df # per-user image layers

Largest consumers:

  • Per-user container images in ~/.local/share/containers/
  • Hugging Face caches in ~/work/.hf-cache/

To reclaim unused image layers for a user:

Terminal window
sudo -u <user> podman image prune -f
Terminal window
# Run these as root
runuser -u <user> -- podman image prune -f

Or use the admin Images page in LabPod to prune all unused layers at once.

If curl http://127.0.0.1:24680/api/version returns a different SHA than labpod --version, the binary was replaced but the service was not restarted:

Terminal window
sudo systemctl restart labpod
Terminal window
# Run these as root
systemctl restart labpod