読者です 読者をやめる 読者になる 読者になる

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

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

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

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


Raspberry Pi 3

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

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

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

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

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

ディスクのフォーマット

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

SD 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

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

 書き込みだけなら、GUIで書き込み操作ができる、Etherというソフトを使うのも良いと思います。詳細は下記記事を参照下さい。

容量の少ない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を実行することで空容量を使えるようになります。

まとめ

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

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

関連記事


 Raspberry Piに関する自己まとめサイトです