以下の情報は2021年3月に書かれたものです。
余ったHDDを見つけたので、せっかくなのでUSBブートさせました。 Ubuntuのチュートリアルを見た感じものすごく簡単にできそうだったので。
で、Ubuntu server 20.04(LTS)を手順通りインストールしたけれど、なぜかUbuntuサーバー20.04の起動がうまくいかない。ちなみに、下の記事に書かれている通りUbuntu Desktop 20.10ではうまくいきました。
色々調べた結果、下の記事の手順ならうまくいったので共有します。どうやらブートにはカーネルの解凍が必要みたいです。上記の記事ではsudo apt update
かsudo apt upgrade
で起動しなくなる現象はカーネルの未解凍が原因と思われます(下の記事によるとアップデートするたびに解凍が必要になるとのこと)。なので、下の手順ではブートの際カーネルを解凍するスクリプトを追加しています。なお、下記の手順の実行は自己責任でお願いします。また、細かい箇所は理解していない部分も多いので詳しくは下記の元ネタを参照してください。
なお、以下のサイト(英語)でも同様の手順で行なっているので参考にしてください。
日本語でほぼ同じ手法を行なった方がいたので、以下リンクを共有しておきます
材料
ハード
機種 | 備考 |
---|---|
HD-LC1.0U3-BKD | 2021年現在は中古のみ。電源付きだからか今のところ動作は安定していますAmazon |
Raspberry Pi 4B | 4Bでしか確認していませんが、おそらく他のラズパイでも可 |
SDカード | ブートローダーとファームウェアを更新するのに必要 |
ソフト
ソフト名 | バージョン |
---|---|
Ubuntu | 20.04.2 LTS (64bit) |
UbuntuかRaspberry Pi OSをSDカードに書き込む(省略可)
別の記事で解説したいるので、それを参照してください。元々UbuntuかRaspberry Pi OSをインストールしたSDカードがあればそれを使用してください。OSがインストールされたSDカードをRaspberry Piにさします。
ブートローダーを更新する
Raspberry PiにはEEPROMというメモリがあり、そこにbootloaderが入っています。Raspberry Pi 4BでUSBブートをするにはbootloaderのパージョンを2020-09-03以降にする必要があります。
元ネタはRaspbianを使っていますが、実はUbuntuでもeeprom設定を変更するパッケージをインストールすればbootloaderを更新できます。詳しくはUbuntuのチュートリアルを参照してください。Ubuntu上での手順としては以下の通りです。
# パッケージのインストール
$ 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に書き込む
別の記事解説しているので、それを参照してください。基本的にはSDカードに対して行うことをSSDやHDDに対して実行します。
Ubuntuを書き込んだSSD/HDDをマウントする
まず、SDカードをラズパイにさしてラズパイを起動します。ラズパイの起動を確認後、Ubuntuの設定を書き換えるためにSSD/HDDをラズパイにつなげます。
lsbkでUbuntuをインストールしたドライブが認識されているか確認します。
$ 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 /
元ネタでは以下のディレクトリをアンマウントと指示されていたが、今回使用した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
の中のファイルを書き換える必要があるが、正直面倒臭い。
元ネタではそのためのスクリプトを用意してくれていて、それを実行するだけでよい。ただし、公式の手順ではないので、ブートできなくなったら自己責任でお願いします。2021年3月現在だと以下のスクリプトはバージョン20.04.2
に対応しています。
sudo curl https://raw.githubusercontent.com/TheRemote/Ubuntu-Server-raspi4-unofficial/master/BootFix.sh | sudo bash
以上のコマンドを実行し終えたら、アンマウントします。
sudo umount /mnt/boot
sudo umount /mnt/writable
元ネタでは手動で設定する方法も解説している。そこまで翻訳する気力はなかったので、リンク先を読んでください。
日本語でほぼ同じ手法を行なった方がいたので、以下リンクを共有しておきます
(参考)bootloader設定を変更する
上でもうまくいかなかった場合、以下の手順も試してください。多分いらないです。
ブートの順番を指定してUSBでブートを行うように変更します。
まず、ブートローダーの設定を書き出します。
sudo apt install rpi-eeprom
sudo vcgencmd bootloader_config > bootconf.txt
bootconf.txtを開くとBOOT_ORDER
が0xf41
になっているか確認します。なっていなければ、 0xf41
に変更します。意味としてはSDカードを何回かトライしたあとUSB Bootを試せと指示しています。
BOOT_ORDER=0xf41
あとは書き換えたテキストファイルをbinファイルにしてeepromをアップデートします。
$ 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
再起動します。
sudo reboot