How to Upgrade Ubuntu 25.04 to 26.04 LTS

Upgrade Ubuntu 25.04 to 26.04 LTS with do-release-upgrade via the required 25.10 hop—no data loss on /home in our VirtualBox test—apt full-upgrade and reboot checks, and fixes when the upgrader blocks on a pending reboot or EOL message.

Published

Updated

Read time 10 min read

Reviewed byDeepak Prasad

Upgrade Ubuntu 25.04 to 26.04 LTS with do-release-upgrade on a terminal

Ubuntu 26.04 LTS (Resolute Raccoon) is the current long-term support release. If your machine still reports Ubuntu 25.04 (Plucky Puffin), you cannot jump straight to 26.04—you must upgrade to 25.10 (Questing Quokka) first, reboot, then run do-release-upgrade again.

I ran the full path on a VirtualBox VM named server1: pre-checks on 25.04, two do-release-upgrade runs, and three reboots. Files under /home and application data on / were still there afterward—no data loss on my test system. The sections below follow that order so you can compare your terminal output to mine. The main surprise was how often the upgrader stopped until I rebooted after a kernel update.

Tested on: Ubuntu 25.04 (Plucky Puffin) at start; finished on Ubuntu 26.04 LTS; kernel 7.0.0-27-generic after the final reboot.

IMPORTANT
Take a hypervisor snapshot or filesystem backup before you start—a release upgrade touches the kernel, initramfs, GRUB, desktop stack, and thousands of .deb packages. See backup and rollback options below. To roll back afterward, restore that snapshot rather than forcing an in-place downgrade with downgrade Ubuntu 26.04 LTS to 25.04.

Quick command summary

Use this table as a checklist while you work through the longer sections. Each row maps to a phase in the two-hop upgrade.

Task Command
Confirm release cat /etc/os-release and check Ubuntu version
Update current release sudo apt update && sudo apt full-upgrade -y
Check reboot flag cat /var/run/reboot-required
Reboot if needed sudo reboot
See next release do-release-upgrade -c
Upgrade interactively sudo do-release-upgrade
Upgrade non-interactively sudo DEBIAN_FRONTEND=noninteractive do-release-upgrade -f DistUpgradeViewNonInteractive
Confirm after upgrade cat /etc/os-release && uname -r
Clean obsolete packages apt list '?obsolete' then sudo apt autoremove --purge

Upgrade path at a glance

Canonical treats each interim release as a stepping stone. You cannot retarget apt from plucky to resolute in one jump from 25.04—you must land on questing (25.10) first, reboot into its kernel, then run the upgrader again for 26.04 LTS.

Phase What happens
Prepare on 25.04 apt full-upgrade, fix reboot flag
Reboot 1 Load kernel installed by apt before first hop
Step 1 do-release-upgrade → Ubuntu 25.10
Reboot 2 Load 25.10 kernel before second hop
Step 2 do-release-upgrade → Ubuntu 26.04 LTS
Reboot 3 Boot Linux 7.0 kernel shipped with 26.04

Total time on my VM: about 70 minutes across both do-release-upgrade runs, not counting reboots or the initial apt work.


Prerequisites

You need a healthy 25.04 install, enough disk for thousands of package downloads, and a session that survives long do-release-upgrade runs. The list below is what I verified on server1 before touching release metadata.

  • Ubuntu 25.04 with sudo access and a working network mirror.
  • At least 10 GB free on / (my 58 GB disk used 14 GB before the upgrade and 17 GB after Step 2).
  • Prompt=normal in /etc/update-manager/release-upgrades (default on my host).
  • A console or SSH session that will not drop for 30–40 minutes per upgrade run.
  • A rollback plan—hypervisor snapshot, LVM snapshot, or fsarchiver archive (see next section).

Backup and rollback options

A release upgrade rewrites system packages under /usr and refreshes boot loaders—it does not delete /home, but a failed hop can still leave you unable to boot. Pick at least one rollback path before the first do-release-upgrade:

Method Best for Guide
Hypervisor snapshot VirtualBox, VMware, Proxmox guests Use your hypervisor’s snapshot tool (fastest rollback on my test VM)
LVM snapshot Ubuntu on LVM (ubuntu-vg, etc.) Linux LVM snapshot backup and restore
fsarchiver archive Bare metal or when you need a portable root copy Clone or backup a Linux partition with fsarchiver

If GRUB or partition layout might change, save the partition table first with backup and restore the partition table in Linux.


Pre-upgrade checks on Ubuntu 25.04

Run these before changing releases. They establish a baseline—version, kernel, disk space, and apt health—so you can tell whether a later problem came from the upgrade or was already present. Save the output so you can diff later.

Confirm version, kernel, and disk

These three commands answer “what am I upgrading from?” and whether / has room for new kernels and desktop packages.

bash
cat /etc/os-release
uname -r
df -h /
free -h

On my VM at the start:

text
PRETTY_NAME="Ubuntu 25.04"
VERSION_CODENAME=plucky
Linux server1 6.14.0-33-generic ...
/dev/mapper/ubuntu--vg-ubuntu--lv   58G   14G   42G  25% /

Fully update the current release

do-release-upgrade expects your current release to be fully patched. Running apt upgrade and then apt dist-upgrade clears security fixes and kernel updates on 25.04 so the release upgrader does not stop with “install all available updates first.”

bash
sudo apt update
sudo apt upgrade -y
sudo apt dist-upgrade -y

The first apt upgrade pulled 155 packages. A kernel bump to 6.14.0-37-generic only appeared after apt dist-upgrade.

Confirm apt is healthy

Held packages and broken dpkg state block any release hop. These commands list problems you must fix before do-release-upgrade.

bash
dpkg --audit
apt-mark showhold
apt list --upgradable

I had no held packages and no broken dpkg state.

See what release-upgrade offers

do-release-upgrade -c is a dry run: it checks mirrors and prints the next release without changing anything. On EOL 25.04 you should see 25.10—not 26.04 yet.

bash
do-release-upgrade -c
text
Your Ubuntu release is not supported anymore.
New release '25.10' available.
Run 'do-release-upgrade' to upgrade to it.

That EOL message is expected on 25.04—the tool still offers 25.10 as the next hop.

Optional: note failed units

Failed systemd units rarely block do-release-upgrade, but noting them now helps if something misbehaves after the hop.

bash
systemctl list-units --failed

vboxadd.service was already failed on my VirtualBox guest. It did not block the upgrade.


Reboot 1 — before the first do-release-upgrade

When apt installs a new kernel, Ubuntu sets /var/run/reboot-required. The release upgrader refuses to run until you boot that kernel—otherwise package scripts that expect the running kernel version can misconfigure GRUB or modules.

After dist-upgrade installed linux-image-6.14.0-37-generic, the system set the reboot flag:

bash
cat /var/run/reboot-required
cat /var/run/reboot-required.pkgs
text
*** System restart required ***
gnome-shell
linux-image-6.14.0-37-generic
linux-base

When I tried do-release-upgrade without rebooting, it exited immediately:

text
You have not rebooted after updating a package which requires a reboot.
Please reboot before upgrading.

Reboot, then confirm:

bash
sudo reboot

After Reboot 1:

bash
uname -r
cat /var/run/reboot-required || echo "OK — no reboot pending"
do-release-upgrade -c
text
6.14.0-37-generic
OK — no reboot pending
New release '25.10' available.

This reboot gate appeared again before Step 2—treat /var/run/reboot-required as a hard stop.


Step 1 — upgrade Ubuntu 25.04 to 25.10

do-release-upgrade retargets /etc/apt/sources.list.d/ubuntu.sources from plucky to questing, then runs a dist-upgrade across the whole system. You answer prompts about config file merges and obsolete package removal—or use the non-interactive flag on servers.

Check and run

bash
do-release-upgrade -c
sudo do-release-upgrade

On a headless server or automation job:

bash
sudo DEBIAN_FRONTEND=noninteractive do-release-upgrade -f DistUpgradeViewNonInteractive

Near the start I saw a non-fatal download warning:

text
Download is performed unsandboxed as root as file 'questing.tar.gz.gpg' couldn't be accessed by user '_apt'

The upgrade continued. On my VM Step 1 took about 34 minutes and rewrote thousands of packages (upgrade log ~4,890 lines). GRUB picked up 6.17.0-40-generic; GCC 15 and Clang 20 appeared in the package set. Disk use rose from 14 GB to 17 GB. Several snaps refreshed at the end (firefox, snap-store, gnome-46-2404).

Verify Step 1

Confirm /etc/os-release shows the new codename and that do-release-upgrade -c now offers 26.04 LTS. The running kernel may still be the pre-hop image until you reboot—that is expected.

bash
cat /etc/os-release
do-release-upgrade -c
uname -r
text
PRETTY_NAME="Ubuntu 25.10"
VERSION_CODENAME=questing
New release '26.04 LTS' available.
6.14.0-37-generic

The release file already shows 25.10, but the running kernel is still the old image until you reboot—that is normal.


Reboot 2 — before upgrading to 26.04 LTS

Step 1 installed another kernel (6.17.0-40-generic) and refreshed core libraries. The same reboot gate applies: clear /var/run/reboot-required before the second do-release-upgrade, or the tool exits immediately.

After Step 1, check the reboot list again:

bash
cat /var/run/reboot-required.pkgs
text
libc6
dbus
evolution-data-server
gnome-shell
linux-image-6.17.0-40-generic
linux-base

I hit the same blocker when I tried Step 2 without rebooting:

text
You have not rebooted after updating a package which requires a reboot.
Please reboot before upgrading.
bash
sudo reboot

After Reboot 2:

bash
uname -r
do-release-upgrade -c
text
6.17.0-40-generic
New release '26.04 LTS' available.

Step 2 — upgrade Ubuntu 25.10 to 26.04 LTS

The second hop retargets sources from questing to resolute and pulls in the 26.04 LTS package set—including Linux 7.0 and Python 3.14 on my VM. Patch 25.10 one last time, then start the upgrader.

Clear any last updates on 25.10, then run the upgrader:

bash
sudo apt update
sudo apt full-upgrade -y
sudo do-release-upgrade

Non-interactive:

bash
sudo DEBIAN_FRONTEND=noninteractive do-release-upgrade -f DistUpgradeViewNonInteractive

Step 2 took about 36 minutes on my VM (~5,635 log lines). The upgrader installed linux-image-7.0.0-27-generic, moved Python from 3.13 to 3.14, and purged old 6.14.0-37 kernel packages during cleanup. I saw the same _apt sandbox warning (this time for resolute.tar.gz.gpg) and harmless os-prober messages during GRUB updates.

Verify Step 2

You should see resolute in /etc/os-release, both old and new kernels under /boot, and no further LTS offered by -c. The running kernel may still be 6.17 until Reboot 3.

bash
cat /etc/os-release
do-release-upgrade -c
uname -r
ls /boot/vmlinuz-*
text
PRETTY_NAME="Ubuntu 26.04 LTS"
VERSION_CODENAME=resolute
There is no development version of an LTS available.
6.17.0-40-generic
/boot/vmlinuz-6.17.0-40-generic
/boot/vmlinuz-7.0.0-27-generic

do-release-upgrade -c reporting no LTS development release is what you want—you are on the target LTS.

Post-upgrade sanity checks

These confirm disk use, pending upgrades, and dpkg integrity after the heavy package churn. A clean dpkg --audit means you can move on to kernel reboot or cleanup.

bash
df -h /
apt list --upgradable
dpkg --audit
systemctl list-units --failed

Disk stayed at 17 GB used. dpkg --audit was clean. Failed units on my VM: vboxadd.service (pre-existing) and systemd-tmpfiles-clean.service (new after Step 2).

Remove obsolete packages

The upgrader may offer to remove packages whose versions no longer exist in 26.04 sources. Accepting that prompt keeps the system tidy; if you skipped it, use the commands below.

Accept the cleanup prompt when do-release-upgrade asks. If you skipped it:

bash
apt list '?obsolete'
sudo apt autoremove --purge

See remove obsolete packages on Ubuntu for the full cleanup workflow. Remove unused packages helps if autoremove leaves orphans.


Reboot 3 — boot the 26.04 kernel

Installing linux-image-7.0.0-27-generic sets the reboot flag again. Until you reboot, uname -r still shows the 25.10 kernel even though /etc/os-release already reports 26.04 LTS.

After Step 2 the reboot flag returned:

bash
cat /var/run/reboot-required.pkgs
text
libc6
dbus
evolution-data-server
polkitd
gnome-shell
linux-image-7.0.0-27-generic
linux-base

Reboot to load Linux 7.0:

bash
sudo reboot
uname -r
cat /etc/os-release | grep PRETTY
text
7.0.0-27-generic
PRETTY_NAME="Ubuntu 26.04 LTS"

Until this reboot, uname -r still showed 6.17.0-40-generic even though 26.04 was already installed.


Troubleshooting

Most blockers on my VM were reboot-related or expected EOL messaging—not corrupt disks. Use this table when your output diverges from the steps above.

Symptom Likely cause Fix
Please reboot before upgrading /var/run/reboot-required set after kernel or libc update sudo reboot, confirm uname -r, retry
Please install all available updates Pending apt upgrades sudo apt update && sudo apt full-upgrade -y, reboot if flagged
EOL message but 25.10 offered 25.04 is unsupported Proceed to 25.10 first; 26.04 appears only from 25.10
_apt sandbox warning on .tar.gz.gpg Cache permissions Usually safe to ignore; optional chown/chmod on /var/cache/apt/archives
os-prober will not be executed Default GRUB config Normal on single-OS VMs
Long pause on snap refresh Concurrent snap changes Wait; messages like Waiting for conflicting change in progress are common
No 26.04 prompt from 24.04 LTS LTS-to-LTS timing Canonical often opens 24.04 → 26.04 after the 26.04.1 point release

References


Summary

Upgrading Ubuntu 25.04 to 26.04 LTS is a two-hop journey: fully update 25.04, reboot, run do-release-upgrade to 25.10, reboot again, then run do-release-upgrade to 26.04, and reboot once more to boot Linux 7.0. On my VirtualBox VM each release hop took a little over half an hour; the repeated reboot requirement—not disk space—was what slowed the calendar time. User files on /home were untouched throughout—no data loss on the test VM.

Before every do-release-upgrade, run apt full-upgrade, clear /var/run/reboot-required, and use do-release-upgrade -c to confirm the next target. After the final hop, accept obsolete-package cleanup or run apt autoremove --purge.


Frequently Asked Questions

1. Can I upgrade Ubuntu 25.04 directly to 26.04 LTS?

No. Canonical requires an intermediate hop: upgrade 25.04 to 25.10 first, reboot, then run do-release-upgrade again to reach 26.04 LTS. Ubuntu 25.04 reached end of life on 15 January 2026.

2. How long does the 25.04 to 26.04 upgrade take?

On a VirtualBox VM with 5 GB RAM, each do-release-upgrade run took about 34–36 minutes. Plan for two release-upgrade runs plus three reboots and an initial apt full-upgrade—not counting backups.

3. Do I need to reboot during the Ubuntu release upgrade?

Yes. Reboot after apt installs a new kernel, after each do-release-upgrade completes, and once more to boot the 26.04 kernel. Skipping reboot is the most common reason do-release-upgrade exits early with a reboot-required message.

4. What does do-release-upgrade -c show on Ubuntu 25.04?

On EOL 25.04 you typically see that the release is no longer supported and that 25.10 is available. After you reach 25.10 and reboot, -c offers 26.04 LTS. After 26.04, -c reports no further LTS development release.

5. Should I use do-release-upgrade or apt dist-upgrade alone?

Use apt update and apt full-upgrade to clear pending updates on your current release, then do-release-upgrade for the release hop. dist-upgrade alone does not retarget your apt sources to the next Ubuntu codename.

6. How do I run do-release-upgrade non-interactively on a server?

Run sudo DEBIAN_FRONTEND=noninteractive do-release-upgrade -f DistUpgradeViewNonInteractive. You still need to reboot when /var/run/reboot-required exists before the next hop.

7. What should I back up before upgrading Ubuntu?

Take a VM snapshot or backup /etc, /home, and application data. Release upgrades rewrite thousands of packages, refresh GRUB, and remove obsolete kernels.

8. How do I remove obsolete packages after do-release-upgrade?

Accept the cleanup prompt at the end of do-release-upgrade. If you skipped it, run apt list ?obsolete and sudo apt autoremove --purge. See remove obsolete packages on Ubuntu for the full workflow.
Deepak Prasad

R&D Engineer

Founder of GoLinuxCloud with more than 15 years of expertise in Linux, Python, Go, Laravel, DevOps, Kubernetes, Git, Shell scripting, OpenShift, AWS, Networking, and Security. With extensive …