Raspberry Pi3を使用した組込みシステムを開発してます。
電源ブチギリ時の保護の為、UnionFSを使用してリードオンリー化を
行おうと思い、
のページを参照しながら、実験していたのですが、
上記の設定後、 $ sudo protect を実行して、
一度目のreboot時には、$ df -h を実行した時に
unionfs-fuseのファイルシステムが見えて、成功したかに
思えたのですが、再度rebootしたところ、起動しなくなり
SDカードの中身を確認したところ、/boot の中身が全て消えていました。
同じような経験をされた方、いらっしゃいませんでしょうか?
どのように解決に導いたか等、ご教示頂けると幸いです。
■ 環境・要求事項
** OS:Raspbian Kernel:4.4.38-v7+
** 保存が必要なデータはUSBメモリに記憶する。
** lazarusで作成したGUI画面を液晶に表示させる。
** Webサーバ(lighttpd)を搭載し遠隔地からステータス表示・制御可能。
** ラズパイのGPIO、GPIO-sirialを使用(外部デバイス制御の為)
** 現在は開発の為、SSH,Sambaを使用しているが実際の使用時には不要。
** 電源ブチギリ時のSDカード保護の為、SDカード全体をリードオンリーにしたい。
■ 発生している問題
** protectで起動した時、bootパーテーションが全て消去されている。
** このとき、rootfsは全て正常でした。
■ 再現手順
- SWAPサービス無効
$ sudo apt-get install chkconfig $ sudo chkconfig dphys-swapfile off
- テンポラリファイル生成抑制
/etc/fstabを以下のように編集
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that # ↓追加 tmpfs /tmp tmpfs defaults,size=32m 0 0 tmpfs /var/tmp tmpfs defaults,size=16m 0 0 tmpfs /var/log tmpfs defaults,size=32m 0 0 tmpfs /var/www/mrtg tmpfs defaults,size=2m 0 0
-
一旦再起動してdf -hでtmpfsができていることを確認
-
unionfs-fuseパッケージインストール
$ sudo apt-get install unionfs-fuse
- スクリプトのコピー
$ sudo cp /usr/share/doc/unionfs-fuse/examples/S01a-unionfs-fuse-live-cd.sh /etc/init.d/a-unionfs-fuse-live-cd $ sudo cp /usr/share/doc/unionfs-fuse/examples/rc.local.omit-pid.sh /usr/local/sbin/a-unionfs-fuse-omit-pid.sh
- /etc/init.d/a-unionfs-fuse-live-cd を以下のようにする
#!/bin/sh ### BEGIN INIT INFO # Provides: a-unionfs-fuse-live-cd # Required-Start: mountall-bootclean # Required-Stop: # Default-Start: S # Default-Stop: # X-Start-Before: procps udev-mtab urandom # Short-Description: UnionFS mode # Descrition: Shutdown process will not be required ### END INIT INFO # Copyright: Bernd Schubert <bernd.schubert@fastmail.fm> # BSD license, see LICENSE file for details FUSE_OPT="-o allow_other,use_ino,suid,dev,nonempty" CHROOT_PATH="/tmp/unionfs" UNION_OPT="-ocow,chroot=$CHROOT_PATH,max_files=32768" UBIN=/usr/bin/unionfs-fuse cd /boot file=noprotect if [ -e ${file} ]; then echo "${file} exists" exit 0 fi mount -o remount,ro /dev/mmcblk0p1 /boot mount -t proc proc /proc mount -t tmpfs tmpfs /tmp mkdir -p $CHROOT_PATH/root mkdir -p $CHROOT_PATH/rw mkdir -p /tmp/union mount --bind / $CHROOT_PATH/root $UBIN $FUSE_OPT $UNION_OPT /rw=RW:/root=RO /tmp/union mount -t proc proc /tmp/union/proc cd /tmp/union mkdir oldroot pivot_root . oldroot mount -o remount,ro /dev/root /oldroot for d in dev run run/lock sys run/shm dev/pts boot do mount --bind /oldroot/$d /$d done init q /usr/local/sbin/a-unionfs-fuse-omit-pid.sh exit 0
- initスクリプト有効化
$ sudo update-rc.d a-unionfs-fuse-live-cd defaults
- モード切替スクリプト作成(noprotect)
$ sudo vi /usr/local/bin/noprotec
#!/bin/sh mount -o rw,remount /boot cd /boot if [ -e "protect" ]; then rm /boot/protect fi if [ -e "noprotect" ]; then echo "noprotect mode" else touch /boot/noprotect echo "noprotect mode" fi mount -o ro,remount /boot
- モード切替スクリプト作成(protect)
$ sudo vi /usr/local/bin/noprotec
#!/bin/sh mount -o rw,remount /boot cd /boot if [ -e "noprotect" ]; then rm /boot/noprotect fi if [ -e "protect" ]; then echo "protect mode" else touch /boot/protect echo "protect mode" fi mount -o ro,remount /boot
- 権限付与
$ sudo chmod a+x /usr/local/bin/noprotect $ sudo chmod a+x /usr/local/bin/protect
- Read Only モードに切り替え、再起動
$ sudo protect $ sudo reboot
※この再起動時に、通常の再起動より明らかに長い期間があった。
※おそらくここで/bootパーテーションがクリアされていると推測される
※この再起動後、/bootパーテーションは全て消去されており
※この状態で再起動したのでそれ以降起動でき無かった。
回答3件
あなたの回答
tips
プレビュー