How to upgrade from Debian 12 / Bookworm to Debian 13 / Trixie

Table of Contents

Step by step upgrade process

Problems encountered

unbound not starting on reboot

On reboot, my unbound service was not starting properly with error:

systemd[1]: Starting unbound.service - Unbound DNS server...
(unbound)[921]: unbound.service: Referenced but unset environment variable evaluates to an empty string: DAEMON_OPTS
unbound[921]: [1756374105] unbound[921:0] error: node enp2s0:53 getaddrinfo: Name or service not known
unbound[921]: [1756374105] unbound[921:0] fatal error: could not open ports
systemd[1]: unbound.service: Main process exited, code=exited, status=1/FAILURE

I’m explicitly specifying interface names in unbound configuration server.interface setting.

Step 1: Migrate to systemd-networkd

I’ve switched to systemd-networkd instead of ifupdown since this seems like the new way to do it.

Before the switch, this was my configuration:

❯ networkctl
systemd-networkd is not running, output might be incomplete.
IDX LINK            TYPE      OPERATIONAL SETUP    
  1 lo              loopback  -           unmanaged
  2 enp2s0          ether     -           unmanaged
  3 wg0             wireguard -           unmanaged
  1. mv /etc/network/interfaces /etc/network/interfaces.save
  2. systemctl enable systemd-networkd (but don’t start it yet, your system is still running ifupdown)
  3. Create a file /etc/systemd/network/enp2s0.network with content
[Match]
Name=enp2s0
Type=ether

[Network]
DHCP=ipv4

[DHCPv4]
# Use this if you want to force DHCP-Registration with
# the MAC-Address instead of duid (DHCP Unique Identifier)
# This way you can pre-assign them in your DHCPD.
ClientIdentifier=mac
  1. Create a file /etc/systemd/network/wg0.network with content
[Match]
Name=wg0
Type=wireguard

[Link]
Unmanaged=yes

This makes systemd-networkd know about the wireguard interface but don’t try anything to manage it. I’m not interested in systemd-networkd to manage my VPN.

  1. reboot

After reboot, my configuration looks like:

# networkctl 
IDX LINK   TYPE      OPERATIONAL SETUP     
  1 lo     loopback  carrier     unmanaged
  2 enp2s0 ether     routable    configured
  3 wg0    wireguard routable    unmanaged

3 links listed.

Step 2: Make unbound service depend on network status

Create a file /etc/systemd/system/unbound.service.d/network-startup.conf with content:

# 
[Unit]
After=network-online.target

then reboot

Final words

My migration from Debian 12 to Debian 13 took me less than an hour.

Just a huge thank you to all the people involved in the Debian project that have made this major upgrade so accessible.