2014年7月18日金曜日

完全設定したRaspbianもしくはSDカードの内容のバックアップ方法

Raspberry Pi用に作成したSDカードだが、さまざまなカスタマイズを加えたものを増産したいという場合に、SDカード全体のイメージファイルを作成して別のカードに書く、ということを考えるかもしれない。しかし、市販されているSDカードの容量は意外と末尾が微妙に異なっており、あるカードから作ったイメージが別のカードに入らないことが往々にして生じる。
また、そもそも未使用部分が多いであろう場合に、カード全体をイメージにするのが適当なのだろうか、という素朴な疑問もある。

そこで、日本Ejectコマンド研究会会長にしてRaspberry Pi界の重鎮である、あっきいさんが書かれた、「NOOBS用カスタムOSイメージの作成」に触発を受け、実験してみたところうまくいったので報告しておく。

前提としてここでは、なにか別のSDカードに複製したい、オリジナルのSDカードがあり、さらに未使用もしくは再度利用する可能性のないSDカードがもう1枚があることを前提とした記述とする。

このためには、ext4ファイルシステムを理解するOSということで、Linuxマシンが必要となる。僕はUbuntu 14.4のマシンを用意した。

Ubuntuマシンに、オリジナルのSDカードを挿入すると、自動的に各パーティションすべてを一気にマウントしてくれる。それはつまり、bootパーティションであり、rootパーティションである。rootパーティションは、Raspbianのバージョンにも依存するかと思うけれど、6月20日版の場合、rootパーティションにはラベルがなく、 UUIDが直接マウントポイントになってしまう。

ここで、以下のようなコマンドを入力する。
# cd /home/xxxx/boot ←xxxxは自分のユーザ名
# tar cvpf ~/boot.tar .
# cd ../root  ←もしくは長いUUIDのフォルダ名
# tar cvpf ~/root.tar .
内容まるごとUbuntu側にバックアップすることになる。

次に、新しいSDカードにそれを入れたいのだが、Raspbianの設定に合ったパーティションの設定しなおしから始まる。

gpartedは、Linuxでは非常に便利な、ディスクパーティションエディタだと思う。Ubuntu側にapt-get install gpartedで入れておく。

最初はOSがSDカードをマウントした状態で、gpartedを起動する。すると、ドライブを/dev/sdbに切り替えられるので、ここでようやく[パーティション]→[アンマウント]でマウントを外してパーティション設定ができるようになる(外さなくてもできるときもあるようだけれどあまり深く調べていない)。

Raspbianのパーティション構成は、以下の通り。

  1. 先頭4MB―未使用
  2. 56MB―bootパーティション(fat16フォーマット)
  3. 残り(4GB SDカードなら、3260MB)―rootパーティション(ext4フォーマット)
  4. 未使用が若干残る
この構成でパーティションを切り直せば、新品のSDカードであってもあとは簡単だ。

バックアップした内容を、SDカードに書き込む。
# cd /media/ユーザ名/boot
# tar xvpf ~/boot.tar
# cd ../root ←もしくはUUID名。UUIDだと見づらいから、パーティションを切るときに「root」のラベルを付けておくとよいと思う。
# tar xvpf ~/root.tar
これであとは、syncでもなんでもしてSDカードをアンマウントして、Raspberry Piに挿し直せばすぐに起動することができる。おそらく、4GBより大きなSDカードに対しても有効だと思う。