Raspberry PiをUSBブートさせる[Ubuntu Server 20.04(LTS)で]

以下の情報は2021年3月に書かれたものです。

余ったHDDを見つけたので、せっかくなのでUSBブートさせました。 Ubuntuのチュートリアルを見た感じものすごく簡単にできそうだったので。

https://ubuntu.com/tutorials/how-to-install-ubuntu-desktop-on-raspberry-pi-4#1-overview

で、Ubuntu server 20.04(LTS)を手順通りインストールしたけれど、なぜかUbuntuサーバー20.04の起動がうまくいかない。ちなみに、下の記事に書かれている通りUbuntu Desktop 20.10ではうまくいきました。

https://qiita.com/SogoK/items/76bc2891c72eff938157

色々調べた結果、下の記事の手順ならうまくいったので共有します。どうやらブートにはカーネルの解凍が必要みたいです。上記の記事では`sudo apt update`か`sudo apt upgrade`で起動しなくなる現象はカーネルの未解凍が原因と思われます（下の記事によるとアップデートするたびに解凍が必要になるとのこと）。なので、下の手順ではブートの際カーネルを解凍するスクリプトを追加しています。なお、下記の手順の実行は自己責任でお願いします。また、細かい箇所は理解していない部分も多いので詳しくは下記の元ネタを参照してください。

https://jamesachambers.com/raspberry-pi-4-ubuntu-20-04-usb-mass-storage-boot-guide/

なお、以下のサイト（英語）でも同様の手順で行なっているので参考にしてください。

https://www.instructables.com/Raspberry-Pi-4-USB-Boot-No-SD-Card/

https://sidelink.co.za/boot-ubuntu-server-from-usb-on-raspberry-pi-4/

日本語でほぼ同じ手法を行なった方がいたので、以下リンクを共有しておきます

https://raspberrypi.mongonta.com/nextcloud-raspi4/

## 材料

### ハード

| 機種 | 備考 |
|:-:|:-:|
| HD-LC1.0U3-BKD  | 2021年現在は中古のみ。電源付きだからか今のところ動作は安定しています[Amazon](https://www.amazon.co.jp/BUFFALO-USB3-0-外付けハードディスク-家電対応-HD-LC1-0U3-BKD/dp/B00VRK6N1W)  |
|  Raspberry Pi 4B |  4Bでしか確認していませんが、おそらく他のラズパイでも可 |
|  SDカード |  ブートローダーとファームウェアを更新するのに必要 |

### ソフト

| ソフト名 | バージョン |
|:-:|:-:|
|  Ubuntu | 20.04.2 LTS (64bit) |

## UbuntuかRaspberry Pi OSをSDカードに書き込む（省略可）

[別の記事](https://qiita.com/k_ken/items/9a71655400798f84d636#ラズパイにosをインストールする)で解説したいるので、それを参照してください。元々UbuntuかRaspberry Pi OSをインストールしたSDカードがあればそれを使用してください。OSがインストールされたSDカードをRaspberry Piにさします。

## ブートローダーを更新する

Raspberry PiにはEEPROMというメモリがあり、そこにbootloaderが入っています。Raspberry Pi 4BでUSBブートをするにはbootloaderのパージョンを2020-09-03以降にする必要があります。

[元ネタ](https://jamesachambers.com/raspberry-pi-4-ubuntu-20-04-usb-mass-storage-boot-guide/)はRaspbianを使っていますが、実はUbuntuでもeeprom設定を変更するパッケージをインストールすればbootloaderを更新できます。詳しくは[Ubuntuのチュートリアル](https://ubuntu.com/tutorials/how-to-install-ubuntu-desktop-on-raspberry-pi-4#4-optional-usb-boot)を参照してください。Ubuntu上での手順としては以下の通りです。

```bash
#　パッケージのインストール
$ sudo apt install rpi-eeprom
# bootloaderのパージョンを確認
$ sudo vcgencmd bootloader_version
Sep  3 2020 13:11:43
version c305221a6d7e532693cc7ff57fddfc8649def167 (release)
timestamp 1599135103
update-time 0
capabilities 0x00000000
```

## UbuntuイメージをSSDかHDDに書き込む

[別の記事](https://qiita.com/k_ken/items/9a71655400798f84d636#ラズパイにosをインストールする)解説しているので、それを参照してください。基本的にはSDカードに対して行うことをSSDやHDDに対して実行します。

## Ubuntuを書き込んだSSD/HDDをマウントする

まず、SDカードをラズパイにさしてラズパイを起動します。ラズパイの起動を確認後、Ubuntuの設定を書き換えるためにSSD/HDDをラズパイにつなげます。

lsbkでUbuntuをインストールしたドライブが認識されているか確認します。

```bash
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  48.9M  1 loop /snap/core18/1949
loop1         7:1    0  48.9M  1 loop /snap/core18/1990
loop2         7:2    0  61.6M  1 loop /snap/lxd/19040
loop3         7:3    0  28.1M  1 loop /snap/snapd/11115
loop4         7:4    0  61.7M  1 loop /snap/lxd/19206
loop5         7:5    0    27M  1 loop /snap/snapd/11043
sda           8:0    0 931.5G  0 disk 
├─sda1        8:1    0   256M  0 part 
└─sda2        8:2    0   2.8G  0 part 
mmcblk0     179:0    0  58.2G  0 disk 
├─mmcblk0p1 179:1    0   256M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    58G  0 part /
```

[元ネタ](https://jamesachambers.com/raspberry-pi-4-ubuntu-20-04-usb-mass-storage-boot-guide/)では以下のディレクトリをアンマウントと指示されていたが、今回使用したSDカードはUbuntuを使用したので必要ないかもしれない。

```
$ sudo umount /media/pi/writable
umount: /media/pi/writable: no mount point specified.
$ sudo umount /media/pi/system-boot
umount: /media/pi/system-boot: no mount point specified.
```

ディレクトリを作成してubuntuをマウントする。

```
$ sudo mkdir /mnt/boot
$ sudo mkdir /mnt/writable
$ sudo mount /dev/sda1 /mnt/boot
$ sudo mount /dev/sda2 /mnt/writable
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  48.9M  1 loop /snap/core18/1949
loop1         7:1    0  48.9M  1 loop /snap/core18/1990
loop2         7:2    0  61.6M  1 loop /snap/lxd/19040
loop3         7:3    0  28.1M  1 loop /snap/snapd/11115
loop4         7:4    0  61.7M  1 loop /snap/lxd/19206
loop5         7:5    0    27M  1 loop /snap/snapd/11043
sda           8:0    0 931.5G  0 disk 
├─sda1        8:1    0   256M  0 part /mnt/boot
└─sda2        8:2    0   2.8G  0 part /mnt/writable
mmcblk0     179:0    0  58.2G  0 disk 
├─mmcblk0p1 179:1    0   256M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    58G  0 part /
```

## 色々セットアップする

` /mnt/boot`と`/mnt/writable`の中のファイルを書き換える必要があるが、正直面倒臭い。

[元ネタ](https://jamesachambers.com/raspberry-pi-4-ubuntu-20-04-usb-mass-storage-boot-guide/)ではそのためのスクリプトを用意してくれていて、それを実行するだけでよい。ただし、公式の手順ではないので、ブートできなくなったら自己責任でお願いします。2021年3月現在だと以下のスクリプトはバージョン`20.04.2`に対応しています。

https://github.com/TheRemote/Ubuntu-Server-raspi4-unofficial/blob/master/BootFix.sh

```bash
sudo curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh | sudo bash
```

以上のコマンドを実行し終えたら、アンマウントします。

```bash
sudo umount /mnt/boot
sudo umount /mnt/writable
```


[元ネタ](https://jamesachambers.com/raspberry-pi-4-ubuntu-20-04-usb-mass-storage-boot-guide/)では手動で設定する方法も解説している。そこまで翻訳する気力はなかったので、リンク先を読んでください。

日本語でほぼ同じ手法を行なった方がいたので、以下リンクを共有しておきます

https://raspberrypi.mongonta.com/nextcloud-raspi4/

## （参考）bootloader設定を変更する

上でもうまくいかなかった場合、以下の手順も試してください。多分いらないです。

ブートの順番を指定してUSBでブートを行うように変更します。

https://ubuntu.com/tutorials/how-to-install-ubuntu-desktop-on-raspberry-pi-4#4-optional-usb-boot

まず、ブートローダーの設定を書き出します。

```bash
sudo apt install rpi-eeprom
sudo vcgencmd bootloader_config > bootconf.txt
```

bootconf.txtを開くと`BOOT_ORDER`が`0xf41`になっているか確認します。なっていなければ、 `0xf41`に変更します。意味としてはSDカードを何回かトライしたあとUSB Bootを試せと指示しています。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md

```
BOOT_ORDER=0xf41
```

あとは書き換えたテキストファイルをbinファイルにしてeepromをアップデートします。

```bash
$ rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt /lib/firmware/raspberrypi/bootloader/critical/pieeprom-2020-09-03.bin
$ sudo rpi-eeprom-update -d -f ./pieeprom-new.bin
```

再起動します。

```bash
sudo reboot
```