Published on : 2026-10-05 11:25
It was time.
‾‾‾‾‾‾‾‾‾‾‾‾
My servers were running Ubuntu 24.04.4 LTS, and with Ubuntu
26.04.1 LTS available, I decided it was finally time to upgrade
them. Of course, upgrading several servers at once is a great way
to turn a quiet evening into an exciting troubleshooting session.
So I did what any cautious homelabber would do:
I upgraded one server first.
The test subject
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
The first victim was lenovo1. I logged in, made sure everything
looked normal, and ran:
do-release-upgrade
That's it. The upgrade process did its thing and I waited.
And waited. And waited some more. Eventually it reached 100%.
There was, however, one little bit of interaction required during
the upgrade.
Ubuntu asked me what to do with my existing NUT configuration
files. Since I already had my UPS setup configured exactly the
way I wanted, I chose to keep my current versions. Three times.
I had to confirm that I wanted to keep:
/etc/nut/nut.conf
/etc/nut/ups.conf
/etc/nut/upsmon.conf
(DIR) Installing and configuring NUT (Network UPS Tools) for your home lab
The moment of truth
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
I rebooted lenovo1. Time for the moment of truth. Did it boot?
Yes. I sshed to lenovo1 and was greeted with:
Welcome to Ubuntu 26.04.1 LTS (GNU/Linux
7.0.0-38-generic x86_64)
Nothing appeared to have exploded. This was the part where I could
have immediately started upgrading all the other machines.
The rest of the herd
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Once lenovo1 survived the upgrade and rebooted successfully, I
proceeded with the rest:
tiny
nas
lenovo2
lenovo3
I repeated the same process on each machine: do-release-upgrade.
Wait for 100%. Keep the existing NUT configuration when asked.
Reboot. Check that everything works.
No downtime
‾‾‾‾‾‾‾‾‾‾‾
The nice thing about having the servers behind Keepalived is that
I didn't have to take my public services offline while doing all
this.
The services exposed to the outside world include:
* Gemini
* Gopher
* Finger
* HTTPS
Normally, rebooting the server currently handling the traffic
would mean a little outage. But with Keepalived, the Virtual IP
can move to another node when one goes down. So I could upgrade
and reboot one server while another node continued handling the
traffic.
No maintenance page. No "I'll be back soon." No angry users from
the 2 people who might actually notice that my Gopher server is
not online.
The services stayed online while I worked through the cluster.
I originally installed Keepalived after discovering that tiny was
a single point of failure for the entire cluster and I wrote about
that adventure here:
(DIR) Cluster Outage Postmortem: Missing Keepalived
That little bit of redundancy turned out to be particularly
useful during this upgrade.
My servers survived another major Ubuntu upgrade, the UPS
configuration survived intact, my public services stayed online,
and I didn't even have to reach for the rescue USB.
I'll call that a BIG win.
(DIR) Back to my phlog