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を入れる方法?気が向いたら書きます。
ディスカッション
ピンバック & トラックバック一覧
[…] 以前の記事でaufsとfsprotextを導入してReadOnly化したRaspberryPi。 […]
[…] 以前の記事でfsprotectを導入してReadOnly化して運用しているRaspberry Pi。 […]