# How to netboot Ubuntu 22.04

The Ubuntu 22.04 (jammy) images are not compatible with NBD boot out of the box as they lack the `nbd-client` package in their seed. However, you can modify the image to make it compatible.

## On the Pi

Fire up rpi-imager and flash Ubuntu 22.04.4 server onto an SD card, then boot that SD card on your Pi (the model does not matter provided it can boot the image).

Warning

Do not be tempted to upgrade packages at this point. Specifically, the kernel package must not be upgraded yet.

Install the `linux-modules-extra-raspi` package for the currently running kernel version, and the `nbd-client` package.

    $ sudo apt install linux-modules-extra-$(uname -r) nbd-client

On Ubuntu versions prior to 24.04, the `nbd` kernel module was moved out of the default `linux-modules-raspi` package for efficiency. We specifically need the version matching the running kernel version because installing this package will regenerate the initramfs (`initrd.img`). We’ll be copying that regenerated file into the image we’re going to netboot and it must match the kernel version in that image. This is why it was important not to upgrade any packages after the first boot.

We also need to install the NBD client package to add the `nbd-client` executable to the initramfs, along with some scripts to call it if the kernel command line specifies an NBD device as root:

We copy the regenerated `initrd.img` to the server, and shut down the Pi. Adjust the `ubuntu@server` reference below to fit your user on your server.

    $ scp -q /boot/firmware/initrd.img ubuntu@server:
    $ sudo poweroff

## On the server

Download the same OS image to your server, verify its content, unpack it, and rename it to something more reasonable.

    $ wget http://cdimage.ubuntu.com/releases/22.04.4/release/ubuntu-22.04.4-preinstalled-server-arm64+raspi.img.xz
     ...
    $ wget http://cdimage.ubuntu.com/releases/22.04.4/release/SHA256SUMS
     ...
    $ sha256sum --check --ignore-missing SHA256SUMS
    ubuntu-22.04.4-preinstalled-server-arm64+raspi.img.xz: OK
    $ rm SHA256SUMS
    $ mv ubuntu-22.04.4-preinstalled-server-arm64+raspi.img jammy.img

Next we need to create a cloud-init configuration which will perform the same steps we performed earlier on the first boot of our fresh image, namely to install `nbd-client` and `linux-modules-extra-raspi`, alongside the usual user configuration.

    $ cat << EOF > user-data
    #cloud-config

    chpasswd:
      expire: true
      users:
      - name: ubuntu
        password: ubuntu
        type: text

    ssh_pwauth: false

    package_update: true
    packages:
    - nbd-client
    - linux-modules-extra-raspi
    EOF

See the cloud-init documentation, a this series of blog posts for more ideas on what can be done with the `user-data` file.

## Preparing the image

When preparing our image with nobodd-prep we must remember to copy in our `user-data` and `initrd.img` files, overwriting the ones on the boot partition.

    $ nobodd-prep --size 16GB --copy initrd.img --copy user-data jammy.img

At this point you should have a variant of the Ubuntu 22.04 image that is capable of being netbooted over NBD.