はじめに

本記事ではRaspberry Pi OS(bullseye)からUbuntu 24.04.1 LTSへ移行した際の手順を記載します。

OS移行のきっかけとしては、元々利用していたRaspberry Piでは、ユーザスペースが32bit、カーネルスペースが64bitで動作していました。

$ uname -m
aarch64
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=81004d065160807541b79235b23eea0e00a2d44e, for GNU/Linux 3.2.0, stripped

このままでも特に動作は問題なかったのですが、最初にラズパイをセットアップしてから時間が経っていたのと、使い慣れたUbuntuにしたいと思い、移行してみました。

環境

  • Raspberry Piのモデル
cat /proc/device-tree/model
Raspberry Pi 4 Model B Rev 1.5
  • OS
lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye
  • 使用したRaspberry Pi Imager:v1.8.5

ラズパイのブート順序を変える

今まではラズパイをSDカードからブートしていたのですが、今回はSSDでブートすることとしました。

Raspberry Pi 4では基本的にはUSBブートがサポートされているという情報を見ましたが、Ubuntuをインストールする前に念のため以下の通りブートローダーを最新化します。

$ sudo apt update
$ sudo apt full-upgrade
$ sudo rpi-eeprom-update -d -a
$ sudo reboot

その後、以下のコマンドでブート順序を変更します。

$ sudo rpi-eeprom-config --edit
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf14

「BOOT_ORDER」の部分が起動順序を制御する項目で、「0x」から始まる3桁のvalueはそれぞれ以下の意味を持ちます。

  • 0xf:フィールドの最初のブートモードに戻り再起動を繰り返す

  • 0x1:SDカードでブートする

  • 0x4:USBデバイスでブートする

BOOT_ORDERの内容は右から左に読み込まれます。

今回の「0xf14」だとUSBブート(0x4)→SDカード(0x1)の順でブートする設定としました。

その他の項目については以下のサイトを参照してください。

https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER

Raspberry Pi ImagerでSSDにUbuntu OSイメージを書き込む

ここからは、Raspberry Pi Imagerを用いてUbuntu をSSDに書き込みます。

今後、GUIアプリを触る可能性があるため、今回はDesktop版を選択しました。

まずは、Raspberry Pi Imagerをインストールします。

インストール後、Raspberry Pi Imagerを起動すると以下のような画面が立ち上がります。 open_imager

Raspberry Piデバイス > デバイスを選択より利用するラズパイのモデルを選択します。 select_device

OS > OSを選択 > Other general-purpose OS > Ubuntu > Ubuntu Desktop 24.01.1 LTS(64-bit)を選択します。 select_ubuntu_1 select_ubuntu_2 select_ubuntu_3

ストレージをクリックし、Ubuntuを書き込むSSD等をクリックします。 select_storage

次へをクリックし、OSを書き込むデバイスのデータが削除される旨が表示されます。問題なければ、はいをクリックしOSの書き込みを開始します。 check_storage

OSの書き込みが終わればRaspberry Pi Imagerでの作業は終了です。

Ubuntuの起動

Raspberry Pi ImagerでOSを書き込んだSSDをラズパイにセットし、OS再起動を実施します。

そうすると、SSDでのブートが開始され、Ubuntuのインストールが始まります。

画面のガイダンスに沿って、言語、キーボードレイアウト、Wi-Fiの設定等を行えばUbuntuが起動します。(撮影環境がなかったため、インストール時の画面キャプチャは割愛させていただきます)

ここまでで、Ubuntuのインストールが完了しました。

その他の設定

ここからは個人的に行った設定で、若干ハマったポイントを備考のため記載します。

NeovimをTarballまたはAppImageからインストールすると起動できない

こちらに記載されているTarballまたはAppImageからNeovimをインストールすると、「nvim cannot execute binary file: Exec format error」というエラーが表示され起動できませんでした。

$ ./nvim.appimage
-bash: ./nvim.appimage: cannot execute binary file: Exec format error

$ ./nvim.appimage --appimage-extract
-bash: ./nvim.appimage: cannot execute binary file: Exec format error

「Exec format error」について少し調べてみると、実行したバイナリやコマンドの形式が正しくない場合に発生する模様。

WSL2でインストールしたUbuntuではエラーが発生していなかったので、ラズパイ用のUbuntuだと何かが足りていないのかなと思いつつ、結局snapからNeovimをインストールしました。

# snapのインストール
$ sudo apt update
$ sudo apt install snapd
$ sudo reboot

# 最新のsnapdのインストール
$ sudo snap install snapd

# Neovimのインストール
$ sudo snap install nvim --classic

snap版のNeovimをupdate-alternativesでデフォルトエディタに設定するとsnapコマンドが呼び出される

visudoコマンド等のエディタを呼び出す際、デフォルトだとnanoが呼び出される設定となっていたため、Neovimで起動する設定に変更したいと考えました。

$ sudo update-alternatives --config editor
There are 3 choices for the alternative editor (providing /usr/bin/editor).

## Selection Path Priority Status

- 0 /bin/nano 40 auto mode
  1 /bin/ed -100 manual mode
  2 /bin/nano 40 manual mode
  3 /usr/bin/vim.tiny 15 manual mode

Press <enter> to keep the current choice[*], or type selection number:

Neovim等の別途インストールしたエディタをデフォルトとしたい場合、update-alternativesコマンドのinstallオプションを実行すると、外部エディタを読み込ませることができます。

# 50は優先度でデフォルトエディタよりも高い優先度を設定する
$ sudo update-alternatives --install /usr/bin/editor editor $(which nvim) 50
update-alternatives: using /snap/bin/nvim to provide /usr/bin/editor (editor) in auto mode

ただし、snapでインストールしたNeovimだとsnapが起動されてしまい、visudoが実行できなくなる事象が発生しました。

$ sudo visudo
error: unknown command "--", see 'snap help'.
visudo: /etc/sudoers.tmp unchanged

editorコマンドを確認すると、Neovimへのシンボリックリンクが張られていますが、結果としてNeovimではなくsnapコマンドが実行されてしまいました。

$ which editor
/usr/bin/editor
$ ll /usr/bin/editor
lrwxrwxrwx 1 root root 24 Feb 17  2024 /usr/bin/editor -> /etc/alternatives/editor*
$ ll /etc/alternatives/editor
lrwxrwxrwx 1 root root 14 Oct  4 11:26 /etc/alternatives/editor -> /snap/bin/nvim*
$ editor
The snap command lets you install, configure, refresh and remove snaps.
Snaps are packages that work across many different Linux distributions,
enabling secure delivery and operation of the latest apps and utilities.

Usage: snap <command> [<options>...]

Commonly used commands can be classified as follows:

           Basics: find, info, install, remove, list
          ...more: refresh, revert, switch, disable, enable, create-cohort
          History: changes, tasks, abort, watch
          Daemons: services, start, stop, restart, logs
      Permissions: connections, interface, connect, disconnect
    Configuration: get, set, unset, wait
      App Aliases: alias, aliases, unalias, prefer
          Account: login, logout, whoami
        Snapshots: saved, save, check-snapshot, restore, forget
           Device: model, remodel, reboot, recovery
     Quota Groups: set-quota, remove-quota, quotas, quota
  Validation Sets: validate
        ... Other: warnings, okay, known, ack, version
      Development: validate

For more information about a command, run 'snap help <command>'.
For a short summary of all commands, run 'snap help --all'.

Neovimのバイナリを直接登録できないかと思いましたが、snap版だとバイナリをインストールしないようでした…

そのため、無理やりですがupdate-alternativesでNeovimを登録しつつ、「editor」というワードをNeovimのエイリアスとして登録することで、Neovimをデフォルトエディタとして認識することができました。

$ sudo snap alias nvim editor
Added:

- nvim as editor

$ snap aliases
Command Alias Notes
nvim editor manual

こうすることで、editorコマンドやvisudoを実行するとNeovimが起動できるようになります。

試しにvisudoを実行し、コマンドモードで「:version」を実行するとNeovimのバージョンが参照でき、Neovimで起動していることが確認できます。 visudo_version

ただし、この方法だとシステム全体でeditorコマンドを実行した際にNeovimが起動してしまうため、意図しない挙動を引き起こしてしまうプログラムがあるかもしれません。

今回はあくまで個人利用のため設定しましたが、何か不具合があればこちらで情報をアップデートしたいと思います。

Tailscale Serveで設定したドメインにアクセスするとERR_SSL_PROTOCOL_ERRORやNET::ERR_Certificate_Transparency_Requiredと表示される

以前投稿した記事で、ラズパイにPhotoPrismとTailscaleを導入していました。

ラズパイのホストネームをOS移行前と同じものに設定し、再度Tailscaleの登録+Tailscale Serveの設定をしたのですが、OS移行前に登録したマシンをTailscale admin consoleから削除することを失念しており、TailscaleのMachine名が「ホスト名-1」と連番がついたものになってしまいました。

この際、Tailscale Serve等で利用するドメインも連番がついてしまうため、Tailscale admin consoleから古いMachine情報を削除し、Machine名を編集したところ、元々利用していたドメインが再利用できるようになりました。 edit_and_remove

その後、Google Chromeからラズパイに割り振られたドメインに接続すると、「ERR_SSL_PROTOCOL_ERROR」というエラーが表示されてしまいました。 connection_error

こちらはTailscale admin consoleに登録されているドメイン(ホスト名)とラズパイ側で設定したTailscale Serveのドメインが不一致になっていたためエラーとなったと考え、以下の通り、一度ラズパイ側のTailscale Serveの設定をリセットし、再度Tailscale Serveを設定しました。

$ sudo tailscale serve reset
$ sudo tailscale serve --bg http://127.0.0.1:2342

再度、ラズパイに割り振られたドメインに接続すると、今度は「NET::ERR_Certificate_Transparency_Required」というエラーが表示されてしまいました。

こちらはChrome特有のSSL証明書に関するエラーとのことで、PCのSSLキャッシュクリア(Windowsであればインターネットオプション > コンテンツ > SSL状態のクリア)を実施し、しばらくしたら接続できるようになりました。

最後に

長くなりましたが、無事にラズパイにUbuntuを導入することができました。

Raspberry Pi Imagerを利用すると簡単にOSイメージを用意できていいですね。

正直なところ、今はラズパイでなくてもできることしかやれていないので、何かラズパイだからこそできることをやってみたいです…

参考にさせていただいたサイト