Lesstep
GitHub Actions · Ubuntu 26.04 · Checked November 4, 2026

"disk quota exceeded" in /tmp on ubuntu-latest (Ubuntu 26.04)

ubuntu-latest is moving from Ubuntu 24.04 to 26.04 between October 19 and November 19, 2026 (what else changes). Ubuntu itself now mounts /tmp as a tmpfs, a file system in memory (Ubuntu 26.04 release notes). The first 26.04 runner images kept that default, so a job that wrote a few gigabytes to /tmp failed there, while the same job on 24.04, where /tmp is on the runner's disk, passed (runner-images #14777).

What it looks like

The tmpfs is half the runner's memory, about 7.8G (df shows 7.9G), and it has a per-user quota. GitHub measured that the runner user hits the quota at about 6.3G. So the error is a quota error, not "no space", and the disk around it has plenty free:

compile: writing output: write $WORK/b4822/_pkg_.a: disk quota exceeded
OSError: [Errno 122] Disk quota exceeded
error: unable to write file projects/hipblaslt/library/src/...
failed to write to /tmp/lez/target/debug/deps/...: Disk quota exceeded (os error 122)

These are from Go (its build directory, and a GOCACHE made with mktemp, in lnd's case), pip staging large wheels, a git clone into a temporary directory (ROCm), and a Rust build under /tmp. pip sometimes reports it as an incomplete-download. Another symptom has nothing to do with size: a hard link from /opt/hostedtoolcache into /tmp crosses file systems and throws EXDEV: cross-device link not permitted.

Which images

GitHub changed the image on October 20 to keep /tmp on the root disk as on 24.04 (runner-images #14814, which masks tmp.mount and adds a test that /tmp is not a tmpfs), and on October 30 to empty /tmp at boot as before (#15185). In the reports we read, the failing jobs ran on images 20261012.163.1 and 20261018.50.1, and the same job passed on 20261025.179.1. A new image reaches all runners over several days, so an older one could still turn up during the move.

Fix: keep temporary files on the runner's disk

Make this the first step of the job:

- run: echo "TMPDIR=$RUNNER_TEMP" >> "$GITHUB_ENV"

RUNNER_TEMP is on the work disk on every runner, and it is emptied after each job. Python's tempfile (so pip and uv), Go's os.TempDir, Rust's std::env::temp_dir, Node's os.tmpdir() and mktemp all follow TMPDIR. Go's own build directory can also be moved with GOTMPDIR. A script that writes to /tmp/... by name still needs to be changed to use $TMPDIR or $RUNNER_TEMP.

The step is worth keeping even on fixed images: it costs nothing, and the same tmpfs is the default on a self-hosted runner or a developer machine with Ubuntu 26.04. For EXDEV, copy the file when linking fails, or make the link inside the same temporary directory.

Telling it apart

Other 26.04 failures

See failed jobs from IntelliJ IDEA

Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).

Get it on JetBrains Marketplace

GitHub and GitHub Actions are trademarks of GitHub, Inc.; Ubuntu is a trademark of Canonical Ltd.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Canonical or JetBrains.

More: "The ubuntu-latest label will migrate to Ubuntu 26" · C and C++ builds that fail with GCC 15 on Ubuntu 26.04 · GitHub Actions plugins for IntelliJ IDEA compared · 日本語