reTerminalのeMMC書き込みを止める

Seeed K.K.の松岡です。
いま開催しているSeeed reTerminal 拡張モジュールコンテストの申し込みが少なくて、やきもきしています😥。アイデアだけでもOKなので、みなさん是非参加してください。→reTerminal拡張モジュールコンテストに応募しよう

今回は、reTerminalでeMMC書き込みを止める方法を紹介します。

f:id:matsujirushix:20220305150040p:plain

はじめに

eMMCにはルートファイルシステムとbootファイルシステムがある

reTerminalではRaspberry Pi OSが動いているので、電源オフするときはシャットダウンを実行します。
しかし、時々、このシャットダウン操作がまぁまぁ面倒でシャットダウンを忘れてしまい電源オフすることがあります。「シャットダウン操作しないといけないの?」「いきなり電源抜いてもいい?(電プチ)」と聞かれることもしばしば。返答に困るやつです。大抵は「大丈夫だと思います(が保証はできないです。壊れたらごめんね。)」みたいな返事をしています。曖昧な回答で心苦しい。

壊れない、、、とは言えませんが、壊れる可能性を低くする手段の一つに、eMMCへの書き込みを止めるがあります。reTerminalを電プチしたときに、eMMC内のファイルシステムが(論理的に)破損して起動しなくなることがありますが、eMMCへの書き込みを止めておくことで回避できます。

reTerminalプレインストールのRaspberry Pi OSでは、稼働中は約30Gbytesのmmcblk0p2パーティションを使用しています。ここにはルートファイルシステムと呼ばれるものが入っています。そして、もう1つ重要なものとしてmmcblk0p1パーティションがあります。ここにはbootファイルシステムが入っていて、OS起動時に使用しています。

f:id:matsujirushix:20220305103534p:plain:w400

eMMCへの書き込みを止める作戦

通常は、bootファイルシステムへの書き込みはありません。bootファイルシステムは読み込み専用にするだけでOKです。

一方、ルートファイルシステムは単純に読み込み専用にするだけでは、OSが正常に動作しなくなってしまいます。そこで、OverlayFStmpfsを使って、読み込み専用のルートファイルシステムに、メモリ(RAM)を組み合わせたものを使うようにします。きちんと設定すればこのファイルシステムへの書き込みはメモリに書かれるので、電プチでmmcblk0p2のファイルシステムが破損することが無くなります。

f:id:matsujirushix:20220305145317p:plain:w600

bootファイルシステムを保護する

変更は、Raspberry Pi OSのConfigurationにメニューが用意されているので、ちょー簡単です。

  1. メニューから、 Preferences -> Raspberry Pi Configuration を起動
  2. Performance タブにある Overlay File System の Configure ボタンをクリック
  3. Boot Partition を Read-only に変更

f:id:matsujirushix:20220304141601p:plain:w250
f:id:matsujirushix:20220304141710p:plain:w250 f:id:matsujirushix:20220305121511p:plain:w250

変更すると再起動を求められます。再起動後、/boot が読み込み専用でマウントされます。

Boot Partition = Read-writeのfindmnt:
f:id:matsujirushix:20220305134109p:plain:w400

Boot Partition = Read-onlyのfindmnt:
f:id:matsujirushix:20220305133803p:plain:w370

ルートファイルシステムを保護する

こちらの変更も、Raspberry Pi OSのConfigurationにメニューが用意されているので、ちょー簡単です。(2回目)

  1. メニューから、 Preferences -> Raspberry Pi Configuration を起動
  2. Performance タブにある Overlay File System の Configure ボタンをクリック
  3. Overlay を Enabled に変更

bootファイルシステムが読み込み専用になっていると、Overlayが設定変更できません。設定変更できないときは、bootファイルシステムを読み書きに変更して再起動した後に、再度、トライしてください。

f:id:matsujirushix:20220304141601p:plain:w250
f:id:matsujirushix:20220304141710p:plain:w250 f:id:matsujirushix:20220304141824p:plain:w250

変更すると再起動を求められます。再起動後、ルートファイルシステムが保護された状態になります。

ルートファイルシステムは本当に保護されているのか?

あまりにも設定が簡単すぎて、きちんと保護されているか心配になりますね。
念のために、確認しておきましょう。

ルートファイルシステムがOverlayFSに変更できているかは、findmntコマンドで確認できます。TARGET=/ のFSTYPEがoverlayになっていれば正常に変更できています。

Overlay = Disabledのfindmnt:
f:id:matsujirushix:20220304144633p:plain:w690

Overlay = Enabledのfindmnt:
f:id:matsujirushix:20220304144756p:plain:w800

それでは、なにかファイルを書き込んでみましょう。 空の /home/pi/Pictures ディレクトリに、適当な画像、動画ファイルをコピーしてみます。コピーしたのは4ファイル。合計が約35Kbytes。

f:id:matsujirushix:20220304164708p:plain:w300 f:id:matsujirushix:20220304164552p:plain:w400

ファイルシステムの使用量が、104512 -> 140100 と、約35Kbytes増加しました。

コピー前:
f:id:matsujirushix:20220304164337p:plain:w500

コピー後:
f:id:matsujirushix:20220304164429p:plain:w500

さて、OSを再起動したらどうなるでしょう?
sudo rebootを実行して、再起動すると、、、

f:id:matsujirushix:20220304165023p:plain:w300

f:id:matsujirushix:20220304165150p:plain:w500

コピーしたファイルが消えて、/home/pi/Pictures ディレクトリが空になりました。

というわけで、ルートファイルシステムの保護は正しく機能しています。すばらしい。

考慮すべきこと

書き込む量

保護されたルートファイルシステムに書き込みすると、書き込んだデータはtmpfsに保存されます。
tmpfsはメモリ(RAM)なので、eMMCと比べて書き込める量が少ないです。
長時間連続稼働させておくには、どんな書き込みがあるのかを十分調べて把握、対処しておく必要があるでしょう。

メモリ容量

ルートファイルシステムを保護すると、スワップが無効になります。

Overlay = Disabledのfree:

f:id:matsujirushix:20220304142400p:plain:w600

Overlay = Enabledのfree:

f:id:matsujirushix:20220304144439p:plain:w600

つまり、(疑似的に)使えるメモリの容量が小さくなります。

データ保存

ルートファイルシステムが保護されていると、稼働中に書き込んだデータ(ファイル)は、再起動すると消えて無くなります。再起動しても残しておきたいデータやログなどは、読み書きできる追加ディスクに保存したり、ネットワークへ送信するなどの対処が必要です。

(余談)ルートファイルシステムのセットアップ中身

ルートファイルシステムの保護が、どのようにセットアップされているのか気になったので調べました。

Overlay = Enabled にしたときに実行されるスクリプトは、/usr/bin/raspi-configのenable_overlayfs()でした。

/usr/bin/raspi-config:

f:id:matsujirushix:20220304172155p:plain:w500

ざっくり見ると、

  • initrd.img-XXXを作る(update-initramfs)
  • /boot/config.txtにinitramfs initrd.img-XXXを追加
  • /boot/cmdline.txtにboot=overlayを追加 でした。

要するに、Linux Kernelが立ち上がってルートファイルシステムをマウントする前に、initrd.img-XXXをマウントして、その中のoverlayスクリプトを起動しています。

で、overlayスクリプトの中身はというと、overlayスクリプトの中でOverlayFSとtmpfsでルートファイルシステムを構築しています。

overlayスクリプト実行の様子は、/run/initramfs/initramfs.debugで知ることができます。このファイルは、/boot/cmdline.txtにdebugを追記すると出力されます。

+ mount -r -t ext4 /dev/mmcblk0p2 /lower
+ mount -t tmpfs tmpfs /upper
+ mkdir /upper/data /upper/work
+ mount -t overlay '-olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work' overlay /root

/lower が、eMMC上のルートファイルシステム(読み込み専用)、
/upper が、メモリ上のtmpfs、
で、上記2つでOverlayFS。

変更履歴

日付 変更者 変更内容
2022/3/5 松岡 作成
2022/4/11 松岡 画像クリック時に拡大表示されない不具合を改修