2016年7月17日日曜日

Raspberry Pi で WiFi ファイルバックアップ

皆さん、Android 端末の /sdcard に保存したデータはバックアップを取っていますか?

iPhone を始めとする iOS 端末には iTunes や iCloud への充実したバックアップ機能がありますが、一方 Android 端末にはその手の「ワンクリックでバックアップ」は選択肢が多くありません。万一端末が故障したりすると、データが端末の内部にしか保存できない microSD 非搭載端末なんかではお手上げになるわけです。

もちろん都度 PC に繋げて /sdcard のファイルを吸い上げる方法もありますが、面倒だし端末が複数あると管理しきれなくなるのが目に見えています。できれば WiFi 経由で一気にバックアップしたいものです。モバイル端末向けではありませんが Apple はそういった目的のガジェットを作っていましたね。



そこで、バックアップ環境の構築のために Raspberry Pi 2 Model B (以下 RasPi ) と 3TB HDD を買いました。










RasPi は CPU が発熱する為、秋葉原の千石電商で購入したヒートシンクを両面テープで貼り付けました。





百均で入手した適当なプラスチックケースに穴を開けて、RasPi のケースを作成します。





全体の構成です。



OS のセットアップ


RasPi の OS として非常に有名な Raspbian を導入しました。

導入方法はあちこちのサイトでまとめられているため省略します。ですが、今回は RasPi をサーバーとして使用するため、SSH 接続のために openssh をインストールし、逆に GUI 関係 (X11、LXDE、GNOME で始まるパッケージ群) はセットアップ後に軒並み削除しました。正直 ArchLinux にすれば良かった

権限の抑制

デフォルトの pi ユーザーはパスワード無しで sudo を実行できる権限を持っており、サーバーとして利用するには危ないので、権限を抑制します。

# visudo /etc/sudoers

pi ALL=(ALL) NOPASSWD: ALL
      ↓
#pi ALL=(ALL) NOPASSWD: ALL

IP アドレスの固定


後々 Android 端末から繋ぎやすいように、RasPi の IP アドレスを固定します。

# vim /etc/network/interfaces

iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1

(おまけ)外付け HDD から RasPi をブート

RasPi は microSD カードに OS をインストールしますが、microSD は、というよりフラッシュメモリは往々にして読み書きに対する耐久性が低いため、24 時間起動したままにしておくと microSD の寿命が先に来てしまうと言った事があるようです。

今回 RasPi には HDD を接続しているわけですから、耐久性を考えて HDD から Raspbian をブートするように設定しました。

方法については以下の URL が詳しいです。
http://raspberrypihobbyist.blogspot.jp/2013/07/running-from-external-hard-drive.html


参考程度に、自分が行った手順をメモしておきます。

1. USB 接続した HDD を

  • [16GB]
  • [残り全て] 

でパーティションを区切り、どちらも ext4 でフォーマットする
# parted /dev/sda
# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2

2. [16GB] のパーティションを /mnt にマウント

# mount /dev/sda1 /mnt

3. swap を無効化する
(上記の記事では、swap を無効化した後にちゃんと HDD に作成した swap パーティションへと切り替えていますが、自分は面倒くさいので swap を無効化したままにしています)

# swapoff --all
# apt-get purge dphys-swapfile
# rm /etc/rc?.d/*dphys-swapfile
# rm /var/swap

3. rsync を使用して /mnt を除く / 以下を HDD の [16GB] パーティションにコピー

# rsync -avz --exclude '/mnt' / /mnt

4. fstab を編集して、/dev/mmcblk0p2 となっている箇所を /dev/sda1 に変更

# nano /etc/fstab

5. /boot/cmdline.txt を編集し、/dev/mmcblk0p2 となっている箇所を /dev/sda1 に変更

# cp /boot/cmdline.txt /boot/cmdline.orig
# nano /boot/cmdline.txt

6. 再起動して、HDD から起動できることを確認

# reboot

7. 不要になった /dev/mmcblk0p2 を削除

# parted /dev/mmcblk0


外付け HDD をマウントする

ディレクトリを作り、そこに外付け HDD をマウントします。

$ mkdir /home/pi/storage
# mount /dev/sda2 /home/pi/storage
# chown pi:pi /home/pi/storage

起動時に自動で外付け HDD をマウントするには、/etc/fstab を編集します。

# nano /etc/fstab

以下の行を追記します。

/dev/sda2  /home/pi/storage ext4    defaults,noatime  0       0

これで、再起動後も HDD にアクセスできるようになります。

rsync の設定


ファイルのバックアップには rsync backup for Android を使用します。これにより、SSH 経由でファイルを RasPi に転送することができます。

rsync backup for Android は http://android.kowalczuk.eu/rsync4android/ よりダウンロードが可能です。(以前は Google Play からダウンロードが可能でしたが、現在は削除されている模様です。)

apk をインストールしたら、まずメニューから 「Get binaries」を選択して rsync のバイナリを取得します。
次に、メニューより「Generate keys」を選択します。すると、/sdcard 上に dss_key と dss_key.pub が生成されるので、 dss_key.pub を RasPi に転送して次のコマンドを実行します。

$ dss_key.pub >> ~/.ssh/authorized_keys

鍵の転送を行ったら、バックアップから除外するディレクトリの設定を行います。自分の場合は「サムネイルのキャッシュ」を除外したいので、Android 端末の /sdcard に exclude というファイルを作成し、

- .thumbnails/

と書きました。
rsync の除外設定は記法が独特なので、実際に設定する際は文法を調べておくと良いと思います。

最後に、rsync backup for Android から Add profile を選択し、各種設定を行います。

  • Profile name: Backup (お好みで)
  • Local file or directory: /sdcard/
  • Username: pi
  • Server: 192.168.1.100 (先ほど設定した RasPi の IP)
  • Port: 22
  • Dropbear SSH private key: /sdcard/dss_key
  • Remote file or directory: ~/storage/nexus5x (RasPi のバックアップ先ディレクトリ;端末名で分けるとわかりやすい)
  • Additional rsync options: -vHrltDp --delete --exclude-from=/sdcard/exclude --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r

設定が完了したら 「SAVE PROFILE」ボタンを押し、保存します。

画面上に表示された「Backup」の項目を選択すると、あとは自動で /sdcard が RasPi の外付け HDD へと転送されます。

---

「お手軽バックアップ環境」とか言っておきながら振り返ってみるとかなり面倒な設定手順でしたが、一度作ってしまえばあとは Backup を選択するだけでワイヤレスでどんどんバックアップしてくれます。元の同期ソフトウェアが rsync なので、 rsync の複雑怪奇豊富なオプションを使いこなせば、自分の好みに合わせた柔軟な環境が構築できると思います。

補足: ssh-dss について


rsync backup for Android の「Generate keys」より生成できる鍵はDSA (ssh-dss) という方式ですが、この方式に最近脆弱性が見つかったらしく、OpenSSH 7.0 より ssh-dss 方式の鍵は無効になります。
RasPi の OS である Raspbian は OpenSSH 6.0p1 なのでまだ使えますが、将来的には違う方法を取る必要があるかもしれません。


0 件のコメント:

コメントを投稿