質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

解決済

Raspberry Pi 3のリードオンリー化

ProgPi
ProgPi

総合スコア19

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

3回答

3リアクション

3クリップ

23734閲覧

投稿2017/04/04 06:30

編集2017/04/05 06:17

Raspberry Pi3を使用した組込みシステムを開発してます。
電源ブチギリ時の保護の為、UnionFSを使用してリードオンリー化を
行おうと思い、

  1. RAM-DISK作成
  2. SDカードのリードオンリー化

のページを参照しながら、実験していたのですが、
上記の設定後、 $ 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は全て正常でした。

■ 再現手順

  1. SWAPサービス無効
$ sudo apt-get install chkconfig $ sudo chkconfig dphys-swapfile off
  1. テンポラリファイル生成抑制

/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
  1. 一旦再起動してdf -hでtmpfsができていることを確認

  2. unionfs-fuseパッケージインストール

$ sudo apt-get install unionfs-fuse
  1. スクリプトのコピー
$ 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
  1. /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
  1. initスクリプト有効化
$ sudo update-rc.d a-unionfs-fuse-live-cd defaults
  1. モード切替スクリプト作成(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
  1. モード切替スクリプト作成(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
  1. 権限付与
$ sudo chmod a+x /usr/local/bin/noprotect $ sudo chmod a+x /usr/local/bin/protect
  1. Read Only モードに切り替え、再起動
$ sudo protect $ sudo reboot

※この再起動時に、通常の再起動より明らかに長い期間があった。
※おそらくここで/bootパーテーションがクリアされていると推測される
※この再起動後、/bootパーテーションは全て消去されており
※この状態で再起動したのでそれ以降起動でき無かった。

tanat, nullbot, tokkun01👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

mt08

2017/04/04 08:08

/bootパーティションのファイルが削除されていたとのことですが、rootfsは正常でしたか? あと、再現性のある手順をかいてもらえれば、確認できそうですが、これだけの情報だと、アドバイスもちょっと難しいかと。
ProgPi

2017/04/04 09:21

追記しました。もっとここを見てほしいとか、ここはどうなってる?とかあればすぐ調べます。
ProgPi

2017/04/04 09:26

上記手順で、2回実行して2回とも同じ結果になりました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。