今までRaspberry Piの重要なファイルを定期的にUSBメモリにバックアップしていましたが、これからは全ファイルを外部マイクロSDカードにバックアップしてSDカードが壊れた時も取り替えるだけで再開できるようにします。
完全バックアップに必要なもの
Transcend microSDHCカード 16GB Class10
メーカーによってSDカード/マイクロSDカードの容量が若干異なりそれが原因でイメージファイルの書き込みに失敗する場合があります。
そのため今Raspberry Piで使っているSDカードよりも大きな容量のマイクロSDカードを購入してください。Raspberry PiでマイクロSDカードを使っているなら同じメーカーの同じものか、違うメーカーの場合は元の容量よりも大きな容量を購入して使用してください。
ちなみにmicroSDHCカードのことをマイクロSDカードと呼んでいます。気にするほどの違いはありません。
Raspberry Piのバックアップの下準備
Raspberry PiのSDカードを引っこ抜いてWin32DiskImagerを使ってSDカードのバックアップを取ります。
やりかたは下記で既に記載しているのでそこを参考にしてください。
Model BのSDカードをバックアップしてModel B+のマイクロSDカードにリストアして調整する
新しいマイクロSDカードにバックアップしたファイルを書き込みます。
マイクロSDカードをSDカードアダプタに入れて、Raspberry Pi Model BのSDカードスロットに差し込みます。Model B+の場合は、マイクロSDカードをそのまま差し込んでください。
Raspberry Piを起動します。
sudo raspi-config
1. Expand Filesystem
上記を選んで容量を拡張します。
Raspberry PiをShutdownしてマイクロSDカードを引っこ抜きます。
引っこ抜いたマイクロSDカードをUSBアダプタにつけてRaspberry PiにつなげているUSBハブにくっつけます。Raspberry PiのUSBポートに空きがあれば、そこにつけても構いません。もともとのSDカード/マイクロSDカードをRaspberry Piに差し込んでRaspberry Piを起動します。
とりあえずこれで完全バックアップの準備は整いました。
Raspberry Piをrsyncで同期する
rsyncを使ってRaspberry PiのデータをUSBアダプタにつけたマイクロSDカードへ同期させます。
rsyncについては下記で説明しています。
Raspberry Piでファイルサーバ、Part4 外付けハードディスクのバックアップ編
とりあえずrsyncが入っていない場合はインストールします。
sudo apt-get install rsync
ちなみに現在のRaspberry Piのファイル構成
df -h Filesystem Size Used Avail Use% Mounted on rootfs 7.4G 3.0G 4.1G 43% / /dev/root 7.4G 3.0G 4.1G 43% / devtmpfs 239M 0 239M 0% /dev tmpfs 49M 548K 48M 2% /run tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda1 230G 62M 218G 1% /media/hdd2 /dev/sdb1 294G 65M 279G 1% /media/hdd1 tmpfs 97M 0 97M 0% /run/shm /dev/mmcblk0p1 56M 9.7M 47M 18% /boot tmpfs 32M 0 32M 0% /tmp tmpfs 16M 0 16M 0% /var/tmp tmpfs 32M 564K 32M 2% /var/log /dev/sdc1 56M 9.7M 47M 18% /media/usb0 /dev/sdc2 15G 3.0G 11G 22% /media/usb1 cd / ls bin dev lib mnt root sbin sys var boot etc lost+found opt run selinux tmp boot.bak home media proc sbin
hdd1とhdd2は外部ハードディスクです。USBアダプタをつけたマイクロSDカードはusb0とusb1で認識されています。そのうちusb0はboot用の領域なので、usb1がバックアップ先になります。
USBアダプタをつけたマイクロSDカードが認識されていない場合、USBメモリでRaspberry Piをバックアップする+WordPressを読んでください。USBメモリのマウントの仕方を載せています。USBアダプタをつけたマイクロSDカードも実質的にはUSBメモリとして認識されるので同じようなやり方が通じるはずです。
同期しない/同期してはいけないディレクトリを設定します。
cd / sudo vim rsync-exclude.txt /proc/* /sys/* /dev/* /boot/* /tmp/* /run/* /mnt/* /var/tmp/* /var/log/* /media/*
次にrsyncを使って実際に同期を行います。
sudo rsync -aEv --delete-during --exclude-from=/rsync-exclude.txt / /media/usb1/
rsync-exclude.txtで除外リストを読み込んでいます。
/media/usb1/は人それぞれ若干変わる可能性があるので自分で調べましょう。他にUSBメモリを指している場合、usb2とかusb3になっている可能性があります。
問題なく完了すると、
sent *** bytes received *** bytes *** bytes/sec
total size is *** speed up is ***
というようなメッセージが出て完了です。
/media/usb1/の中身を確認してrsync-exclude.txtが入っていれば同期ができています。
最後にcrontabで同期する時間を設定して設定完了です。
sudo crontab -e 0 4 * * 0 rsync -a --delete-during --exclude-from=/rsync-exclude.txt / /media/usb1/
rsyncのオプションでvはメッセージを表示するやつだから削除します。Eが必要なのか不要なのかわからないのですが、とりあえず削除してしまいました。
1週間に1度同期を行います。
日曜の早朝4時に同期を開始します。
普通のSDカード/マイクロSDカードの書き換え寿命は1万回くらいあるそうです。
読み込み・書き込み・削除などでバックアップ1回につき3回消費したとします。1日1回バックアップを取ったとしても、3333日、10年くらい持ちます。実際には16GBのマイクロSDカードに3GBのバックアップをとるので、寿命は5倍、50年くらい持ちます。
毎日バックアップをとってもいいのですが、基本的にデータの書き換えはあまり行わないので私の場合1週間に1度だけバックアップを取ることにしました。これで想定寿命が7倍になって、350年!どこかで計算を間違えていても私の寿命がなくなるまでは持つことでしょう。
バックアップ元のSDカードはサーバーとして毎日動いているので1日10回分消費したとして1000日、3年くらいの寿命になるかなと思います。
フラッシュメモリの寿命ですが、書き込み回数の考え方は残念ながらもっとハードで、FATフォーマットならば管理部というのがあり、どこに何バイトのファイルを書いても、管理部が更新されます。1バイト書いたあと反映させるためにクローズ、これを100回アペンドしたら、違う領域に書かれるので、各領域は1回しか書かれないかと思うのですが、実際は管理部の同じ箇所がファイルサイズが変わるたび100回こうしんされます。
実際はそのようなログのような物を書くプログラムをヒートランさせると1日でどんなフラッシュも壊れます。