MacでRaspberry PiのSDカードをハードコピー(バックアップ)

f:id:karaage:20180610095415j:plain:w640

Raspberry PiのSDカードを丸ごとコピー

 最近複数のRaspberry Piを使うことが多くなりました。ただ、いちいち1からセットアップしていたら非常に時間がかかってしまうので、1回セットアップをしたらそのSDカードを丸ごとコピーしてやるのが簡単かなと思い、ハードコピー試してみました。イメージファイルを保存しておくだけでも、環境含めたバックアップになるので便利です。
 Raspberry Piのセットアップから始める人は、以下記事を参照ください。


Raspberry Pi 3

SDカード。8GB以上を買うのがベター


SDカードリーダー

 ネットで調べたところ、Macだと主に以下の2つの方法があるようです。

  • ddコマンドを使った方法
  • ディスクユーティリティを使った方法

 自分は何故かディスクユーティリティを使用した方法はエラーがでてうまくいかなかったので、ddコマンド使った方法のみ記載いたします。

ddコマンドを使ったハードコピー

ディスクのフォーマット

 まずはディスクをフォーマットしましょう。好きな方法でよいですが、確実なのはSD Formatterを使う方法です。以下のサイトからダウンロードしたSD Formatterを使ってSDカードをフォーマットをしましょう。ドライブを選択するだけの簡単設計。

SD Memory Card Formatter | SD Association

ディスクのデバイスファイルを確認

 MacでコピーしたいSDカードを挿入後にdfコマンド実行してSDカードのデバイスファイルを確認。よくわからなければ、挿入前と挿入後でdfコマンド実行して比較しましょう。

$ df -h

 挿入後に増えているデバイスファイルがSDカードのデバイスファイルです。例えば /dev/disk2とか/dev/disk3とか。

イメージ読み出し

 以下は/dev/disk2がSDドライブの場合の例。以下のコマンドでSDカードの中身をRPi.imgというイメージファイルに読み出します。

$ sudo dd if=/dev/disk2 of=~/RPi.img

 途中経過が気になる方はCtrl+Tで進捗を表示できます。読み込み終わったら以下コマンド実行してディスクを取り出せる状態にしてから、SDをPCから抜きましょう。

$ diskutil eject /dev/disk2

イメージ書き込み

 読み込み完了したら、書き込みしたいSDカードを挿入して、以下のコマンドで一旦アンマウント

$ diskutil umountDisk /dev/disk2

 以下のコマンドで書き込み。disk2rdisk2にするのがポイント。理由は…よくわからないです、すみません。なんでも、アンバッファモードになって速度が速くなるみたいです。bs=1mは一度に書き込む容量を表していて1m(1MB)くらいにしないとこれまた速度が遅くなります。途中経過が気になる方はCtrl+Tで進捗を表示できます。

$ sudo dd if=~/RPi.img of=/dev/rdisk2 bs=1m

 しばらく(数分)待つと完了のメッセージが出るので、書き込み完了。書き込み完了したら。あとは以下のコマンドでアンマウントしてからSDカードを取り出しましょう。

$ diskutil eject /dev/disk2

 以上で書き込みは完了です。

 書き込みだけであれば、Raspberry Pi Imagerというソフトが良いと思います。以下記事参照ください。

qiita.com

容量の少ないSDカードから容量の大きいSDカードにコピーする方法

 例えば8GBのSDカードを、16GBのSDカードにハードコピーすると残りの8GBはそのままでは使えず、パーティションを初期化してマウントしてやる必要があります。Raspi-configExpand Filesystemでパーティション拡大できる場合もあるのですが、できない場合もあって(NOOBS経由でインストールするとパーティション複雑になるのでダメかも)。パーティションを自分で修正していやる必要があります。
 fdiskコマンドでもよいのですが、gpartedを使うとGUIでパーティション変更できるのでオススメです。Raspberry Piに以下のコマンドでインストールできます。

$ sudo apt-get update
$ sudo apt-get install gparted

 gpartedの注意事項として、ターミナルから起動しようとするとGtk-WARNING **: cannot open display:というエラーが発生するので、下図のようにRaspbianのメニューの 設定 -> GParted から起動して下さい。
f:id:karaage:20170329004901p:plain:w640

 起動したら、パスワードを入力して下さい。

 後はgpartedをインストールしたRaspberry Piに、パーティションを操作したい対象のSDカードをUSBカードリーダ経由で接続します。gpartedを入れたRaspberry Pi自身のパーティションはいじれないので注意して下さい。具体的な接続図は以下となります。
f:id:karaage:20170329004708j:plain:w640

 起動画面です。最初は、デバイスとしてRaspberry Pi自身のSDカードが選択されています
f:id:karaage:20170329005232p:plain:w640

 SDカードリーダのSDカードを以下のように選択します
f:id:karaage:20170329005328p:plain:w640

 /dev/sda2を右クリックします。ここでSDカードがRaspberry Piで自動でマウントされていたらアンマウントします、アンマウントされたらリサイズを選択します
f:id:karaage:20170329005434p:plain:w640

 リサイズするサイズを調整します。サイズに空き容量が少なすぎるとresize2fs: New size smaller than minimum.というエラーが出てリサイズに失敗しますので、容量に1割から2割程度空き容量をもたせるようにしましょう。
f:id:karaage:20170329010043p:plain:w640

 編集から保留中の全ての操作を適用するでパーテーションのリサイズが実行されます。
f:id:karaage:20170329010256p:plain:w640

 リサイズ完了したら、ディスク取り外しの処理を行って下さい。

 gpartedはfdiskではできない、パーティションを結合して、大きなパーティションをつくるといったこともできて非常に便利なアプリです。

バックアップするイメージのサイズを小さくする

 調子にのって32GBのSDカードを使うと、バックアップしたいときそのままだと32GBの容量が必要になり凄い勢いでPCの空きディスク容量を圧迫します。そんなときはイメージのサイズを小さくすると良いです。
 まずは上記で紹介したgpartedで対象のSDカードのパーティションをリサイズして小さくします。例えば使用するパーティション全体のサイズが5GBになるように調整しましょう。

 後は、リサイズしたSDをMacに接続して、ターミナルで以下のコマンドを実行します。

$ sudo dd if=/dev/disk2 of=RPi.img bs=1m count=6000

 ここでcount=6000は先頭から6000MB(6GB)をイメージファイルとして読み出すということを意味しています。今回は、パーティションのサイズを5GBとしたので、それより大きい6GBにしています。必ずパーティション全体のサイズより大きい値を設定しましょう。これで小さいサイズのイメージで保存することができました。

 このイメージをSDに書き出した後、残りの空き容量も使いたくなった場合はgpartedで再度リサイズするか、Raspi-configExpand Filesystemを実行することで空容量を使えるようになります。

 最新のRaspbianではGUIのRaspi-configからExpand Filesystemが無くなってしまったので、ターミナルで以下コマンド実行してCUIのRaspi-configExpand Filesystemを実行しましょう。

$ sudo raspi-config

Raspbian標準の「SD Card Copier」で手軽にコピー

 Raspbianには「SD Card Copier」というバックアップツールが標準で付属しているので、単純にSDのコピーが欲しいだけなら、それを使うのが簡単です。

 まず、同じメーカ、容量のSDカードを用意するか、コピー元より大容量のSDカードを用意しましょう(当たり前ですが、コピー元より小さい容量のSDカードですとコピーできません)。

 以下のようにRapsberry PiにSDカードリーダとSDカードを接続して、Raspberry Piを起動しましょう。

f:id:karaage:20180610095415j:plain:w640


 以下のように「メニュー -> アクセサリ -> SD Card Copier」から SD Card Copierを起動します。

f:id:karaage:20180610095317p:plain:w640


 念のため、ターミナル開いて dfコマンドでコピー先のディスクを確認します。/dev/sdb1 がSDカードのようですね。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         29G   10G   18G   37% /
devtmpfs         434M     0  434M    0% /dev
tmpfs            438M     0  438M    0% /dev/shm
tmpfs            438M   12M  427M    3% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            438M     0  438M    0% /sys/fs/cgroup
/dev/mmcblk0p1    43M   22M   21M   51% /boot
tmpfs             88M     0   88M    0% /run/user/1000
/dev/sdb1         30G  2.5M   30G    1% /media/pi/BOOT

 あとは、以下のように、コピー元とコピー先を選択して、「Start」をクリックしてコピーします。

f:id:karaage:20180610095837p:plain:w480


 より詳細は、以下記事参照下さい
http://www.daipanman.com/entry/2017/08/29/211945

まとめ

 ハードコピーはddコマンドがよいですね!パーティション変更はgpartedで!

リンク:Raspberry Pi 3
リンク:SDカード

関連記事


変更履歴

2018/06/10 SD Card Copierに関して追記
2017/08/29 SD Card Copierに関して追記
2017/02/17 Etcherに関して追記
2016/11/22 読み込み後のdisk ejectコマンド追記
2015/09/22 容量の少ないSDカードから容量の大きいSDカードにコピーする方法を追記