BackupPi: Raspberry Pi のバックアップとリストアを Raspberry Pi 自身で行う方法

#はじめに
[以前、ちょっと書かせて頂きましたように](http://qiita.com/UedaTakeyuki/items/4f97240b5fd7fc8a4d0b)、Raspberry Pi の SD カードは以下の二つの領域から構成されます (NOOBS はもう少しややこしい構成になるようですが、すみませんが使った事がなく詳細をよく知りません)

- FAT の領域： boot loader が入っている
- ext4 の領域： Linux 起動時にルートファイルシステムとしてマウントされる領域

ext4 が Windows どころか Mac でも普通には読み書きできない（別途、ファイルシステのドライバが必要）事もあり、Raspberry Pi の SD カードのバックアップは通常の PC のようにファイルのコピーではなく、 ***SDカードのデバイスダンプ*** を dd コマンド等で行います。
ところで、そのデバイスでございますが Mac から見てSD カードも内蔵のSSD も外付け USB の HDDもみんな

- /dev/disk0
- /dev/disk1
- /dev/disk2

みたいな同じような名前に見えるので、間違えないように神経を使います。デバイス名の番号は認識した順番につくので、SDカードは disk1 だったり disk2 だったりその時によって違い、 ***間違いそうです***。バックアップ対象を間違えると、8G Byte の SD カードだと思ってバックアップをはじめたのに 2T Byte の HDD のダンプをとリ始めてしまった 終わらない (^^);;; と、冷や汗程度で済みますが ***リストア先を間違えると泣く事になります (;_;)***というか泣いてもすまないかも。

そんな危険な作業に業務データとかが入っている大事な PC を使いたくなく、 ***Raspberry Pi のバックアップ/リストアはRaspberry Pi に閉じた環境で済ませたい、誰でも簡単にできるようなアプリケーションを用意したい***というモチベーションがございます。

# related works (2016.07.08 追加)
最近の jessie には [SD CARD Copier](https://www.raspberrypi.org/blog/another-update-raspbian/)というツールが最初からはいっていて、これを使うと自分自身を USBカードリーダー内のSDカードにコピーできるようになって、手軽にバックアップがとれるようになりました
本稿は、それにあきたらずに圧縮したりしてバックアップしたい方以外は今日では不要になったようで、まことよい世の中になりました事、心より喜ばしいかぎりです

全く関係ないですけど最近の論文だと「related works」を概要のすぐ次に持ってきて、関連研究を俯瞰してから本論に入るのがはやりみたいですね
合理的な順番だなと感心しましたのでここでまねしてみました


# 方法
## 概要
問題は、 ***Raspbian の実行中はルートファイルシステムを unmount できない*** ので、SD カードに対する dd による直接操作ができないことでした。そこで以前、[専用SDでUSBメモリからブートして、その後SDカードを差し替えてUSBメモリにバックアップする](http://qiita.com/UedaTakeyuki/items/18d5f819c7ef158ea157) という方法を考えたのですが、よく考えると ***専用SDカードでブートし、バックアップをとるSDカードをUSBカードリーダから読む*** ほうが簡単そうです。

![スクリーンショット 2015-08-31 7.59.58.png](https://qiita-image-store.s3.amazonaws.com/0/46544/a610030c-1bdc-de02-4b8a-fedda96f4a96.png "スクリーンショット 2015-08-31 7.59.58.png")

SDカードスロットと、USB カードリーダーは、Raspberry Pi から以下のように全く異なる名前でみえるので ***間違える心配もありません***

- SDカードスロット:  ***/dev/mmcblk0***
- USB カードリーダ:  ***/dev/sda***

さらに専用SDカードを[windows からでも読み書きできるようにつくっておき](http://qiita.com/UedaTakeyuki/items/1b9708cd40d5f83d4b7c)、バックアップとして取得したイメージファイルをそのまま PC でストレージに保存したり、クラウドにアップロードできるので大変便利です

![スクリーンショット 2015-08-17 17.30.10.png](https://qiita-image-store.s3.amazonaws.com/0/46544/748bce32-1657-a6e9-5e72-2f610347885c.png "スクリーンショット 2015-08-17 17.30.10.png")

##具体的な方法
上記、[/boot 領域を FAT32 にしてサイズをひろげた](http://qiita.com/UedaTakeyuki/items/1b9708cd40d5f83d4b7c) Raspbian を使っている前提で、/boot/DATA をイメージファイルの保存先にするとして、バックアップ及びリストアのコマンドは以下になります

```bash:
$filename="imagefile" #イメージファイル名

#圧縮せずにバックアップ
sudo dd if=/dev/sda of=/boot/DATA/${filename}.img bs=1M

#gzip で圧縮してバックアップ
sudo dd if=/dev/sda bs=1M | /bin/gzip --fast > /boot/DATA/${filename}.gz

#圧縮していないイメージをリストア
sudo dd if=/boot/DATA/${filename}.img of=/dev/sda bs=1M

#圧縮したイメージをリストア
gzip -dc /boot/DATA/${filename}.gz | sudo /bin/dd of=/dev/sda bs=1M
```

バックアップ以外にも、例えば上記で、 raspbianのオリジナルなイメージファイルである[2015-05-05-raspbian-wheezy.img](https://downloads.raspberrypi.org/raspbian_latest) を /boot/DATA にコピーしておき、上記の３つめのコマンドでリストアすることで Raspbian の初期SD を作成することができます

# 性能比較
Raspberry Pi B+ でバックアップ、リストアをおこなった場合と、Mac Book Air で行った場合の性能の比較をご紹介いたします

- 2015-05-05-raspbian-wheezy.img リストア

| |経過時間|
|:-----------|:------------:|
| RPi | 11分07秒 |
| Mac | 10分46秒 |


- 2015-05-05-raspbian-wheezy.img の SD のバックアップ

| |経過時間|
|:-----------|:------------:|
| RPi(圧縮なし) | 5分49秒 |
| RPi(圧縮あり) | 35分25秒 |
| Mac(圧縮なし) | 4分32秒 |
| Mac(圧縮あり) | 6分19秒 |

- 上の圧縮ありバックアップで作成した gz のリストア

| |経過時間|
|:-----------|:------------:|
| RPi | 27分03秒 |
| Mac | 26分20秒 |

圧縮ありでのバックアップ以外、意外にも Mac とそんなに変わらないという感じでした。gzip の圧縮処理の CPU パワーの差なのか唯一、 ***圧縮ありのバックアップがかなり遅い*** ようでした。前述のコマンド例と同様に --fast オプションをつけて計測してこの値で、つけないとさらにこの倍の１時間以上かかりました。もの凄くいそがなければならない緊急なシチュエーション（10分以内にバックアップをとらないと会社が潰れる！等）でのご利用には適さないのかもしれません。

尚、Raspberry Pi 2 は持っていないので測っていません。

# Web アプリケーション化
以上をざっくりと、こんなかんじのWeb アプリケーション（というほど大げさなものではないですが）にしてみました。

![スクリーンショット 2015-08-28 16.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/46544/588de5c5-9cea-ae16-c3f6-70f84d9a4d58.png "スクリーンショット 2015-08-28 16.11.33.png")

![スクリーンショット 2015-08-28 16.11.45.png](https://qiita-image-store.s3.amazonaws.com/0/46544/fe3d186f-adaa-5e9b-f8f5-555be91db917.png "スクリーンショット 2015-08-28 16.11.45.png")

こんな感じで、USB カードリーダーを挿して使います
![2015-08-28 15.44.00.s.jpg](https://qiita-image-store.s3.amazonaws.com/0/46544/a60754b9-c38b-5a3e-8e45-5d784acaa149.jpeg "2015-08-28 15.44.00.s.jpg")

ソースコードを含め[こちらに公開いたしました](https://github.com/UedaTakeyuki/Backup-Pi)のでその旨ご報告させていただきます。上記、Backup-Pi の imagefile (timezone 及び表示が日本語)を以下に hubic の share としてて公開しておりますので、合わせてご報告させていただきます

- [8GByte の SDカード用](http://ovh.to/Vx7BEyK)
- [16GByte の SDカード用](http://ovh.to/iw9HU3N)

※2015.09.08 リンク先を変更しました。詳細をコメントに
※2015.11.04 リンクの有効期限がきれていましたので更新しました。詳細をコメントに
※2015.12.30 hubic からのダウンロードに失敗するという指摘をいただきましたので[私のサーバ](http://gurnemanz.uedasoft.com/tools/150703/)にダウンロードを用意させていただきました。詳細をコメントに

合わせまして、何度か触れました FAT32化した Raspbian のイメージ(2015.05.05ベース)も[こちら](http://ovh.to/pu7e3RX)で公開させていただいております

因に hubic は Dropbox とよく似たフランスのサービスで、サイトに時々フランス語が残ってたりして大変おしゃれなのですが、 ***25GByte*** までが無料と Dropbox より大盤振る舞いです。友達を紹介すると両者に無料枠を増やしてくれる仕組みも同じで、まだ hubic をつかっていらっしゃらない諸兄諸姉におかれましては ***[私の紹介リンク](https://hubic.com/home/new/?referral=IMXOTD)からアカウントをつくっていただくと 5GByte 多い 30GByte の初期容量で***サービスが利用でき、私も追加容量を頂けますので大変ハッピーな次第でございます

#余談
Raspberry Pi でヘンテコなことをしていると本当にすぐに全く動かなくなるので、頻繁にバックアップをとっておくと本当に助かります