工作好きな情報系の雑記

[Raspberry Pi 3]ディスクイメージを作ってバックアップする

Raspberry Piのバックアップとして、イメージディスクを作る。
単純にバックアップを取るだけだと、SDカード内の空き領域を含めた無駄にでかいイメージファイルになってしまうので、ここでは圧縮したイメージディスクを作る。

2種類の方法を紹介。

パーティションを縮小してからバックアップを取る方法

圧縮というか、パーティションを縮めてしまえばイメージディスクのサイズが小さくなるでしょう、という考え。
主にUbuntu(Linux)を使う。

パーティションを縮小

まずGPartedでSDカードのパーティションを縮小する。
空き領域をギリギリまで削ってしまうと縮小に失敗するので、少し余裕を持たせて縮小させる。
僕の場合、8.2GBまでしか縮小できないところを、8.5GBで縮小しようとしたらエラーが発生した。
9GBで成功した。
更に言うと、Raspbianでやろうとしたら失敗して、Ubuntuだとうまくいった。

shrink file system 00:00:00 ( ERROR )
 resize2fs -p /dev/sda2 8704000K
  resize2fs 1.42.12 (29-Aug-2014)
  resize2fs: New size smaller than minimum (2291995)

ddコマンドでイメージディスクを作る

UbuntuでもMacでもできる。

Ubuntu

デバイス名を調べる。

今回は/dev/sdfだとわかったので、以下のコマンドでパーティションサイズを調べる。

/dev/sdf2の「最後から」の数値が最終セクタ番号になるらしい。
ということで、その値に+1した値を指定して、以下のコマンドを走らせるらしい。

また、status=progressをつけることで進捗が見られるようになる。

ちなみに、うちの環境だとこれで転送速度が20[MB/s]くらいになる。

ここまで環境設定をいろいろやってきました。しかし、機能的には何も嬉しい事をしてません。ここからは、いろいろインストールしたりとかしようと思っていますが、一旦ここでこの環境をセーブしておきたいと思います。何か失敗してやり直したいと思うかも知れませんし、ファ
Raspberry Pi のディスクイメージをバックアップする : sstea備忘録 - sstea備忘録

Mac

SDカードがどのデバイスかを確認。

番号がわかったら、それを元に以下のコマンドを走らせる。

2番目のstart+size(=18524160)が欲しいバックアップのサイズになるので、この値を指定してddコマンドを走らせる。

今回の場合、SDカードはdisk2だったので、それを指定して「rpi.img」という名前のイメージディスクを作る。
注意すべき事として、この時指定するデバイス名は「rdisk2」のように、先頭にrを足すこと。その方が早い。
2019/08/04追記: bsオプションも使えば転送速度を上げられる。

ちなみにCtrl+Tを押すことで、コピーの途中経過を知ることができる。

転送速度は1[MB/s]くらい。めちゃくちゃ遅い。
Ubuntuを持っているのであれば、Ubuntuでddコマンドを走らせて、それをUSBメモリでMacに移し替えるのがいいかも。

2019/08/04追記: bsオプションを使うことで60[MB/s]くらいまで上げられた。

Raspberry Piのサイトにも書かれているdiskとrdiskのアクセス速度の違い。どういう理由で違うのか、調べてみました。 diskとrdiskの違い diskとrdisk...
diskとrdisk | Junk Works - Junk Works
2017/08/29 SD Card Copierに関して追記 2017/02/17 Etcherに関して追記 2016/11/22 読み込み後のdisk ejectコマンド追記 2015/09/22 容量の少ないSDカードから容量の大きいSDカードにコピーする方法を追記 Raspberry PiのSDカードを丸ごとコピー 最近複数のRaspberry Piを使うことが多くなりました。ただ、いちいち1からセットアップしていたら非常に時間がかかってしまうので、1回セットアップをしたらそのSDカードを丸ごとコピーしてやるのが簡単かなと思い、ハードコピー試してみました。イメージファイルを保存しておく…
MacでRaspberry PiのSDカードをハードコピー(バックアップ) - karaage. [からあげ] - karaage. [からあげ]

SDカード全体のイメージファイルを作ってから圧縮する方法

圧縮には、Raspberry Piを使う。
ちなみにこの方法はRaspbian限定なので注意。

イメージファイルを作る

イメージファイルの作成はPCで行う。
デバイス名を調べる方法は上の項を見てほしいが、コピーするコマンドは以下のようになる。
今回はSDカード全体をコピーするのでcountオプションを使う必要がなく、bsオプションで転送速度を上げることができる。

2019/08/04追記: countオプションを使っていてもbsオプションで転送速度を上げられるっぽい。

Ubuntu

転送速度は20[MB/s]くらい。
Ubuntuではあんまり違いが出ない。

Mac

転送速度が60[MB/s]くらいまで跳ね上がる。

Raspberry Piに接続

そしたら、生成したイメージファイルと下のPerlスクリプトを外付けHDDとかに入れて、Raspberry Piに接続する。

ちなみに、Macの外付けHDDを接続した場合、フォーマットの違いで読み取り専用になってしまうので、以下のようにして書き込みもできるような形でマウントし直す。

圧縮する

Raspberry Piを起動したらターミナルを開き、resizeimage.plのあるディレクトリに移動して、以下のコマンドを実行。

これで圧縮されたimgファイルが作成されるはずだ。
場合によっては「/dev/loop0: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.」といったようなエラーが出てしまうが、その時はなんとかしないといけない。
まだ解決法が見つかっていないので、ここはあとで追記する。

モバイルバージョンを終了