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

  • 36
    いいね
  • 5
    コメント

はじめに

以前、ちょっと書かせて頂きましたように、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というツールが最初からはいっていて、これを使うと自分自身を USBカードリーダー内のSDカードにコピーできるようになって、手軽にバックアップがとれるようになりました
本稿は、それにあきたらずに圧縮したりしてバックアップしたい方以外は今日では不要になったようで、まことよい世の中になりました事、心より喜ばしいかぎりです

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

方法

概要

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

スクリーンショット 2015-08-31 7.59.58.png

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

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

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

スクリーンショット 2015-08-17 17.30.10.png

具体的な方法

上記、/boot 領域を FAT32 にしてサイズをひろげた Raspbian を使っている前提で、/boot/DATA をイメージファイルの保存先にするとして、バックアップ及びリストアのコマンドは以下になります

$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 を /boot/DATA にコピーしておき、上記の3つめのコマンドでリストアすることで 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 オプションをつけて計測してこの値で、つけないとさらにこの倍の1時間以上かかりました。もの凄くいそがなければならない緊急なシチュエーション(10分以内にバックアップをとらないと会社が潰れる!等)でのご利用には適さないのかもしれません。

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

Web アプリケーション化

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

スクリーンショット 2015-08-28 16.11.33.png

スクリーンショット 2015-08-28 16.11.45.png

こんな感じで、USB カードリーダーを挿して使います
2015-08-28 15.44.00.s.jpg

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

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

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

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

余談

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