

Raspberry pi3で電源断を簡単に行いたいと考え、  
unionfs-fuseを導入しました。  
いくつかのサイト様を参考にインストール、設定は完了したのですが  
一度シャットダウンさせると起動しなくなり  
SDカードの内容を確認するとファイルがすべて空になっていました。

下記の手順で導入を行いました。

事前にswapファイル、logファイルなどをRAMディスクに移すなどの設定は済ませています。

  1. パッケージ導入
[code]     $ sudo apt-get install unionfs-fuse

    
[/code]

  2. 設定ファイルコピー
[code]     $ 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　
    
[/code]

  3. /etc/init.d/a-unionfs-fuse-live-cd を編集
[code]     #!/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
    
[/code]

  4. スクリプト登録
[code]     $ sudo update-rc.d a-unionfs-fuse-live-cd defaults

    
[/code]

  5. 切換用スクリプト作成

    * $ sudo vim /usr/local/bin/noprotect
[code]         #!/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
        
[/code]

    * $ sudo vim /usr/local/bin/protect
[code]         #!/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
        
[/code]

  6. 実行権限付与
[code]     $ sudo chmod a+x /usr/local/bin/noprotect  
    $ sudo chmod a+x /usr/local/bin/protect
    
[/code]

  7. 再起動  
unionfs-fuse導入前より起動に時間がかかりますが  
正常に起動します。

  8. シャットダウン、または電源断を行い、その後SDカードの中を見るとすべてのファイルが消えています。

解決策をご存知の方、よろしくお願いいたします。


CC BY-SA 3.0
2017-02-09T08:47:43.797
32529
2017-03-05T14:49:06.520
2017-02-09T09:33:02.090
19110
20583
question
raspberry-pi
raspberry piにunionfs-fuseを導入するとSDカードの内容が消える


私も同じ症状に遭遇しました。  
結論としては、2017/3/4 現在の最新 rasbian イメージと unionfs 導入のサイトの情報には差異があり、そのままでは unionfs
を導入できないのではと思います。  
私も解決策を探りましたが時間切れで aufs を入れたカーネルのリビルドで ROM 化の対処を行いました。  
以下詳細です。

  * 対象 Raspi イメージ  
2017-01-11-raspbian-jessie.img

  * 作業日  
2017/3/2 - 3/3

  * 症状  
ご質問者様と同じように unionfs を他のサイトを参考に導入。最初のリブートはできるが２回目はできない。

調べた部分。

  * RAMDISK 化で /tmp を tmpfs にしており、それが悪いのかと思いやめてみた。また /dev/shm など今の Rasbian イメージに沿っていない部分も見つけたので微修正。繰り返しリブートはできるが unionfs 全く機能していない様子。
  * スクリプトのコマンドを root 権限で逐一実行すると pivot_root 命令でパラメータが違います、というエラーが出ている。リブートできない理由はおそらく root システムの変更がうまくいっていないためと判断した。
  * そうこういている間に、Raspi 実機での aufs を入れたカーネルのビルドに成功したので調査打ち切り。

以上です。


CC BY-SA 3.0
2017-03-04T00:06:19.173
33078
2017-03-04T08:30:23.613
2017-03-04T08:30:23.613
754
20921
32529
answer


質問者さんの質問を見て興味を持ったので、  
raspbian でなく archlinuxarm にインストールしてみました。

まず unionfs-fuse をインストールし、

[code]

    pacman -S unionfs-fuse
    
[/code]

設定ファイルを2つ作り、

/usr/lib/initcpio/install/unionfs:

[code]

    #!/bin/bash
    
    build() {
        add_binary "/usr/bin/unionfs"
        add_binary "/usr/bin/unionfsctl"
        add_module "fuse"
    
        add_runscript
    }
    
    help() {
        cat <<HELPEOF
    This hook uses unionfs.
    HELPEOF
    }
    
    # vim: set ft=sh ts=4 sw=4 et:
    
[/code]

/usr/lib/initcpio/hooks/unionfs:

[code]

    #!/usr/bin/ash
    
    unionfs_mount_handler () {
        cd /tmp
        mkdir -p unionfs/root
        mount -o ro $root unionfs/root
    
        mkdir -p /boot
        mount --fstab unionfs/root/etc/fstab -o ro /boot
        noprotect=0
        [ -e /boot/noprotect ] && noprotect=1
        umount /boot
    
        umount unionfs/root
        rmdir -p unionfs/root
        cd /
    
        if [ $noprotect = 1 ]; then
            default_mount_handler $1
            return
        fi
    
        cd /tmp
        mkdir -p unionfs/root
        mkdir -p unionfs/rw
        mount -o ro $root unionfs/root
        mount -t tmpfs none unionfs/rw
        unionfs -o allow_other,use_ino,suid,dev,nonempty -ocow,chroot=/tmp/unionfs /rw=RW:/root=RO $1
    }
    
    run_hook () {
        mount_handler=unionfs_mount_handler
    }
    
[/code]

/etc/mkinitcpio.conf に上記を読み込む設定を行い、

[code]

    HOOKS="base udev autodetect modconf block filesystems keyboard fsck unionfs"
    
[/code]

initramfs image を作成しました。

[code]

    mkinitcpio -p linux-raspberrypi
    
[/code]

概ね動いているようです。何度 reboot しても問題ありません。  
ただ、denbnddb さんの回答には pivot_root でエラーが出たとありますが、  
archlinuxarm では代わりに switch_root というコマンドを使っており、  
この違いが私の環境でうまくいっている理由なのかもしれません。

うまく動かなかった時には以下のような調査をしました。shell が動く前提ですが。

  * `exit` を試してみる。init が死んで panic するかもしれないが、それはそれで経験になる。
  * ls を実行しようとして ls が見つからない場合、代わりに `echo *` を試してみる。
  * `mount -t proc proc /proc` してみる。  
mount 状況が見られるようになるし、ps コマンドも使えるようになる。

  * もし、unionfs-fuse の PID が判って、/proc も使えるなら、  
`cd /proc/PID/cwd` により、unionfs-fuse のカレントディレクトリに移動できる。  
つまり、pivot_root してしまった後でも、unionfs-fuse が見ている filesystem を見ることができる。

以上、そもそも raspbian と archlinuxarm では随分違う気もしますので、  
ある程度の参考になれば、と思い、回答として書かせていただきました。


CC BY-SA 3.0
2017-03-05T14:49:06.520
33113
2017-03-05T14:49:06.520
5288
32529
answer