💾

ラズパイのSDカードをまるごとバックアップ/リストア【小ネタ】

2023/12/12に公開

はじめに

概要

ラズベリーパイで何らかのシステムを構築した際、ある時点でのSDカードの内容を保存しておきたいことがあります。また、ホスト名やIPアドレス以外は全く同じシステムを複数台作りたいことがあるかもしれません。

このようなとき、SDカードを、イメージファイルとしてまるごとHDDに書き出してバックアップする方法があります。同じシステムを複数台作るなら、このバックアップから複数のSDカードへ復元すれば済みます。

以下では、SDカードをまるごとHDDに書き出すバックアップ方法、HDDに書き出したイメージファイルのサイズを小さくする縮小化方法、HDD上にあるイメージファイルをSDカードに書き込むリストア方法を紹介します。

用意するもの

  • 構築済みのSDカード(バックアップ対象のSDカード、microSD等)
  • リストア先のSDカード(リストアが必要な場合)
  • Windows PC(Windowsで動作するソフトを使用するため。また、WSLが動くと、イメージの縮小化が簡単。)
  • ディスクイメージ作成ソフト(以下の機能が必要。本記事では DD for Windows を使用。)
    • バックアップ … SDカードから抽出して、イメージファイルとしてHDDへ書き出す機能
    • リストア … HDD上にあるイメージファイルをSDカードへ書き込む機能
  • イメージファイルの縮小化を行う場合は以下も必要
    • LinuxやWSL等(Perl言語が実行できるLinux)
    • イメージファイルの縮小化プログラム(フォーラムに掲載のプログラムを使用)

例示環境

今回、SDカードのバックアップやリストアの例を示しますが、その際に使用した環境は次のとおりです。

項目 内容 備考
使用したSDカード microSDカード、8GB 本記事ではmicroSDカードを「SDカード」と呼ぶ
バックアップ/リストアを実行するOS Windows 10
バックアップ/リストアで使用するツール DD for Windows Ver.0.9.9.8
(新バージョン(ver.1.0.x.x)はベータ版のみ)
保存先フォルダ D:\SDimage イメージファイルおよび縮小化プログラム
イメージファイル名 raspi_8GB.ddi .ddiは DD for Windowsの拡張子だが、形式は通常のイメージファイル
縮小化プログラムの実行環境 Windows 10のWSL上のUbuntu Ubuntu 22.04.1 LTS

ディスクイメージ作成ソフト

「例示環境」にも示しましたが、ディスクイメージ作成ソフトとして今回使用するツールは「DD for Windows」です。DD for Windows は、シリコンリナックス社が無料で公開しているソフトウエアです。

参考リンク1:
DD for Windows - Tech Info (Silicon Linux)

参考リンク1に記載された「概要」を以下に引用します。

・Windows 上で CF/SD/USBメモリのディスクイメージのバックアップ、リカバリーを行います。
・完全なディスクイメージの読み書きを行いますのでコンパクトフラッシュのフォーマット形式は問いません。
・SiliconLinux等、ext2形でフォーマットされたCFのバックアップやリカバー、遠隔地へのディスクイメージの転送を行うのに最適です。

ここにもあるとおり、古くは、ext2フォーマットのLinuxで使用していたCF(コンパクトフラッシュ)カードをバックアップするために、DD for Windows が使われていたようです。CFカードやSDカード等の内容をディスクイメージファイルとしてまるごとバックアップするため、そのディスクがどのようなフォーマットかに寄らず使用できます。

DD for Windows は、大きく2種類のバージョンが存在します。

  • ver.0.9.xx.xx … 旧バージョン。安定動作。
  • ver.1.0.xx.xx … 新バージョン(R2)。まだベータ版。

今回は、安定動作している旧バージョンの最新版である ver.0.9.9.8 を使用します。

参考リンク1の「よくある問い合わせ」にもあるとおり、SDカード等のドライブを表示させるために、DD for Windows を「管理者として実行」で起動する必要があります。(Windows 7以降)

縮小化プログラムの作成(最初の1回のみ)

概要

イメージファイルの縮小化とは、HDDにバックアップしたイメージファイルについて、未使用領域などを省いてイメージファイルのサイズを小さくすることです。

ディスクイメージ作成ソフトで書き出したイメージファイルは、SDカードの空き容量等に関係なくSDカードの最大容量となります。たとえば、8GBのSDカードを使用していたら、書き出されるイメージファイルも8GBとなります。5GBの空き容量があったとしても、イメージファイルとして書き出すと8GBになります。

ですので、これをそのまま保存しておくと、HDDをかなり圧迫してしまいます。(しかしながら、筆者は、万一のことを考え、オリジナルのイメージファイルと、ここで紹介する縮小化したイメージファイルの両方を保存しています。そして、必要なもの以外は、すべて外付けHDDに移しています。)

また、同じ容量のSDカードであっても、メーカや型番により、微妙に容量が異なります(たとえば、8GBとして販売されているSDカードで、一方は8.00GB、もう一方は7.99GBなど)。この微妙な違いにより、バックアップしたイメージファイルをSDカードに書き込めないことがあります(たとえば、8.00GBのSDカードから作成したイメージファイルを、7.99GBのSDカードには、ほんの少しの容量不足で書き込みできない)。ここで紹介する縮小化を行うことで、この問題も解決できます。

縮小化のための「縮小化プログラム」は、Raspberry Piのフォーラムの「Reducing Raspbian File System Image Size」とういう投稿(参考リンク2)に掲載されています。このプログラムは、Perl言語で記述されたプログラムで、LinuxやWSLで実行します。

参考リンク2:
Reducing Raspbian File System Image Size - Raspberry Pi Forums

ここでは、参考リンク2に掲載されている縮小化プログラムを文字コピーして、メモ帳に貼り付け、ローカルのディスクに保存します。保存先は、「例示環境」で示した保存先フォルダ(D:\SDimage)とし、ファイル名は参考リンク2に記載されている「resizeimage.pl」とします。

※ このプログラムは、LinuxやWSLで実行します。今回はWindowsのWSL上のUbuntuで実行するため、ローカルディスクに保存しています。別のLinuxマシン等で実行する場合は、そちらに保存する必要があります。


※ ここでは、外部サイトに掲載されているプログラムを利用します。
※ 参考リンク2の内容をよく読み、理解してから使用してください。
※ プログラム使用により損害等が発生しても、当方は一切の責任を負いません。

実際の手順

上記の参考リンク2にアクセス
↑ 上記の参考リンク2にアクセス ↑

コード部分の「Select all」をクリック
↑ コード部分の「Select all」をクリック ↑

コードが選択状態になるので、キーボードで「Ctrl」+「C」
↑ コードが選択状態になるので、キーボードで「Ctrl」+「C」 ↑

メモ帳を開いて、キーボードで「Ctrl」+「V」
↑ メモ帳を開いて、キーボードで「Ctrl」+「V」 ↑

メモ帳で「ファイル」メニュー → 「名前を付けて保存」
↑ メモ帳で「ファイル」メニュー → 「名前を付けて保存」 ↑

フォルダ「D:\SDimage」選択、ファイル名「resizeimage.pl」入力、「保存」ボタンクリック
↑ フォルダ「D:\SDimage」選択、ファイル名「resizeimage.pl」入力、「保存」ボタンクリック ↑

エクスプローラーで確認
↑ エクスプローラーで確認 ↑

バックアップ

大まかな流れ

手順1.SDカードをWindows PCに接続
手順2.ディスクイメージ作成ソフトでHDDにイメージ作成
手順3.イメージファイルの縮小化

手順1.SDカードをWindows PCに接続

SDカードリーダ等を使用して、Windows PCにSDカードを接続します。


※ フォーマット厳禁!!

Raspberry Pi OSをインストールしたSDカードには、通常のWindowsでは読み取れないパーティションが含まれています。このため、SDカードをWindowsに接続した際に「フォーマットしますか?」のようなメッセージが表示されます。これはWindowsが認識できていないだけで、Raspberry Pi OSはインストールされていますので、フォーマットは絶対にしないでください。

↑ 「フォーマットしますか?」が表示されたら、必ず「キャンセル」する ↑
↑ 「フォーマットしますか?」が表示されたら、必ず「キャンセル」する ↑

手順2.ディスクイメージ作成ソフトでHDDにイメージ作成

概要

ここでは、SDカードをまるごとイメージファイルとしてHDDに書き出します。使用するツールは「DD for Windows」です。Windows 7以降では、D for Windowsを「管理者として実行」で起動する必要があります。

手順2-1 作成するイメージファイル名の指定

↑ DD for Windowsを(「管理者として実行」で)起動し、「ファイル選択」ボタンをクリック ↑
↑ DD for Windowsを(「管理者として実行」で)起動し、「ファイル選択」ボタンをクリック ↑

↑↑フォルダ「D:\SDimage」を選択、ファイル名「raspi_8GB」を入力、「開く」ボタンをクリック ↑
↑ フォルダ「D:\SDimage」を選択、ファイル名「raspi_8GB」を入力、「開く」ボタンをクリック ↑

↑ DD for Windows画面に戻る ↑ (「対象ファイル」に上で指定したファイルが表示されているはず)
↑ DD for Windows画面に戻る ↑ (「対象ファイル」に上で指定したファイルが表示されているはず)

手順2-2 イメージファイル作成

↑ 左側「対象ディスク」がSDカードのドライブであることを確認し、「読込」ボタンをクリック ↑
↑ 左側「対象ディスク」がSDカードのドライブであることを確認し、「読込」ボタンをクリック ↑

確認画面が表示されたら「はい」ボタンをクリック
↑ 確認画面が表示されたら「はい」ボタンをクリック ↑

読み込みが完了するまで待つ(容量や読込速度等によって数分~数十分以上かかる)
↑ 読み込みが完了するまで待つ ↑(容量や読込速度等によって数分~数十分以上かかる)

「読込が完了しました」と表示されれば完了
↑ 「読込が完了しました」と表示されれば完了 ↑

手順2-3 作成されたファイルを確認

エクスプローラーで保存先フォルダを開き、ファイルがあることを確認する
↑ エクスプローラーで保存先フォルダを開き、ファイルがあることを確認する ↑

バックアップ後

イメージファイルの縮小化をしない場合は、以上で、バックアップ完了です。

バックアップ後は、本来なら、バックアップしたイメージファイルが壊れていないか、リストアを実施して確認すべきです。イメージファイルへの書き出しが、何らかの不具合で失敗している可能性があるからです。簡易的な確認方法としては、DD for Windowsの「照合」ボタンにより行うことができます。

手順3.イメージファイルの縮小化

必要な環境

  • LinuxマシンあるいはWSL上で動くLinux
    (縮小化プログラムはperl言語で記述されているので、これが実行できるLinux)
  • そのLinuxで、手順2で作成したイメージファイルを読み取り/書き込みできること

Linuxの物理マシンを用意するのは大変かもしれません。WSLが使えない場合は、Windows上に何らかの仮想化ツールでLinuxを用意する方法も考えられます。また、ラズベリーパイもLinuxマシンですので、マシンパワーはありませんが縮小化プログラムを動かすことは可能です。

縮小化プログラムや縮小化するイメージファイルは、ファイル共有機能やUSBメモリ等を使用して、Linux上で読み書きできるようにします。WSLは、Windowsのフォルダにもアクセスできるので楽です。

以下では、手順2を実施したのと同じWindowsにおいて、WSL上のUbuntu 22.04.1 LTSを使用した例となります。


※ ここでは、外部サイトに掲載されているプログラムを利用します。
※ 参考リンク2の内容をよく読み、理解してから使用してください。
※ プログラム使用により損害等が発生しても、当方は一切の責任を負いません。

手順3-1 イメージファイルのコピー(必要なら)

縮小化プログラムを実行すると、イメージファイルは上書きされ縮小化後のファイルのみが残ります。もし、元のイメージファイルも別に保存しておきたければ、縮小化の前にコピーを取っておきます。

イメージファイルは上書きされるので、必要ならコピーを取っておく
↑ イメージファイルは上書きされるので、必要ならコピーを取っておく ↑

手順3-2 イメージファイルの縮小化

$ cd /mnt/d/SDimage

↑ WSL上のUbuntuを起動し、/mnt/d/SDimage ディレクトリへ移動 ↑ (WindowsのDドライブは、WSLのUbuntu上では「/mnt/d」ディレクトリとなる)

$ ls -l
total 15728644
-rwxrwxrwx 1 user01 user01 8053063680 Xxx XX xx:xx raspi_8GB.ddi
-rwxrwxrwx 1 user01 user01 8053063680 Xxx XX xx:xx raspi_8GB_ORG.ddi
-rwxrwxrwx 1 user01 user01       1759 Xxx XX xx:xx resizeimage.pl

↑ lsコマンドで確認 ↑ (イメージファイルと縮小化プログラムが確認できる)

$ sudo perl ./resizeimage.pl /mnt/d/SDimage/raspi_8GB.ddi
[sudo] password for user01:

raspi_8GB.ddi:
==============
Old size - 7679 MB (7.50 GB)
New size - 3666 MB (3.58 GB)
Image file was reduced by 4013 MB (3.92 GB)

↑ 管理者権限で縮小化プログラムを実行 ↑ (縮小化プログラムは管理者で実行する必要がある。また、対象となるイメージファイルは絶対パスで指定する必要がある)

しばらく待つ。
結果(Image file was reduced by xxxx MB (x.xx GB))が表示されたら、、、

$ ls -l
total 11618916
-rwxrwxrwx 1 user01 user01 3844698113 Xxx XX xx:xx raspi_8GB.ddi
-rwxrwxrwx 1 user01 user01 8053063680 Xxx XX xx:xx raspi_8GB_ORG.ddi
-rwxrwxrwx 1 user01 user01       1759 Xxx XX xx:xx resizeimage.pl

↑ lsコマンドで確認 ↑ (ファイルサイズが小さくなっているのが確認できる)

Windowsのエクスプローラーで確認
↑ Windowsのエクスプローラーで確認 ↑ (ファイルサイズが小さくなっているのが確認できる)

縮小化後

縮小化後は、本来なら、以下のリストア手順を実施し、正しく復元できることを確認するべきです。

バックアップ時(イメージファイル作成時)や縮小化時に何らかの不具合でファイルが壊れている可能性があるからです。

リストア

大まかな流れ

手順1.SDカードをWindows PCに接続
手順2.イメージファイルをSDカードへ書き込み
手順3.ラズパイでファイルシステム拡張


※ リストアの手順では、SDカードが上書きされます。
※ SDカードの内容は、すべて消えてしまいますので、ご注意ください。

手順1.SDカードをWindows PCに接続

SDカードリーダ等を使用して、Windows PCにSDカードを接続します。

手順2.イメージファイルをSDカードへ書き込み

概要

バックアップしたイメージファイルをリストアするには、ディスクイメージ書き込みソフトを使用します。バックアップで使用した DD for Windows はリストアでも使用できます。また、balenaEtcher なども使用可能です。

参考リンク3:
balenaEtcher - Flash OS images to SD cards & USB drives

ここでは、以下の環境で実行した例を示します。

項目 内容 備考
リストア先SDカード microSDカード、8GB 既存の内容はすべて消えるので注意!!
使用ツール DD for Windows Ver.0.9.9.8
イメージファイル D:\SDimage\raspi_8GB.ddi 上でバックアップし、
縮小化したイメージファイル

手順2-1 イメージファイル選択

↑ DD for Windowsを(「管理者として実行」で)起動し、「ファイル選択」ボタンをクリック ↑
↑ DD for Windowsを(「管理者として実行」で)起動し、「ファイル選択」ボタンをクリック ↑

↑ フォルダ「D:\SDimage」を選択、ファイル「raspi_8GB.ddi」を選択、「開く」ボタンをクリック ↑
↑ フォルダ「D:\SDimage」を選択、ファイル「raspi_8GB.ddi」を選択、「開く」ボタンをクリック ↑

↑ DD for Windows画面に戻る ↑ (「対象ファイル」に上で指定したファイルが表示されているはず)
↑ DD for Windows画面に戻る ↑ (「対象ファイル」に上で指定したファイルが表示されているはず)

手順2-2 SDカードへ書き込み


※ ここでは、SDカードに書き込みを行います。
※ SDカードの内容は、すべて消えてしまいますので、ご注意ください。

※ また、対象ディスクの選択を間違えると、
※ 意図しないディスクに書き込んでしまいます。
※ 対象ディスクを確実に確認してください。

↑ 左側「対象ディスク」がSDカードのドライブであることを確認(書き込み先なので確実に確認!!)し、「書込」ボタンをクリック ↑
↑ 左側「対象ディスク」がSDカードのドライブであることを確認(書き込み先なので確実に確認!!)し、「書込」ボタンをクリック ↑

↑ ディスク容量よりイメージファイルのサイズが小さい場合、メッセージが表示される。よければ、「はい」をクリック ↑
↑ ディスク容量よりイメージファイルのサイズが小さい場合、メッセージが表示される。よければ、「はい」をクリック ↑

↑ ディスクへ書き込みしてよいか、の確認メッセージ。よければ、「はい」をクリック ↑
↑ ディスクへ書き込みしてよいか、の確認メッセージ。よければ、「はい」をクリック ↑

↑ サイズが4GBを超えている場合、メッセージが表示される。よければ、「はい」をクリック ↑
↑ サイズが4GBを超えている場合、メッセージが表示される。よければ、「はい」をクリック ↑

↑ 書き込みが完了するまで待つ ↑(容量や書込速度等によって数分~数十分以上かかる)
↑ 書き込みが完了するまで待つ ↑(容量や書込速度等によって数分~数十分以上かかる)

↑ 「書込が完了しました」と表示されれば完了 ↑
↑ 「書込が完了しました」と表示されれば完了 ↑

↑ WindowsがSDカードを新たなドライブとして再認識する場合がある。「キャンセル」をクリックする。 ↑
↑ WindowsがSDカードを新たなドライブとして再認識する場合がある。「キャンセル」をクリックする。 ↑

※ 最後の「フォーマットしますか?」の問い合わせは、バックアップの章で紹介したように、Windowsが認識できないパーティションがSDカード内に発見されたために表示されました。Windowsが認識できないだけですので、フォーマットは絶対にしない でください。

手順3.ラズパイでファイルシステム拡張

概要

リストアした場合、元イメージファイルのサイズが、SDカードの保存可能領域のサイズになります。それ以外の領域は未フォーマット部分として、全く使われない領域となります。たとえば、次のような事例です。

  • 縮小化したイメージファイルをリストアした
    たとえば、、、
    8GBのSDカードからイメージ作成 → イメージ縮小化(3GBになった) → 8GBのSDカードへリストア
    = 縮小化イメージの3GBが保存可能領域、残りの5GBは使われない領域
  • 大きいサイズのSDカードへリストアした
    たとえば、、、
    8GBのSDカードからイメージ作成 → 16GBのSDカードへリストア
    = 元イメージの8GBが保存可能領域、残りの8GBは使われない領域

この状態のままでは、使われない領域は完全に無駄となりますし、縮小化イメージをリストアした場合は、保存可能領域の空き容量はほとんどないため、サービスが起動できないなど、システムの動作に支障をきたします。

このような使われない領域を使えるようにするために、ファイルシステムの拡張を行います。ファイルシステムの拡張を実行することで、使用可能領域が最大まで拡張されます。

※ 実は、公式が公開するRaspberry Pi OSも同様で、公開されたイメージファイルは縮小化された状態となっており、これをSDカードへ書き込んだ後は、ファイルシステム拡張を行う必要があります。ただ、最近のRaspberry Pi OSでは、書き込み直後の最初の起動時に、自動的にファイルシステム拡張が実行されるようになっています。

手動でファイルシステム拡張を行う場合、raspi-configコマンドを使用するのが簡単です。具体的には、以下のメニュー項目となります(OS ver.11(bullseye)に付属の raspi-config ver.20230214 の場合)。

「6 Advanced Options」 → 「A1 Expand Filesystem」

実行後には、再起動を促すメッセージが表示されますので、それに従って再起動することでファイルシステム拡張が完了します。

なお、raspi-configコマンドの操作は、文字入力等がなければ(今回はない)、上下矢印キー、左右矢印キー、[Enter]キーだけで操作可能です。

  • 上下矢印キー → メニュー項目の選択
  • 左右矢印キー → 画面下部のボタン選択
  • [Enter]キー → 選択されたメニュー項目やボタンの確定

手順3-1 ラズベリーパイを起動

Windowsの「安全に取り外す」等を使用してリストアしたSDカードを取り外し、ラズベリーパイに取り付け、ラズベリーパイの電源を入れて起動します。

手順3-2 ファイルシステム拡張の実行

$ sudo fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.5 GiB, 8053063680 bytes, 15728640 sectors
...
Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        8192  532479  524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      532480 7394488 6862009  3.3G 83 Linux

↑ fdiskコマンドで現在の状態を確認 ↑(7.5Gのディスクで、256Mと3.3Gの領域が確保されている)

$ sudo raspi-config

↑ 管理者権限で、raspi-configコマンドを実行する ↑

↑ 上下矢印キーで「6 Advanced Options」に合わせ、[Enter]キーを押す ↑
↑ 上下矢印キーで「6 Advanced Options」に合わせ、[Enter]キーを押す ↑

↑ 「A1 Expand Filesystem」に合っていることを確認し、[Enter]キーを押す ↑
↑ 「A1 Expand Filesystem」に合っていることを確認し、[Enter]キーを押す ↑

何か処理が行われるので、少し待つ。
raspi-configの画面に戻ったら、、、

↑ 拡張が完了した旨メッセージが表示される。[Eneter]キーを押す ↑
↑ 拡張が完了した旨メッセージが表示される。[Eneter]キーを押す ↑

↑ 左右矢印キーで「Finish」に合わせ、[Enter]キーを押す ↑
↑ 左右矢印キーで「Finish」に合わせ、[Enter]キーを押す ↑

↑ 今すぐ再起動するかのメッセージ。左右矢印キーで「はい」に合わせ、[Enter]キーを押す ↑
↑ 今すぐ再起動するかのメッセージ。左右矢印キーで「はい」に合わせ、[Enter]キーを押す ↑

ラズベリーパイが再起動する。
再起動後、、、

$ sudo fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.5 GiB, 8053063680 bytes, 15728640 sectors
...
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1        8192   532479   524288  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      532480 15728639 15196160  7.2G 83 Linux

↑ fdiskコマンドで現在の状態を確認 ↑(/dev/mmcblk0p2 の領域が 7.2G に拡張されたことが分かる)

リストア後

以上でリストアは完了です。

この後は、必要なら、復元したラズベリーパイにて固有の設定(ホスト名変更やIPアドレス設定、その他)を行います。

Discussion