#Raspberry-pi

RaspberryPiをROM化する

ファイルシステムを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