ファイルシステムをROM化する
組込み用途でRaspberryPiを使うときに考慮すべきなのが、SDカードの摩耗と、正規のシャットダウン手順を踏まない強制的な電源断です。SDカードへの書き込みは、SDカード内のフラッシュメモリの寿命を縮め、強制的な電源断は、最悪、ファイルシステムの破損を起こします。
LinuxのファイルシステムをROM化する方法は色々あるようですが、とりあえず簡単に導入できそうな、overlayfsを使用する方法です。以下のコマンドを淡々と打ち込んでください。カーネルの再構築など不要で、あっという間にできます。
INSTALL
cd /home/pi
sudo bash
apt-get install git rsync gawk busybox bindfs
dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
systemctl disable dphys-swapfile
git clone https://github.com/josepsanzcamp/root-ro.git
rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/
mkinitramfs -o /boot/initrd.gz
echo initramfs initrd.gz >> /boot/config.txt
reboot
再起動が済んだら既にROM化されています。この状態でファイルに書き込むと、RAMを消費してtmpfs(所謂RAMディスク)上に書き込まれるので要注意です。ログファイルなどを無駄に出力しないように設定しておきましょう。
書き込み可能に切り替えるには以下のスクリプトを使います。
WR-ENABLE
#!/bin/sh
if [ -e /mnt/boot-ro/config.txt ]; then
sudo mount -o remount,rw /dev/mmcblk0p1
sudo grep -v initramfs /mnt/boot-ro/config.txt >/tmp/config.txt
sudo cp /tmp/config.txt /mnt/boot-ro/config.txt
sudo reboot
else
echo Already write enabled
fi
書込み禁止に切り替えるには以下のスクリプトを使います。
WR-PROTECT
#!/bin/sh
if [ -e /mnt/boot-ro/config.txt ]; then
echo Already write protected
else
sudo grep -v initramfs /boot/config.txt >/tmp/config.txt
sudo echo initramfs initrd.gz >> /tmp/config.txt
sudo cp /tmp/config.txt /boot/config.txt
sudo reboot
fi