To get a quick idea of what you’re in for, we’re going from Proxmox version 7 on Debian 11, to Proxmox version 8 on Debian 12, to Proxmox version 9 on Debian 13.

This is an advanced tutorial.

It is expected that you already have quite a bit of experience with Linux, the command line, scripting, etc.

Table of Contents

Sometimes life gets away from you and, well, you don’t perform the maintenance on your homelab that you really should have.

It’s been an… interesting few years and I had a couple of Proxmox nodes that were a tiny bit, um… outdated.

How outdated?

Well the current version of Proxmox as I write this is version 9.2.21 which is built on Debian 13. The node that desperately needed some attention and loving care was still on verison 7.2-11, which itself was buiilt on Debian 11. From 2022. So… it’s been a bit.

But hey, that means I get to make this tutorial on updating very old Proxmox installs to the latest version so here we are : )

Before We Begin

Now just a few things before we get into this.

  1. This is a standalone install of Proxmox. It’s not part of a cluster and it’s not using CEPH.
  2. There are lots of different ways to configure and customise Proxmox, so your install can be very different from this one
  3. Shut down all VMs and Containers while you’re updating.
    • Also if any of those VMs or Containers are configured to start automatically when Proxmox starts, disable them now. We’re going to be rebooting quite a few times before we’re finished and if you don’t disable your auto-start options you’re going to be spending a lot of time shutting down VMs and Containers again. Multiple times.
  4. This worked for me. It may not work for you. You’re welcome to try, but you can’t blame me if things don’t work after.
  5. Make sure you have backups of your data and/or backups of your VMs and Containers (virtual disks, config files, etc.) if you care about such things. My upgrades went smoothly without data loss. Your’s may not. That’s the risk we run when we neglect doing updates.
  6. Yes this post is long. But it’s not actually. There’s just a lot of screenshots and essentially we just keep repeating the same steps multiple times until we’re finished. No seriously, you could probably cut this whole thing by a third, but please read it all anyway. I write words to be read : )

WARNING

Because number 5 is so important, I’m going to say it again. In this fancy yellow-ish warning block.

Make sure you have backups of your data and/or backups of your VMs and Containers (virtual disks, config files, etc.) if you care about such things. My upgrades went smoothly without data loss. Your’s may not.

Let’s Go!

The web interface will tell us the Proxmox version is 7.2-11.

The Proxmox GUI showing it’s version 7.2-11

If we SSH into the system, from the command line we can get the version of Debian installed as well and it’s version 11.5.

root@Prox-edge-2:~# pveversion
root@Prox-edge-2:~# cat /etc/debian_version
root@Prox-edge-2:~# cat /etc/os-release

Terminal output showing the pve version is 7.2-11, debian is version 11.5, and the codename is ‘bullseye’

Updating Proxmox 7 and Debian 11 ‘Bullseye’

Before we can go upgrading Proxmox and Debian to the absolute latest, we’re going to need to install the latest updates that were available for Proxmox 7 and Debian 11 (‘Bullseye’) at the time. In the past. When they still received updates. That we didn’t install. It’s fine. No guilt here. Second best time to plant a tree and all that.

  1. Update the package lists
    root@Prox-edge-2:~# apt update

Terminal output from ‘apt update’ showing that 240 packages can be upgraded

There are 240 packages that can be upgraded. Instead of running ‘apt list –upgradable’ to view them, we’re just going to go ahead and update them as that’s what we’re here for anyway.

  1. Upgrade the available packages
    root@Prox-edge-2:~# apt upgrade

Terminal output showing apt is failing to fetch from the repo sources.

“Failed to fetch…”

What the hell? Apt isn’t able to download the updated packages from those URLs. You can get that error if it can’t communicate with the site because of a problem on your end, say DNS is not working or you have port 80 (HTTP) outbound blocked.

But I know my DNS is working and on this server currently I’m not doing an outbound HTTP block so what’s happening here?

We’ll since it’s been so long since I updated this system, Debian version 11, codenamed ‘Bookworm’, is no longer under support. It’s reached end of life so the URLs we have as the repository sources are no longer valid.

  1. Update repo Sources
    root@Prox-edge-2:~# nano /etc/apt/sources.list

We’re going to change the repository URLs from the original values to the Debian archive links.

The nano editor showing the current repo sources in /etc/apt/sources.list using the ‘ftp.ca.debian.org’ and ‘security.debian.org’ URLs.

The easiest way to do that is to make a copy of each line and comment out (with a ‘#') the original line. The commented lines are not processed by apt so this essentially “disables” the repo followed by the ‘#’. That way we can easily restore the original settings later.

The biggest URL change is for the Debian security repo. That one changes from

http://security.debian.org

to

http://archive.debian.org/debian-security

The nano editor show the original lines have been commmented out, and replaced with almost duplicate lines that have the URLs updated to use archive.debian.org

Now we can update our package lists again, which still shows 240 packages can be upgraded.

  1. Update the package lists
    root@Prox-edge-2:~# apt update

Terminal output from ‘apt update’ showing that 240 packages can be upgraded.

But this time when we run our upgrade the system is able to find the appropriate URLS to download and install the packages accordingly.

  1. Upgrade the available packages
    root@Prox-edge-2:~# apt upgrade

Terminal output showing apt is able to fetch the package lists this time

Terminal output showing apt is unpacking and setting up new versions of the packages. The current progress is at 9%.

After the upgrades have finished reboot the system.

  1. Reboot the system
    root@Prox-edge-2:~# reboot

Terminal output showing the updates have completed. The ‘reboot’ command awaits on the prompt

Success! Onwards Fellow Tech Adventurers!

Following the reboot we can refresh the package sources again and we see that there are two packages related specfically to Proxmox that were kept back.

  1. Refresh the package list
    root@Prox-edge-2:~# apt update

Terminal output showing the package lists have been updated and there are two packages that can be upgraded.

Checking the version in the Proxmox web interface and on the command line though we can see that Proxmox did update to the latest 7.4 release and Debian updated to the latest 11 point release.

  1. Check the reported versions
    root@Prox-edge-2:~# pveversion
    root@Prox-edge-2:~# cat /etc/debian_version
    root@Prox-edge-2:~# cat /etc/os-release

Screenshot of a section of the ProxMox GUI that now shows the version is 7.4-20.

Terminal Output showing the pve version is 7.4-20, Debian is now 11.11

Anyway, let’s see about updating those Proxmox packages that were kept back

  1. Upgrade kept back packages
    root@Prox-edge-2:~# apt update
    root@Prox-edge-2:~# apt upgrade -y

Terminal output showing the apt sources being refreshed, and then the two packages attempting to be installed using apt upgrade.

Apparently I forgot to grab a screenshot here, but essentially it said it was keeping the packages back and refused to upgrade them. Helpful. I mean I get it, there are reasons for it. So it is helpful. But not what we want. So we’re going to force the upgrade of those packages.

  1. Force upgrade of kept back packages
    root@Prox-edge-2:~# apt dist-update

Terminal output showing aot dist-upgrade is necessary to update the kept back packages

OK look I admit I’m falling down on the job here at taking screenshots. This was a success. It installed those packages. You’ll just have to trust me on that.

Are You Ready?

Let’s run the pve7to8 checker tool and see if it gives us any warnings or {hopefully not} failures.

  1. Run pve7to8 check script
    root@Prox-edge-2:~# pve7to8 --full

Terminal output showing some of the checks being performed by the pvr7to8 readiness script

Looks like the pve7to8 readiness check produced one warning. And no failures! So that’s good! Got that going for us.

Now I get it, ugh a warning? Do I need to worry about it. Probably not. Things will probably update just fine. But then again they might not. That’s why warnings exist. It’s easier to just take care of the warnings as we go along.

This one is letting us know we don’t have the ‘grub-efi-amd64’ package installed.

Terminal output of the pve7to8 readiness check showing 31 checks total, 25 passed, 5 skipped, 1 warning and 0 failures. The warning states to install the grub-fi-amd64 package.

That’s easy enough to fix.

  1. Install ‘grub-efi-amd64’ package
    root@Prox-edge-2:~# apt install grub-efi-amd64

Terminal output showing the grub-efi-amd64 package being installed

Once again I neglected to take a screenshot after the install. Which is funny because I was taking a lot of screenshots as you can tell so not sure why I kept missing some but anyway, trust me again, the package installed.

Actually you don’t have to trust me. Running the readiness check again and this time we passed with flying colours! No warnings. So there. Ha! I didn’t lie. The package was installed.

Side note: Why are the colours flying anyway? Where are they flying too? Do they charge for an extra bag?

  1. Run pve7to8 check script
    root@Prox-edge-2:~# pve7to8 --full

Terminal output showing some of the checks being performed by the pvr7to8 readiness script

Terminal output showing the results of the readiness check again. This time 26 tests passed with no warnings

Anyway no warnings. Yay! Let’s get this system updated.

We have to update our package sources to the next Debian version 12, codenamed ‘Bookworm’.

We need to change the word “bullseye” in our /etc/apt/sources.list file to ‘bookworm’.

The easiest way to handle this is to use sed to do a search and replace and update the file.

  1. Hit that bullseye you bookworm
    root@Prox-edge-2:~# sed -i 's/bullseye/bookworm/' /etc/apt/sources.list

Sed Explainer:

- -i = update the file. 
    - Without the -i it will show you what it will change, which is handy. Definitely do
      that before making changes. 
- 's/bullseye/bookworm/' = a search and replace syntax. 's/{SEARCH_WORD}/{REPLACE_WITH}'/
- /etc/apt/sources.list = The file we're reading and in this case writing back too

If we cat the file all the instances of ‘bullseye’ were replaced with ‘bookworm’

  1. Here kitty kitty
    root@Prox-edge-2:~# cat /etc/apt/sources.list

Terminal output showing sed being used to update the contens of the /etc/apt/sources.list file to change ‘bullseye’ to ‘bookworm’. The contents of the /etc/apt/sources.list file  are then displayed showing this change.

Debian 12 ‘bookworm’ is still under active support. So that means we need to change our repo URLs back to not use the archive URLs. Cause bookworm isn’t in the archives yet yeah?

Since we commented out the original lines when we made our initial changes, this makes it super easy to update the file again.

Open the file in a text editor (I like using nano).

  1. Update Repo URLs
    root@Prox-edge-2:~# nano /etc/apt/sources.list

Delete the existing lines that have “archive.debian.org” in them, and delete the ‘#’ from the beginning of the other lines so that this

The /etc/aptr/sources.list file open in the nano text editor

Looks like this.

(nano is controlling the colours displayed here in case you were wondering. Commented lines are all in blue. Once you uncomment a line well… the line starts being true to itself. Work those colours girl!)

/etc/apt/sources.list file open in the nano text editor, this time with the archive.debian.org lines removed and the non-archived repo links uncommented.

The Main Event

Now that we have the sources updated, if we refresh the list of avaialble packages again we now see there are 592 packages that can be upgraded.

  1. Update Repo URLs
    root@Prox-edge-2:~# apt update

Just like before though if we tried the regular ‘apt upgrade’ method it wouldn’t work. We need to go with ‘apt dist-upgrade’ again to force* apt to upgrade the packages

  1. Upgrade packages with dist-upgrade
    root@Prox-edge-2:~# apt dist-upgrade

* Little side note here before people on the internet tell me I’m wrong. Yes I know this isn’t technically a “force” option. A “force” option is “do the thing I told you to do anyway without complaining”. Like overwriting or deleting a file without letting me know how much it’s going to screw up my day. “dist-upgrade” isn’t a “do this anyway” option. It’s an entirely different function used to upgrade packages while also handling the new dependancies for those packages accordingly. But it’s easier to say “force” alright?

Terminal output showing the packages sources being refreshed with apt update and that 592 packages can be upgraded.

Terminal output of the apt dist-upgrade command requesting confirmation to upgrade the packages

Terminal output of the packages being downloaded

Once we’ve kicked off the dist-upgrade we’ve got some waiting to do. Now is a good time to go make a coffee or something. Maybe a sandwich. Actually a sandwich does sound pretty good right now. A tuna sandwich with some cherry tomatoes on the side. Maybe a bit of cheese. Couple of biscuits… Where was I?

Oh right, we’re waiting for things to happen, but it’s not entirely a hands off process. Along the way we have some questions to answer about keeping some of our current config files or if we want it to automatically restart services during the upgrade.

I can’t tell you what to choose for those questions, as they’re unique to your system and what you want to do. Some of the config files like the one below (/etc/issue) I told it to replace the file. Other I told it to keep. I said go ahead and restart services when it asked. You might not want that. Choose your own adventure.

Terminal output of the upgrades that have started. A question is asked to keep or replace the /etc/issue file

A question is asked on if you would like services to be restarted during the upgrade. The  option is highlighted in red as the selection

I missed some screenshots earlier showing that it had done a thing so I made sure to get a screenshot this time of it doing the main thing so… look… progress

Terminal output showing the progress of the upgrades is at 9%

Another replace or keep question. I kept my version of this file (/usr/share/chrony/chrony.conf)

Another question, this time asking if the file /etc/chrony/chrony.conf should be kept or replaced. The option to keep the existing file is selected

Hey things are finished!

But actually read the text on the screen. There’s something else to do here in regards to the bootloader. This is related to the ‘grub-efi-amd64’ package we installed earlier. What it’s asking us to do looks a little scary, but you can copy* the text in the terminal that it wants you to perform and then paste it into the terminal to perform it, so it’s pretty easy.

* Copy the text from your terminal, not from this page. It’s likely going to be the same, but on the offchance it isn’t, you want to issue the command your system is telling you to issue, not what I’m showing you my system did.

Terminal output showing the upgrade has finished, but there are additional steps to perform for the grub-efi-amd64 package

It’s a two step process.

  1. Allow GRUB packages to update grub-efi bootloader

    root@Prox-edge-2:~# echo 'grub-efi-amd64 grub2/force_efi_extra_removable boolean true' | debconf-set-selections -v -u

  2. Reinstall grub-efi-amd64

    root@Prox-edge-2:~# apt install --reinstall grub-efi-amd64

Terminal output showing the grub-efi-amd64 package being reinstalled

After that’s done, we’re doing another reboot.

  1. Reboot
    root@Prox-edge-2:~# reboot

Terminal output of the grub-efi-amd64 package finished installation. The system is now ready to reboot

Oooo Proxmox version 8.4.21! That’s exciting.

Screenshot of a section of the Proxmox GUI, now showing the version is 8.4.21

The terminal reports the same and also tells us we’re running Debian 12.15.

  1. Show Proxmox and Debian Version Info
    root@Prox-edge-2:~# pveversion
    root@Prox-edge-2:~# cat /etc/debian_version
    root@Prox-edge-2:~# cat /etc/os-release

Terminal output showing the proxmox version is 8.4.21, Debian is now version 12.15 and is codenamed ‘bookworm’

Chills. We got there. We survived.

Proxmox is updated and Debian is updated and the system didn’t burst into flames or explode.

Now do it all again

What?

You heard me. We put off maintenance on this for a really long time.

Now it’s time to go to Proxmox version 9 and Debian 13!

Side note here. If you’re feeling inclined you can start up some/all of your VMs or Containers here and make sure they work before moving ahead. I… didn’t. I just carried on. If you do start your VMs or Containers though make sure you shut them down again before continuing with the upgrade.

There shouldn’t be any updates available because the previous dist-upgrade pulled down the latest packages, but just to be sure refresh those package sources again.

  1. Check for updates
    root@Prox-edge-2:~# apt update

Terminal output showing the packages being refreshed by apt update

Alright no updates, let’s run the pve8to9 readiness check

  1. Readiness check
    root@Prox-edge-2:~# pve8to9 --full

Terminal output of some of the checks performed by the pve8to9 readiness check

Terminal output of the pve8to9 readiness checks. 42 checks total, 35 passed, 6 skipped, 1 warning. The warning is the intel-microcode package was not found and should be installed

One warning again. It would prefer if we installed the ‘intel-microcode’ package to receive updates for the CPU. Fine. Let’s install that.

  1. Install intel-microcode
    root@Prox-edge-2:~# apt install intel-microcode

Oh. It error’d out. Can’t find the package?? What the hell but you told me you wanted me to install it! What kind of useless piece of.. oh, “ensure you enable the ‘non-free-firmware’ component in the apt sources”. Right.

Terminal output showing a failure when trying to install the intel-microcode package as it needs to be installed from the ‘non-free-firmware’ repo which is not currently enabled

Open up that sources file again and we’ll enable some additional options.

  1. Update /etc/apt/sources.list
    root@Prox-edge-2:~# nano /etc/apt/sources.list

After each of the “*debian.org” lines, we’re going to add ‘non-free’ and ‘non-free-firmware’ to the end of the lines.

Technically we only need to include the ‘non-free-firmware’ option here, but since I was adding options I decided to also put in ‘non-free’. You do you.

The /etc/apt/sources.list file open in the nano text editor again showing the now-current unedited sources

The /etc/apt/sources.list file open in the name text editor with the ‘non-free’ and ‘non-free-firmware’ options added to the debian.org repos.

Once we save that file, we’ll update our sources again.

  1. Update sources
    root@Prox-edge-2:~# apt update

Terminal output showing the packages sources being refreshed again with apt update.

This time it should be able to find the ‘intel-microcode’ package for us to install.

  1. Install ‘intel-microcode’ package
    root@Prox-edge-2:~# apt install intel-microcode

Terminal output showing the intel-microcode package being installed

It also told us there were a couple of packages that were installed but no longer needed (‘pve-kernel-5.15.53-1-pve’ and ‘telnet’). I’m going to go ahead and have it remove those packages as well.

  1. Remove packages no longer needed
    root@Prox-edge-2:~# apt autoremove

Terminal output stating there were 2 packages installed that are no longer needed.

Terminal output showing the command ‘apt autoremove’ removing the two packages that are no longer needed.

Readiness check one more time.

  1. Readiness check
    root@Prox-edge-2:~# pve8to9 --full

Terminal output of some of the checks performed by the pve8to9 readiness check.

terminal output showing the results of the readiness check. This time there are no warnings.

No warnings, we’re good to go.

We’re almost there!

Let’s update those sources again.

I know I know updating the sources so many times is probably overkill, but it takes like 5 seconds to refresh the sources so why not do it and know for sure that we’re working with non-stale items in the package lists?

  1. View existing sources
    root@Prox-edge-2:~# cat /etc/apt/sources.list

Terminal output showing the contents of the /etc/apt/sources.list file using the ‘cat’ command.

Update sources from ‘bookworm’ to ‘trixie’ for Debian 13

  1. I ‘sed’ we’re going to update the sources…
    root@Prox-edge-2:~# sed -i 's/bookworm/trixie/' /etc/apt/sources.list

Terminal output showing the ‘sed’ command being used to replace the text ‘bookworm’ with the text ‘trixie’ in the /etc/apt/sources.list file. The ‘cat’ command is then used to display the contents of the /etc/apt/sources.list file, showing the changes.

Apt update and we’re got 612 packages that can be upgraded

  1. Show me the updates
    root@Prox-edge-2:~# apt update

Terminal output showing the package sources being updated again with the apt update command and that 612 packages can be upgraded.

Here we go again

You know the drill by now. Dist-upgrade time. And maybe another sandwich…

  1. Upgrade Upgrade
    root@Prox-edge-2:~# apt dist-upgrade

Terminal output showing apt dist-upgrade being ran.

Terminal outout of dist-upgrade asking for confirmation to continue.

Terminal output showing packages being downloaded.

As before you’re going to need to decide if you want to keep your versions of files or install the new ones.

Terminal output asking if the /etc/issue file should be kept or replaced.

Terminal output of dist-upgrade at work. The progress is at 5%.

Time to reboot again

  1. Reboot (how many boots does this thing own anyway?)
    root@Prox-edge-2:~# reboot

Terminal output showiong dist-upgrade has finished and the system is ready to be rebooted.

And we’re back. Proxmox version 9.2.21. Debian 13.7. Life is sweet.

  1. Show Proxmox and Debian Version Info
    root@Prox-edge-2:~# pveversion
    root@Prox-edge-2:~# cat /etc/debian_version
    root@Prox-edge-2:~# cat /etc/os-release

Terminal output showing the proxmox version is 9.2.21, and the DEbian version is 13.7, codenamed ‘trixie’.

Screenshot of a section of the Proxmox GUI showing the version number is 9.2.21.

The upgrade did enable the Proxmox Enterprise repo. Which is all well and good if you have an enterprise license. If you’re a home user and don’t well then it just pops up warnings that it can’t access the repo without a license. So we’re just going to go ahead and disable that.

Terminal output showing errors when trying to run apt update, as the Proxmox enterprise repo cannot be contacted because the system does not have a valid registration key.

You can disable this from the command line in a similar manner to how we made changes to the other repos, but let’s do this one a little different and disable it form the GUI instead.

  1. Select your Proxmox node (mine is called Prox-edge-2) and then click on “Repositories” under the “Updates” section in the middle options tree thingy
  2. Click on the entry (anywhere on it) for the “Enterprise” repository that has a checkmark in front of it
  3. Click the “Disable” button

Screenshot of the proxmox GUI showing the repos that are configured. The enterprise repo for trixie is configured and enabled with a check mark symbol in front of it.

The entry no longer has a check mark in front of it

Screenshot of the proxmox GUI showing the repos that are configured. The enterprise repo for trixie is configured but has now been disabled. The check mark has been replaced with a grey dash (-) symbol in front of it.

The finish line

A final apt update to ensure there’s nothing left to do, and congratulations we. Are. Done.

  1. Final package refresh
    root@Prox-edge-2:~# apt update

Terminal output showing apt update running with no errors and also having no packages to update, indicating the system is now fully up to date.

If you have any questions/comments please leave them below.

Thanks so much for reading ^‿^

Claire

If this tutorial helped you out please consider buying me a pizza slice!