: O. Yuanying

Ubuntu で Raspberry Pi 5 の NVMe ブート

TL;DR

  • Mon 23 Sep 13:02:56 UTC 2024 のファームウェアだとデフォルトで NVMe に対応してるので何もせず NVMe に好きな OS を書き込めば勝手に起動する。
  • Ubuntu Server 24.04.01 だと ssh がデフォルトでパスワードログインがオフになっているため、ヘッドレスでインストールしたかったら user-data を変更する必要がある。

承前

Raspberry Pi 5 を衝動買いしてしまった。自宅で飼ってる Kubernetes クラスターのコントロールプレーンノードに Raspberry Pi 4 を使ってるのだけれども、etcdHighCommitDurations のアラートがよく出るようになってしまったのでノードをアップグレードしたかったのもある。

ということで、何はともあれ Raspberry Pi 5 に Ubuntu サーバーのインストールだ。

今回は PoE + NVMe を追加する HAT を買ったので、だいぶコンパクトになった。(2.5inch SSDはデカかった。)

ラズパイの状況確認

まずは SD カードにラズパイOSをインストールして NVMe に SSD を繋げた状態で状況を確認してみる。

lsblk を実行してみたところ、最初から NVMe の SSD が見えてる。

yuanying@raspberrypi:~$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  57.6G  0 disk
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0  57.1G  0 part /
nvme0n1     259:0    0 119.2G  0 disk

ファームウェアを確認してみたところ、どうやら最新っぽい。多分、つい最近公式で Raspberry Pi SSDs and SSD Kits が売り出されたのでそのタイミングで有効化されたのでは無いだろうか。

yuanying@raspberrypi:~$ sudo rpi-eeprom-update
BOOTLOADER: up to date
   CURRENT: Mon 23 Sep 13:02:56 UTC 2024 (1727096576)
    LATEST: Mon 23 Sep 13:02:56 UTC 2024 (1727096576)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader-2712/default)
            Use raspi-config to change the release.

ということで、eeprom も特に編集を行わず、Ubuntu を NVMe にインストールすることにする。

Ubuntu のインストール

Ubuntu のダウンロード

まずは、UbuntuのOSイメージをダウンロードしてくる。現時点で LTS の最新をダウンロード。

curl -LO https://cdimage.ubuntu.com/releases/24.04.1/release/ubuntu-24.04.1-preinstalled-server-arm64+raspi.img.xz

ダウンロードしたイメージをカスタマイズ

ラズパイにはキーボードやディスプレイを繋げずSSHからヘッドレスでインストールを完結したかったので、OSイメージをカスタマイズする。 ダウンロードしてきたOSイメージの最初のパーティションに user-data があるので、それを変更してやれば良い。

ので、まずはイメージを解凍。

xzcat < ubuntu-24.04.1-preinstalled-server-arm64+raspi.img.xz \
      > ubuntu-24.04.1-preinstalled-server-arm64+raspi.img

raspi.img の一つ目のパーティションをマウントする。手順は以下。

  1. raspi.img を loopback device として認識させる。
yuanying@raspberrypi:~ $ sudo losetup -f --show ubuntu-24.04.1-preinstalled-server-arm64+raspi.img
/dev/loop0
  1. パーティションを認識させる。
yuanying@raspberrypi:~ $ sudo partprobe /dev/loop0

yuanying@raspberrypi:~ $ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0         7:0    0   3.4G  0 loop
|-loop0p1   259:3    0   512M  0 part
`-loop0p2   259:4    0   2.9G  0 part
mmcblk0     179:0    0  57.6G  0 disk
|-mmcblk0p1 179:1    0   512M  0 part /boot/firmware
`-mmcblk0p2 179:2    0  57.1G  0 part /
nvme0n1     259:0    0 119.2G  0 disk
  1. loop0p1 をマウントする。
yuanying@raspberrypi:~ $ sudo mount -t vfat /dev/loop0p1 /mnt
  1. /mnt/usr-data を編集する。
yuanying@raspberrypi:~ $ sudo vi /mnt/user-data

自分は以下のエントリを追加した。

users:
- name: yuanying
  primary_group: staff
  groups: users, adm
  sudo: ["ALL=(ALL) NOPASSWD:ALL"]
  shell: /bin/bash
  ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvZ4sFxzmLCYdEm...
  1. 後処理
sudo umount /mnt
sudo losetup -D

アンマウントしてloopback deviceの関連付けを削除したら終了。

カスタマイズしたイメージをインストール

あとは NVMe に Ubuntu を書き込んで終了。

sudo dd if=ubuntu-24.04.1-preinstalled-server-arm64+raspi.img of=/dev/nvme0n1 bs=4M status=progress

SDカードを外して再起動したところ、無事起動した。