気まま研究所ブログ

ITとバイク、思ったことをてきとーに書きます。

Raspberry Pi 3の/boot領域を拡張する

f:id:AonaSuzutsuki:20190521152952p:plain

Raspberry Piで使われるOSは16GBを想定してるのかboot領域が半端なく小さいです。
ただ単にOSを使うだけなら大した問題にはならないのですが、OSのメジャーアップグレードなどをしようと思うと容量が足りなくて詰みます。
私も今回、Ubuntu Mate 16.04.6 LTSからUbuntu Mate 18.04 LTSに上げようと、指示通り'sudo do-release-upgrade'を実行したものの/boot領域が足りないと言われて失敗しました。
どうしたものかと思っていたところ、パーティションを末尾に追加することで対応可能とのことで試してみることに。

ただし、今回私が所有するMicroSDカードリーダーがWindowsしか対応しないものだったのでパーティションの変更作業はすべてRaspberry Piで行います。

事の発端

事の発端は初めにも書いたとおり、Ubuntu Mateのメジャーアップグレードをしようと思ったところ「/boot領域が足りないからスペース空けろ」と怒られたことでした。

f:id:AonaSuzutsuki:20190521152611j:plain
ログの通りだと7.75MBほど開ければいいらしいです。
とはいえ、デフォルトだと64MBしか/boot領域は割り当てられていない上に/bootを使うようなことはしてないので正直開けるのがきつい。
apt-get cleanしてもパッケージ精査しても開けれる気がしない...。

そこで、Work Around for Ubuntu-Mate on Raspberry-Pi Software Updater Errorを参考に/boot領域を拡張(実際は新規作成)してやります。

検証環境

  1. Raspberry Pi 3 Model B
  2. Windows 10 Pro x64
  3. USBメモリ 16GB
  4. MicroSD 64GB

注意事項

本記事では必須ではないものの、ラズパイのOTP ROM(One Time Programmable ROM)に書き込む手順や、パーティションを変更します。
ですので場合によってはOSが吹っ飛んだり不具合が生じる可能性があります。
もしここで失敗しても当方は責任を負いませんのでよろしくお願いします

下準備(オプション)

LinuxマシンとLinuxでも認識するMicroSDカードリーダーがあればこの作業は不要です。
また、Raspberry Pi 3 Model B+の方はUSB起動可能にする項目はおそらく不要です。

USBメモリにRaspbianをブータブルで書き込む

ブータブルUSBの作成方法はいろいろありますが、ここでは「Rufus」をお借りします。

まずはRaspbian Stretch with desktopを用意します。
執筆当時は「date 2019-04-08」が最新でした。
ちなみに公式から落とすとめちゃくちゃ遅いのでミラー(http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)の使用をおすすめします。

ダウンロードできたらzipファイルを展開し、Rufusを起動します。
f:id:AonaSuzutsuki:20190521152642p:plain
バイスのドロップダウンリストで書き込みたいUSBを選択し、ブートの種類の横にある選択ボタンで先程展開したimgファイル(2019-04-08-raspbian-stretch.img)を選択します。
あとはスタートを押し、気長に待って書き込みが終われば終了です。

Raspberry PiをUSB起動可能にする(オプション)

この作業はRaspberry PiのOTP ROMに書き込むため一度書き込むと二度と書き換えはできなくなります
書き換える機会は殆どないと思いますが、他に書き換える機会がありそうな方はLinuxを別で用意して書き換えたほうが良いでしょう。

私の場合はマイコンとして使ってないので遠慮なく書き換えていきます。

まずはファームウェアをアップデートします。
聞いた話によると新しいファームウェアでサポートされたらしいのでアップデートしないと多分動かないと思います。

$ sudo rpi-update

ログ取り忘れましたが、指示通り進めるとすぐ終わったと思います。

次にOTP書き換えを行います。
書き換えの前にotp_dumpで値を確認しておきます。
なお、値の意味は調べてないのでわかりませんが、どうやらUSBブートに関する値が含まれているようです。

$ vcgencmd otp_dump | grep 17:
17:1020000a

ここからが一度やると後戻りできないので慎重にします。
もし他に書き込みたい項目があればここでやっておきましょう。
また、当方では一度きりしかコマンドの動作確認していないので必要に応じて他のサイトも参考にしてください。

# USBブート可能になるようにconfig.txtへ書き込み
$ echo "program_usb_boot_mode=1" | sudo tee -a /boot/config.txt
program_usb_boot_mode=1
# 再起動
$ sudo reboot

再起動後に先程のotp_dumpを確認します。

$ vcgencmd otp_dump | grep 17:
17:3020000a

すると「17:3020000a」に変化しているはずなのでこうなっていればOK。
なっていなかったら・・・お疲れ様です。

USBメモリを指してRaspberry Piを起動

これまでの設定がうまくいってるとUSBを指して電源ぶっ刺すだけでUSBメモリのRaspbianが起動します。
初期設定が出ますが、適当に進めておきます。

Raspbianが立ち上がったらMicroSDを指す

Raspbian起動後にMicroSDを指します。
すると外部ストレージとして読み込まれるので下準備はひとまず終了します。

/bootの拡張

PI_BOOT内部をローカルにコピー

f:id:AonaSuzutsuki:20190521152713p:plain
PI_BOOTを一度削除するので内部を総バックアップします。
コピーについてはファイルビューアでいいので全選択してデスクトップかどこかにコピーしましょう。
今回はデスクトップにbootディレクトリを作成し、その中にコピーしました。

GPartedのインストール

次にパーティションを編集するアプリケーションをインストールします。

sudo apt-get install gparted

インストールが完了するとラズベリーマークの設定の中にGPartedがあるはずなので起動します。

PI_BOOT領域の削除

まずはPI_BOOTを削除します。
データを消す作業なので、MicroSD(/dev/mmcblk0)を操作しているのかを確認してから作業しましょう。
また、GPartedでは上のメニューに有るチェックマークを押すまで適用されないのでミスった場合はチェックマークの隣りにある巻き戻すボタンを押しましょう。

まずは/dev/mmcblk0p1をアンマウントします。 f:id:AonaSuzutsuki:20190521152740p:plain
/dev/mmcblk0p1を右クリックするとアンマウントがあるはずなのでそれでアンマウントします。

同じ要領で/dev/mmcblk0p1を削除します。
f:id:AonaSuzutsuki:20190521152755p:plain
未割り当てになれば完了です。

PI_ROOTのりサイズ

次に/dev/mmcblk0p2をリサイズします。

まずは先程と同じ要領で/dev/mmcblk0p2をアンマウントします。
その後に右クリックするとリサイズが選べるはずなので/dev/mmcblk0p2をリサイズします。
f:id:AonaSuzutsuki:20190521152934p:plain
前方はそのままにして後方を適当にサイズを指定します。
今回は64GBのSDなのでガバっと1GB割り当てました。
これだけあれば早々困ることはないでしょう。
なお、前方を変更するとパーティションが移動してそのままでは起動できなくなる可能性があります(未検証)。

末尾をPI_BOOTとして作成

リサイズでできた末尾領域をFAT16パーティションを作成します。
なお、この時のラベルはPI_BOOTにしておきましょう。
f:id:AonaSuzutsuki:20190521152952p:plain

完了するとPI_BOOTでパーティションが作成されます。
f:id:AonaSuzutsuki:20190521153011p:plain
なお、写真ではマウントされていますが、現段階ではマウントされません。

新しいPI_BOOTにローカルからコピー

まずは作成したPI_BOOT領域をマウントします。

$ mkdir ~/boot
$ sudo mount /dev/mmcblk0p1 ~/boot

最後にコピーしたPI_BOOTのデータを新しいPI_BOOT領域に書き込みます。
ここではただ単に書き込むだけなのでルートのままコマンドで書き込むことにします。

sudo cp -r ~/Desktop/boot/* ~/boot

あとはラズパイに挿していつも通り電源を入れて起動すれば完了です。
念の為dfコマンドで容量チェックしておきましょう。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        58G   11G   47G  19% /
devtmpfs        484M     0  484M   0% /dev
tmpfs           488M   12K  488M   1% /dev/shm
tmpfs           488M  2.0M  486M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           488M     0  488M   0% /sys/fs/cgroup
/dev/mmcblk0p1  1.0G   25M 1000M   3% /boot
tmpfs            98M     0   98M   0% /run/user/1000

エラーログを見たときは最新版でリカバリーするしかないかと諦めていましたが、ブート領域の作り直しで対応できたので助かりました。
それからアップグレードを実行したところ無事18.04.2 LTSにアップグレードすることができました。
にしてもデフォルト64MBって少なすぎないですかね・・・。