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

   2019/08/04

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]くらいになる。

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]くらいまで上げられた。

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.」といったようなエラーが出てしまうが、その時はなんとかしないといけない。
まだ解決法が見つかっていないので、ここはあとで追記する。

タイトルとURLをコピーしました

コメント一覧

  1. dia-sea より:

    /dev/loop0: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.というエラーが出た場合ですが、下記を実行した所、imgのスリム化が出来ました。

    コマンドを実行
    losetup /dev/loop0 イメージへのパス
    kpartx -av /dev/loop0

    以下にブロックデバイスとして、imgファイル内のパーティションがマウントされる。

    /dev/mapper/loop0p1
    /dev/mapper/loop0p2

    コマンドを実行
    fsck /dev/mapper/loop0p2

    ループデバイスをアンマウント
    kpartx -d /dev/loop0
    losetup -d /dev/loop0

    ご報告まで。

dia-sea へ返信する コメントをキャンセル

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

sixteen + 19 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください