技術コラム(第28回)Raspberry Pi 3B+の使い方 ~ROM化編~

初めに

第25回、第27回でRaspberry Piを起動してを利用できるようになるまでについて説明をしました。詳しくは、以下リンクの説明をご覧ください。

Raspberry Piを組込機器利用する場合、電源を長時間ONのままにしたり、シャットダウンの操作をせずに電源コネクタを引き抜くといった使い方をすることがあります。こういった使い方をすると、以下の問題が発生します。

  • 長時間電源ON
     → SDカードへのアクセスが長時間続きSDカードの寿命が短くなる。
  • シャットダウンの操作をせず電源コネクタを引き抜き
     → ファイル保存中に引き抜かれた場合ファイルが壊れる可能性がある。

そういった問題はSDカードをROM化(読込専用)にすることで防ぐことができます。今回はその方法をご紹介させていただきます。
なお、この記事は以下のサイトを参考にさせていただいております。

ROM化準備

以下コマンドを入力してください。最後のコマンドで再起動したら、ROM化されています。

cd ~
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

それぞれのコマンドについて解説していきます。

cd ~

ホームディレクトリに移動する。

sudo bash

rootへログインする。

apt-get install git rsync gawk busybox bindfs

git、rsync、gawk、busybox、bindfsをインストールする。

dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
systemctl disable dphys-swapfile

swapを止めて、dphys-swapfileのサービスを無効化する。

git clone https://github.com/josepsanzcamp/root-ro.git

https://github.com/josepsanzcamp/root-ro.gitをgitクローンする。

rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/

gitクローンでできたroot-ro/etc/initramfs-tools/*を/etc/initramfs-tools/へコピーする。

mkinitramfs -o /boot/initrd.gz
echo initramfs initrd.gz >> /boot/config.txt

ファイルシステムを作成し、/boot/config.txtにそのファイルシステム(initramfs initrd.gz)を書き込む。

reboot

再起動する。

ROM化解除スクリプト

ROM化を解除するときは以下スクリプトを実行すれば、再起動後にROM化が解除されます。

#!/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 SD card is write enabled.
fi

以下にシェルの内容を解説をします。
/mnt/boot-ro/config.txtが存在するとき、ROM化解除処理を実施します。

sudo mount -o remount,rw /dev/mmcblk0p1

読み書きを許可して/dev/mmcblk0p1を再マウントする。

sudo grep -v initramfs /mnt/boot-ro/config.txt > /tmp/config.txt
sudo cp /tmp/config.txt /mnt/boot-ro/config.txt

/mnt/boot-ro/config.txtよりinitramfsが含まれる行を削除する。

sudo reboot

再起動する。

ROM化スクリプト

再びROM化したいときは以下スクリプトを実行すれば、再起動後にROM化されます。

#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    echo SD card is write disabled.
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

以下にシェルの内容を解説をします。
/mnt/boot-ro/config.txtが存在しない時、ROM化処理を実施します。

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

/boot/config.txt のinitramfsが含まれる行を削除し、最後にinitramfs initrd.gzを書き込む。

sudo reboot

再起動する。

最後に

これでRaspberry Pi 3B+をROM化できました。Raspberry Pi 3B+と記載していますが、Raspberry Pi 4BなどLinuxOSを搭載できるRaspberry Piでも同じ作業でROM化できると思われます。

組込開発.comでは、Raspberry Piを利用した開発実績もあります。案件では、Raspberry Piのファームウェアだけでなく、ハードウェア開発やクラウド環境の構築なども対応しています。

組込開発.comは、ファームウェアだけでなく、ハードウェアやアプリケーションの開発も一括して承ることができますので、お困りの際はぜひお問い合わせください。

投稿者プロフィール

ソフト担当T
ソフト担当T
メインはソフト担当ですが、筐体設計も担当します。プログラミング言語はPythonやC言語の経験が多いです。また、たいチャレ(詳細は右バーナー参照)にも参加しており、日々、様々なことを学びながら業務に取り組んでいます。