Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

Raspberry Pi 5からは電源ボタンが付くことになりました。Raspberry Pi 4まではご存じのようにハード的に電源ボタンはありません。

よくある事例として、電源がいきなり遮断されmicroSDカードのファイルシステムが壊れることがあります。

何もRaspberry Piに限った話ではなく、microSDに代表されるような揮発性メモリーでは避けられないことです。

ハードに電源ボタンがあっても、停電や間違って電源を抜いてしまうこともあるでしょう。電気的にデータを保持しているmicroSDカードだと心配ですよね。

もちろん、何をどうしても壊れる時は壊れますけど・・・。

いきなり電源が遮断されても、なるべく保護する目的として、パーティション単位でROM化(Read Only Memory)する方法を試してみましょう。

Raspberry Pi OSだと今や簡単にできます。

基本はどちらも同じようにROM化できます。

今となってはraspi-configで行う方が簡単になりましたから、root-roは参考までに載せておきます。

raspi-configだけでOK

Raspberry Pi 2や3Bの頃、ROM化させて使うブログをよく目にしました。Stretchの頃だったかな。

当時のことは忘れてしまいましたが、今ではraspi-configの設定で簡単にできます。

公式から用意されているやり方です。電源遮断による故障を軽減する目的なら、ブートパーティションのROM化で充分です。

環境はいつものです。

  • Raspberry Pi OS 64bit bullseye
  • microSDカード 32GB

Raspberry Pi OSの場合

2つの質問に答えるだけです。

sudo raspi-config
4 Performance Options --> P3 Overlay File System

2つの質問で有効(enable)するだけです。簡単になったものだ。

1.Would you like the overlay file system to be enabled?
オーバーレイ ファイル システムを有効にしますか?

2.Would you like the boot partition to be write-protected?
ブートパーティションを書き込み禁止にしますか?

再起動して有効

元に戻すには、先程と同じようにraspi-configで無効(disable)にして再起動すればOKです。

同じ事はコマンドでもできます。

有効にする場合

sudo raspi-config nonint enable_overlayfs
sudo reboot

コマンドで元に戻す場合

enableをdisableにして再起動します。

sudo raspi-config nonint disable_overlayfs
sudo reboot

実行するとupdate-initramfs: Deleting /boot/initrd.img-6.1.21-v8+-overlayと表示されオーバーレイが削除されました。

但し、これだけだとブートパティションの書き込み禁止が戻りませんでした。オーバレイを削除して無効にしただけだからでしょう。

/bootをrwにしてリマウントさせます。

suudo mount -o remount,rw /boot

これで元に戻りました。

確認する

確認は、df -hコマンドやmountコマンドが分かりやすいでしょう。

/dev/rootのマウントポイント/(ルート)がoverlay表示になっています。

変更前(通常時rw)
df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  3.8G   24G  14% /
devtmpfs        3.6G     0  3.6G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           1.6G  1.3M  1.6G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  255M   32M  224M  13% /boot
tmpfs           782M   20K  782M   1% /run/user/1000

変更後(ROM化ro)
df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         3.9G  229M  3.6G   6% /
udev            3.6G     0  3.6G   0% /dev
tmpfs           782M  1.3M  780M   1% /run
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  255M   47M  209M  19% /boot
tmpfs           782M   20K  782M   1% /run/user/1000

mountコマンドで確認してみると、しっかりro(ReadOnly)となっていますね。

ROM化した
mount

overlay on / type overlay (rw,noatime,lowerdir=/lower,upperdir=/upper/data,workdir=/upper/work)

/dev/mmcblk0p1 on /boot type vfat (ro,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

通常時
mount

/dev/mmcblk0p2 on / type ext4 (rw,noatime)

/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

(参考)もしもroot-roを使うなら

Ubuntuではaptでインストールできるoverlayrootが有名みたい。でも、Raspberry Pi OSではaptでインストールできません。

代わりにgithubにあった「root-ro」はbullseyeでも動作します。

GitHub - josepsanzcamp/root-ro: Read-only Root-FS with overlayfs for Raspian

Dockerでの利用法も記載がありました。パフォーマンスに影響する旨がありますので注意が必要でオススメしません。

Raspberry Pi OSを使うなら、最早raspi-configで事足りることもあり、参考程度にインストール方法を載せておきます。

root-roのインストール

最初に必要なアプリをインストール。

sudo apt install git rsync gawk busybox bindfs
git clone https://github.com/josepsanzcamp/root-ro.git

セットアップ

sudo rsync -va root-ro/rootfs/ /
sudo mkinitramfs -o /boot/initrd.gz

sudo bash
sudo echo -e "\n# root-ro\ninitramfs initrd.gz" >> /boot/config.txt
exit

sudo reboot

echoのコマンドだけスーパーユーザーでなければならないため、sudo bashで一時的に実行しました。exitで通常ユーザーに戻れます。(もしくはsu ユーザー名) sudo bash はsudo suでもいいのだけど、sudo suって古いみたいね。知らなかった。

詳しく知りたい方はこちら

su vs sudo -s vs sudo -i vs sudo bash

最後に再起動して完了です。

df -hで確認してみます。

ROM化前の状態。

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  3.8G   24G  14% /
devtmpfs        3.6G     0  3.6G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           1.6G  1.3M  1.6G   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1  255M   47M  209M  19% /boot
tmpfs           782M   20K  782M   1% /run/user/1000

ROM化後

Filesystem      Size  Used Avail Use% Mounted on
udev            3.6G     0  3.6G   0% /dev
tmpfs           782M  1.3M  780M   1% /run
/dev/mmcblk0p2   29G  3.8G   24G  14% /mnt/root-ro
tmpfs           3.9G  125M  3.7G   4% /mnt/root-rw
tmpfs           3.9G     0  3.9G   0% /mnt/boot-rw
/dev/mmcblk0p1  255M   47M  209M  19% /mnt/boot-ro
/mnt/boot-ro    255M   47M  209M  19% /mnt/boot-ro2
overlay         3.9G  125M  3.7G   4% /
overlay         3.9G     0  3.9G   0% /boot
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           782M   20K  782M   1% /run/user/1000

/mnt/root-ro/mnt/root-rwがあります。overlayの表示もありますね。

書き込み可能へ変更するリマウントするコマンド

/

sudo mount -o remount,rw /mnt/root-ro

/boot

sudo mount -o remount,rw /mnt/boot-ro

書き込み不可のROM化は

sudo mount -o remount,ro /mnt/root-ro
sudo mount -o remount,ro /mnt/boot-ro

最初のインストールが面倒ですけど、これも簡単ですね。

元に戻す手順

元に戻すには、ROM化された状態(オーバーレイ)を解除し、書き込み可能、/boot/config.txtファイルの記述をコメントアウトさせるコマンドを実行するだけです。

sudo reboot-rw

更にまたROM化させるには、次のコマンドです。

sudo reboot-ro

OSのバージョンアップなどを行うには、一度解除してから実行し、その後また元に戻すという作業が一番無難です。

オーバーレイのイメージ

レイヤー(層)を重ねて、書き込む時はOverlay側、読み出しは元々のmicroSDカード内からという考え方で理解しました。 microSD側がLower、オーバーレイ側をupperと表現します。

似ているのはDockerですね。Docker内と実際のシステム側と機能をバインド(関連付け)しています。 オーバーレイもファイルシステムをバインドしているからです。

ROM化した後の挙動

当然のことながら、システムに関わる設定の変更(例:ネットワーク接続設定)をしても、ROM化されていれば変更が適用されません。

一時的に変更できても再起動すれば元に戻ってしまいます。これはテンポラリファイルが削除されるためです。

システム設定のみならず、OSのアップデートも同じです。updateコマンドは無意味です。

中にはROM化した後、Uper、Lower層での同期更新の方法を見かけます。どちらかといえば、全体的に一旦ROM化を解除し、アップデートなど変更を加えてから再びROM化するのが安全です。

ROM化は、電源をブチッと切る、不測の事態で切られる、といったことからシステムの破損を防ぐやり方になります。

あくまで軽減であり絶対ではありません。

かなり防げるハズなので、ちょっと安心ですね。

簡単なので、システムとしてそのまま使いたい仕組みに利用してみてはいかがでしょうか。

■Pi 5は8GBモデルがオススメ

Swap(スワップ)ファイルの停止

ついでに、スワップファイルの作成をやめる方法も載せておきます。(bullseyeで確認済み)

システムファイルをROM化するとスワップファイルは意味がありません。(/varは問題なくrwか?)

それに、Raspberry Pi 4のメモリー8GBもあれば普段は作成されません。メモリー4GBでも余裕がある使い方なら、スワップファイルを作成されるより速くなると思います。

速度的には気持ち程度でも、ROM化するならやっておきましょう。

3行なので簡単です。

# Swapファイル作成をやめる
sudo dphys-swapfile swapoff
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

場合によってuninstallしてもいい。
(sudo dphys-swapfile uninstall)

次のように表示されればOKです。

Synchronizing state of dphys-swapfile.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install disable dphys-swapfile

有効に戻すには、先程とは逆にstart、enable、と実行していくことになります。

Raspberry Pi Compute Moduleの場合

Raspberry Pi CM系は、eMMC(Lite以外)が搭載されています。eMMCはmicroSDカードともちょっと仕様が異なるので、同じようにはできるのか試していません。(持ってない!)

少し古い情報ですが、次のサイトがROM化を扱っていました。

tshell_blog

Raspbian buster-liteでCM3+のeMMCをROM化 - tshell_blog 前回はRaspberry Pi Compute Module 3+(CM3+)にSDカードを増設しました。 tshell.hatenablog.com 産業用途で使う場合であってもなくても,予期しない電源断によってファイ…

おまけ

ROM化してあるのかどうか分からなくなってしまうことがあります。一見すると分かりませんからね。

検索していたら、ターミナルでoverlayfsの状態を分かりやすくする手立てが見つかりました。

Raspberry Piでoverlayfsを使う – ともの技術メモ

これならメッセージと色分けで分かりやすいですね!素晴らしい。

リンク先の通りに.bashrcを編集するだけです。こちらも合わせて設定しておくと見分けが付いて助かります。

変更するファイル

nano ~/.bashrc

直ちに適用するコマンド

source ~/.bashrc