PL-R5のTrixie環境でReadonly化の検証

産業用Raspberry Pi は堅牢である必要があります。ハード面もソフト面でも要求されます。
中でも、システムファイルを読み込み専用(Readonly)に設定することで、意図しないシャットダウンでの破損の軽減や、不用意な変更が永続的に残らなくなり、より堅牢になります。

Raspberry Pi OS Trixieはこれまでのバージョンと異なる部分が多くなり、古い情報が使えなくなりました。
改めてTrixie環境でReadonly化を検証してみました。

今回の環境

試したRaspberry Pi 産業用のため、市販のRaspberry Pi CMとは多少異なります。

通信設定を確認

OverlayFS 有効化前に、必ず sudo apt update が正常終了することを確認してください。

raspi-config は内部で overlayroot パッケージを導入するため、ネットワークや DNS が不安定な状態で進めると設定途中で失敗します。
ネットワーク設定を確認するには、以下のようにipコマンドやnmcliコマンドを利用しました。

ip route
default via 192.168.0.1 dev eth0 proto static metric 100 
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.10 metric 100

nmcliコマンドで接続先名の確認をします。

nmcli connection show

もしもネットワーク接続がない場合は、NAMEにある接続先名を指定して設定します。
ネットワーク設定するコマンド例(eth0)です。
GUIのデスクトップ画面を操作しても構いません。

sudo nmcli connection modify "Wired connection 1" \
  ipv4.method manual \
  ipv4.addresses 192.168.0.10/24 \
  ipv4.gateway 192.168.0.1 \
  ipv4.dns 192.168.0.1 \
  ipv4.never-default no

以降は、sshで接続して進めていけます。

データ用の領域

PL-R5にはmicroSDカードスロットも搭載されています。(非Boot用)
eMMCを起動ROMにしても、microSDカードは書き込み可能なデータ領域としてマウントさせられます。
PL-R5はSSDドライブも増設可能です。

なお、市販のRaspberry Pi CM5は排他利用のパターンでeMMCとmicroSDカードはどちらかしか使えません。

これらは、キャリアボードの設計によるため注意が必要です。
今回の構成は、PL-R5のため、eMMCを起動ドライブとして、microSDをデータ領域にします。

■ 補足
PL-R5 + Raspberry Pi OS Trixieでは、microSD認識のためにdtoverlay=sdio-pi5/boot/firmware/config.txtに追記する必要がありました。
[ALL]の後に追記します。

書き込み可能な保存先を作成

別デバイスであるmicroSDドライブは、lsblkコマンドで調べると、mmcblk2p1として認識されていました。ここに/dataフォルダを作り、自動マウント(マウントの永続化)できるようにfstabへ追記していきます。

lsblk

NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0          7:0    0    2G  0 loop 
mmcblk0      179:0    0 29.1G  0 disk 
├─mmcblk0p1  179:1    0  512M  0 part /boot/firmware
└─mmcblk0p2  179:2    0 28.6G  0 part /
mmcblk0boot0 179:32   0    4M  1 disk 
mmcblk0boot1 179:64   0    4M  1 disk 
mmcblk2      179:96   0 28.8G  0 disk 
└─mmcblk2p1  179:97   0 28.8G  0 part 
zram0        254:0    0    2G  0 disk [SWAP]

/dataフォルダを作成しマウントします。

sudo mkdir -p /data
sudo mount /dev/mmcblk2p1 /data

UUIDを調べます。
UUIDはfstabに追記するときに必要です。

sudo blkid /dev/mmcblk2p1
/dev/mmcblk2p1: LABEL="data" UUID="76a0c4e4-5072-411f-ae8e-4daf55604603" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="3dfbf2f1-01"

/data を fstab へ追加

UUIDを指定して、fstabの最終行へ追記します。

sudo nano /etc/fstab

UUID=76a0c4e4-5072-411f-ae8e-4daf55604603 /data ext4 defaults 0 2

これで自動マウント設定も済みましたので、一度再起動してから、lsblkコマンドで確認しましょう。

ここまでの作業で準備は整いました。あとはOverlayFSを有効にしてシステムファイルを読み込み専用(Readonly)にするだけです。

OverlayFS 有効化

OverlayFSは、sudo raspi-configコマンドでメニューから辿って設定していきます。

OverlayFSの有効化手順

メニュー、Performance Options → Overlay File System → Enable

/bootパーティションは書き込み可能にする

本来はこれでOverlayFSが機能する筈ですが、今回の環境(公式OSとPL-R5)では有効になりませんでした。
これはoverlay moduleが未ロードだったことが原因でした。
バージョンによっても変わります。再起動後に有効にならなかった場合、次の解決方法を試してください。

OverlayFSにならなかった際の解決方法

正しく設定して再起動をしても、OverlayFSが効かない現象に遭遇しました。原因は他にもある場合はこの方法限りではありません。
overlay moduleが未ロードだった場合の対処方法です。

記事執筆時点での対処方法として、moduleをロードさせるよう明示的に追記すると成功しました。
環境によるかと思いますが、必要なmoduleの自動組み込み漏れを確認しました。

# modulesファイルを修正する
sudo nano /etc/initramfs-tools/modules

# 追記
overlay

# initramfsを更新
sudo update-initramfs -u

# 再起動
sudo reboot

これでOverlayFSが有効化された状態になります。
Raspberry Pi公式で修正されれば必要はありません。

/dataを除外設定

raspi-config方式でOverlayFSを有効にすると、先ほどの/dataも含めReadonly化されていることが分かります。
これだと目的によっては都合が悪いため、/dataは除外する設定を追記しておきます。

cmdline.txtに追記します。

sudo nano /boot/firmware/cmdline.txt

次のように、先頭にあるoverlayroot=tmpfs:recurse=0を追記します。

overlayroot=tmpfs:recurse=0

そして再起動。
すると、以下のコマンド実行の通り、除外前にroot-roと読み込み専用だった記載が変わったのが分かります。

mount | grep /data

/dev/mmcblk2p1 on /media/root-ro/data type ext4 (ro,relatime)
/media/root-ro/data on /data type overlay (rw,relatime,lowerdir=/media/root-ro/data,upperdir=/media/root-rw/overlay/data,workdir=/media/root-rw/overlay-workdir/data,uuid=on)

結果、rwの記載になりました。通常通りの読み書き可能です。

/dev/mmcblk2p1 on /data type ext4 (rw,relatime)

ちなみにルートはoverlayroot on / type overlayのままになっています。影響はありません。

mount | grep " on / "

overlayroot on / type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_,uuid=on)

2つのコマンドでOverlayFSかどうか確認してみてください。

mount | grep /data
mount | grep " on / "

■補足
recurse=0を指定すると、OverlayFS の対象はルートファイルシステム(/)だけになります。
今回のようにmicroSDカード上の/dataは別のファイルシステムとしてマウントしているため、/dataはOverlayFSの対象外となり、microSDカードへ直接書き込まれるようになるわけです。
実際には書きませんが、内部的にデフォルトはoverlayroot=tmpfs:recurse=1ということです。

変更時はOverlayFSの無効化

今回、読み書きができる/dataフォルダを利用するアプリの出力先へ指定するような使い方が想定できます。
後からアプリを追加したい、設定を変えたい時など、ルートファイルシステムが読み込み専用では再起動するとなくなってしまいます。
一時的に無効にして、各変更や追加を加えたあと、再び有効化する使い方をオススメします。

この追加や変更は、OS自体の設定変更やパッケージの更新を行う場合もOverlayFSを無効化しないとなりません。

無効化する手順は、以前までのコマンド実行ではなく、有効化した手順と全く同じに行うだけです。
今度はDisableを選びます。

OverlayFSの無効化手順

メニュー、Performance Options → Overlay File System → Disable

OverlayFSの無効化については、こちらもraspi-configの操作だけでは元に戻らず、設定ファイルの確認が必要でした。
無効化を完了するには次の解決策を実行してください。

無効化ができなかった場合の解決方法

本来、無効化をraspi-configで実行すれば、cmdline.txtに追記されるoverlayroot=tmpfsも削除された筈です。
しかし、今回の環境では残ってしまっており、何度やってもOverlayFSは無効化されず、書き込み可能になりませんでした。

仕方ないので、無効化手順を実行した後、手動で該当箇所を削除しないとなりませんでした。

sudo nano /boot/firmware/cmdline.txt

先頭にある以下の記述を削除する。

overlayroot=tmpfs:recurse=0

こちらも有効化同様にRaspberry Pi公式で修正されれば必要はありません。

運用方法が大事

個人の利用では、逐一設定を変更したりアプリを追加削除をします。
OverlayFSをこのように利用するのは非常に手間がかかります。

個人のデスクトップ環境ではない利用になるため、そこまで頻繁に変更する必要はないでしょう。
しかし、無効化の後に再度有効化を忘れてしまうこともあるため、月に1回のメンテナンス日を設け、まとめてOSのアップデートや変更・追加を行うのはどうでしょう。

OverlayFSが有効でも、コマンドは通ってしまいます。
例えば、sudo apt install ~はインストールは成功します。実際に使えます。しかし、一時的な場所に書き込まれるだけで、再起動をすると消えてしまいます。

OverlayFSは有効なのか無効なのかが一見すると分かりにくいことが難点です。
実は構築した後の運用方法が大事になります。

sshログインのメッセージに状態を表示させる

担当者向けにメッセージを表示するのはオススメです。
SSHログイン時に限りますが、現在のOverlayFSの状態を表示するようにしておくと、無効化と再度の有効化忘れを防ぎやすくなります。

sudo nano ~/.bashrc
# OverlayFS status

if mount | grep -q "overlayroot on /"; then
    echo ""
    echo "======================================"
    echo " 現在は読み取りモードです (OverlayFS 有効)"
    echo " 変更内容は再起動で失われます"
    echo "======================================"
    echo ""
fi

多少は役立つと思います。

不具合があるraspi-config方式

どうやらTrixie 環境では、raspi-config によるOverlayFS有効化だけでは正常動作しないことがあります。

少なくとも記事執筆時点で今回の環境だと、overlay kernel moduleinitramfs-tools/modules へ明示する必要がありました。
加えて、OverlayFSの無効化手順後にはcmdline.txtを編集しないとなりませんでした。

■有効化:
raspi-config

Enable

/etc/initramfs-tools/modulesにoverlayの記述確認
追記したらsudo update-initramfs -uを実行

cmdline.txtへ :recurse=0 追記(有効化の度に作業)

reboot

■無効化:
raspi-config

Disable

cmdline.txtからoverlayroot=tmpfs:recurse=0を削除(無効化の度に作業)

reboot

結論から、raspi-configだけで完了しませんでした。
エラーを出力しないため気がつきません。

この記事に記載された解決策は、更新されていくと解消している場合がありますのでご了承ください。
Raspberry Pi OSがバージョンアップされ、raspi-configで完結させられるのを期待しましょう。


記事寄稿:ラズパイダ

非エンジニアでも楽しく扱えるRaspberry Pi 情報サイト raspida.com を運営。ラズベリーパイに長年触れた経験をもとに、ラズベリーパイを知る人にも、これから始めたいと興味を持つ人にも参考になる情報・トピックを数多く発信。PiLinkのサイトへは産業用ラズベリーパイについて技術ブログ記事を寄稿。