Raspberry PiにOSをインストール後,いろいろな設定,各種ソフトウェアをインストールして一段落したら,MicroSDカードをバックアップしておくのは重要。
Raspberry PiのMicroSDカードにはOSやデータなどすべてのファイルが保存されているが,突然ファイルシステムが壊れてしまうことがある。
ファイルシステムが修復できれば良いが,修復出来なくなってしまうこともよくある。
そこで,MicroSDカードをバックアップしておく。
例えば,ネットワークで接続されているMS Networkのファイルサーバーにイメージファイルを作成してみる。
まず,イメージファイルを保存するディレクトリを,Raspberry Piでマウントする。
# mkdir /mnt/backup
//192.168.XX.YYY/ZZZ /mnt/backup cifs vers=2.1,username=xxxx,password=yyyy,rw,uid=xxxx,gid=yyyy,defaults 0 0
# mount /mnt/backup
これで保存先が,/mnt/backupにマウントされるので,必要であればバックアップするディレクトリを作成する。
# mkdir /mnt/backup/rpi_image
あとはddコマンドでMicroSDカードを丸ごとイメージファイルに書き出す。
# dd if=/dev/mmcblk0 of=/mnt/backup/rpi_image/raspbian_bk.img bs=1M
しばらくすると(すごく時間がかかる),ネットワークに接続されているファイルサーバーに,raspbian_bk.imgファイルが作成される。
Raspberry PiをシャットダウンしてMicroSDカードを抜いて,PCでイメージファイルにバックアップすることも出来ます。
DD for Windowsが便利です。
Win32diskimagerでもイメージファイルに書き出しが出来ます。しかし,Win32diskimagerでは,バックアップしたイメージを再度exFATな64GBのMicroSDカードに書き込んだ場合ブート出来なくなってしまうので,注意が必要です。
MicroSDカードのバックアップとしてイメージファイルを作成したが,それを再度MicroSDカードに書き込むときに注意することがある。上記のWin32diskimagerを使っての64GBなMicroSDカードに書き込む以外に注意することです。
MicroSDカードは,同じ容量でも多くのメーカーからリリースされている。Raspberry Piには相性問題があってそれにも注意する必要があるが,この同じ容量なのにうまくバックアップしたイメージファイルがMicroSDカードに書き込めないということがある。困ったことにメーカーが同じでもこの問題が発生する時がある。
→
これは,同じ16GBのMicroSDカードでも,メーカーやMicroSDカードの内部に実装されているコントローラーにより,16GBの容量が微妙に異なっているのが原因。16GBのMicroSDカードをバックアップしたイメージファイルを,別の16GBのMicroSDカード(実際は少し容量が少ない16GBのMicroSDカード)に書き込む時,容量不足で書き込めないということが起こる。
この問題を解決するには,2通りの方法がある。
1つ目の方法は,バックアップする前にRaspberry PiのMicroSDカードのパーテーションを,少し小さくしておくことで回避出来るようになる。
小さくするパーテーションは,/boot(FAT/FAT32)以外のext4ファイルシステムの第2パーテーション。gparted等のパーテーション管理ツールを使って縮小することが出来る。
2つ目の方法は,ドライブを丸ごとコピーするようなツールを使用して,MicroSDカードをより小さなMicroSDカードへ丸ごとコピーする方法。コピーにターゲットが容量が小さい場合は自動的にパーテーションサイズを縮小してコピーされます。
Raspberry PiのMicroSDカードに入れたOSを,バックアップするためにWin32DiskImagerを使って.imgファイルを作成した。
しかし,MicroSDカードが32GBのものだったので,イメージファイルも32GBになって,16GBとかのMicroSDカードだとWin32DiskImagerなんかで書き込めない。
このため,.imgファイルのサイズを縮小してみる。
Raspberry PiからMicroSDカードを抜いて,Win32DiskImagerで読み込んで.imgファイルのイメージファイルを作成した。
MicroSDカードが32GBだったため,.imgファイルのサイズも32GBになっている。
作業するlinuxマシンで,ループバックデバイスが使用出来るかどうか確認する。
# losetup -f /dev/loop0
使用できない場合は,
# modprobe loop
で,デバイスドライバーをロードして,使用出来るようにする。
イメージファイルをループバックデバイスに関連付ける。
# losetup /dev/loop0 xxxxxxx.img
ループバックデバイスのパーティションを認識させる。
# partprobe /dev/loop0
イメージファイルの中のパーティションサイズは縮小されているが,ファイルサイズは元のサイズになっている。
# fdisk -l xxxxxxxx.img Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000ea37d Device Boot Start End Blocks Id System xxxxxxx.img 2048 9181183 4589568 b W95 FAT32
これを使用していない部分を削除して,イメージファイルのサイズを縮小する。
9181183セクタまで使用しているので,そのサイズ9181183 x 512にイメージファイルを縮小する。
# truncate --size=$[(9181183+1)*512] xxxxxxxxxx.img
新しくコメントをつける