Raspberry PiをReadOnlyにしてファイルシステム保護!

またまたラズパイに関する記事です!

仕事用のIP-PBXとして使用しているRaspberry Pi。

ひと通り設定も終わりそろそろいじる事もなくなってきたのでReadOnly化していつ電源をぶっこぬいてもデータが破損しないようにしようと思います!

 

ReadOnly化のメリットは電源を突然抜いてもデータが破損して起動不能になる事がほぼなくなります。

Raspberry Piの一番の弱点であるファイルシステム破損を回避する有効手段!

SDカードの書き込み回数減少による破損対策。(そこまでの書き込みは普通の使用ではありえないけど)

 

デメリットはファイルシステムが書き込み不可になるので新しい設定などをしても再起動すると全て元の状態に戻ります。

変更を加えたいときは一度ReadOnlyを解除してから再起動して操作が必要です。

あと、一時的な変更等のデータを保存するのにメモリを使用するためプログラムの動作に使えるRAMが減りGUIはほとんど使えなくなるでしょう。

 

自分の場合はRaspberry Piを使い始めてから一度もGUIは愚かモニターすら繋がずに作業しているので関係ないけどね!

 

Raspberry PiをReadOnlyにするためにはまずaufsという機能をカーネルに組み込む必要があります。

でも、Raspberry Pi用のaufsカーネルはバイナリで配布されていないので自力でコンパイルする必要があります。

 

CPUの貧弱なRaspberry Pi上でカーネルをコンパイルすると一日作業になってしまうので今回はNASとして使っているUbuntuServer14.04のマシンがあるので

WindowsマシンからSSH接続でクロスコンパイルしました。

 

まずはRaspberry Piで下準備

rpi-update

apt-get update

apt-get upgrade

Raspberry Piを最新の状態にします。

 

ここからUbuntuで作業

作業フォルダを作成。

mkdirで適当な場所に作業フォルダを作りカレントに移動。

 

apt-get install lib32ncurses5 lib32z1 libncurses5-dev gcc-arm-linux-gnueabi make libncurses5-dev git

作業に必要なパッケージをインストール。自分は文字数減らしたいのでSUで作業。

 

git clone git://github.com/raspberrypi/linux.git

Raspberry Piのカーネルソースをダウンロード

 

git clone git://github.com/raspberrypi/tools.git

コンパイルに使用するツールをダウンロード

 

cd linux

git clone git://git.code.sf.net/p/aufs/aufs3-standalone aufs-aufs3-standalone

cd aufs-aufs3-standalone

git checkout aufs3.18.1+

カレントをLinuxに移動しaufsをダウンロード

 

cp -rp fs/ ../

cp -rp Documentation/ ../

cp -rp include/uapi/linux/aufs_type.h ../include/uapi/linux/

いろいろコピー

 

cd ..

patch -p1 < aufs-aufs3-standalone/aufs3-kbuild.patch

patch -p1 < aufs-aufs3-standalone/aufs3-base.patch

patch -p1 < aufs-aufs3-standalone/aufs3-mmap.patch

Linuxディレクトリに戻ってパッチを実行。

 

export MYCC=/作業フォルダ/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-

クロスコンパイル設定。

 

scp ユーザー@RaspberryPiのIP:/proc/config.gz ./

zcat config.gz > .config

Raspberry Piからコンパイルオプションをゲット

 

make ARCH=arm CROSS_COMPILE=$MYCC menuconfig

※File systems > Miscellaneous filesystems > Aufs (Advanced multi layered unification filesystem) supportにチェック(*)を入れる。

menuconfigでaufsを有効にする

 

nano Makefile

EXTRAVERSION = -aufs

MakeFileを編集してEXTRAVERSIONをおこのみで。

 

make ARCH=arm CROSS_COMPILE=$MYCC

カーネルをmake。

 

make ARCH=arm CROSS_COMPILE=$MYCC modules

モジュールをmake。

 

make ARCH=arm CROSS_COMPILE=$MYCC INSTALL_MOD_PATH=../tmp/rpimod modules_install

cd ../tmp/rpimod

tar zcvf rpimod.tar.gz ./lib/modules

カーネルモジュールにしてTARで圧縮。

 

cd 作業フォルダ

scp linux/arch/arm/boot/Image ユーザーpi@RaspberryPiのIP:/boot/kernel_new.img

scp tmp/rpimod/rpimod.tar.gz ユーザー@RaspberryPiのIP:/tmp/rpimod.tar.gz

Raspberry Piに転送。

 

ここからRaspberry Piで作業。

 

mv /boot/kernel.img /boot/kernel.img_orz

mv /boot/kernel_new.img /boot/kernel.img

カーネルを置き換え。

 

tar zxvf /tmp/rpimod.tar.gz

cp -R /tmp/lib/modules/3.18.14-aufs+ /lib/modules/

モジュールの置き換え。

 

あとは再起動すればaufsが適応されたカーネルで起動するはず!

これではまだReadOnlyにはなってないのでfsprotectを入れる。

 

apt-get install fsprotect

fsprotectをインストール

 

update-initramfs -c -k `uname -r`

initramfsイメージを作成

 

nano /boot/config.txt

initramfs initrd.img-3.18.14-aufs+

config.txtを開いてinitramfsで作られたファイルを追記

 

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fsprotect

cmdline.txtを開いてfsprotectを追記

 

これで再起動すればBoot以外の全てのパーティションが保護されます。

 

nano /etc/default/fsprotect

PROTECT="/boot=32M"

Bootも保護する場合は/etc/default/fsprotectを開いてPROTECTに追記して再起動。

 

これで全てのディレクトリに変更を加えても再起動したら元通りに戻るようになりました。

設定を変更して保存したい場合は/boot/cmdline.txtに追記したfsprotectを削除して再起動すれば書き換え可能に戻ります。

Bootも保護している場合はRaspberry Piから書き換えても反映されないのでSDカードを一度抜いて別PCからファイルを書き換えて再起動してください。

 

以上でRaspberry PiのReadOnly化が完了!

これで突然の停電でもファイルシステムの破損をしんぱいする必要はなくなりました!

ほぼ、組み込み機器と同じ状態で動作してるので信頼度はかなり上がります!

 

ちなみにReadOnly化に伴いUSBメモリの使用はやめてSDカードのみでの運用でテスト中です。

今回カーネルが変わっているので今後、rpi-updateを使用するとカーネルがaufsの入っていないノーマルカーネルに戻ってしまうので注意しましょう。

 

あ、そういえばAcrobitsSoftphoneがG729aちゃんと使えるようになってめっちゃ快適になりましたw

FUSION回線をRaspberry Pi経由でG729aで運用可能になりました~

AsteriskにG729aを入れる方法?気が向いたら書きます。