前書き

本記事では、Raspberry Pi4のOS imageをバックアップし、より大容量なmicroSDカードにバックアップimageをリストアする方法を紹介します。

Raspberry Piには、「SD Card Copier」というアプリがインストールされていますが、本記事では使用しません。代わりに、CLIでmicroSDカードのデータをバックアップ/リストアします。

検証環境

       _,met$$$$$gg.          nao@debian 
    ,g$$$$$$$$$$$$$$$P.       ---------- 
  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 10 (buster) x86_64 
 ,$$P'              `$$$.     Kernel: 4.19.67 
',$$P       ,ggs.     `$$b:   Uptime: 1 hour, 52 mins 
`d$$'     ,$P"'   .    $$$    Packages: 4331 (dpkg), 13 (flatpak) 
 $$P      d$'     ,    $$P    Shell: fish 3.0.2 
 $$:      $$.   - ,d$$'    Resolution: 2560x1080 
 $$;      Y$b._   _,d$P'      DE: Pantheon 
 Y$$.    `.`"Y$$$$P"'         WM: Mutter(Gala) 
 `$$b      "-.__              Terminal: io.elementary.t 
  `Y$$                        CPU: AMD Ryzen 7 3800X 8- (16) @ 3.900GHz 
   `Y$$.                      GPU: NVIDIA NVIDIA Corporation TU107 
     `$$b.                    Memory: 4549MiB / 64404MiB 
       `Y$$b.
          `"Y$b._                                     

Raspberry Piのバックアップimageを作成

まず、Host環境(Linux)にカードリーダーを接続し、microSDカードを挿入します。microSDカードがLinux上で、どのデバイスファイル(/dev以下のファイル)として認識されているかをfdiskコマンドで調べます。

以下の例では、HDD2個、SSD2個、microSDカード1個が搭載された環境に対して、fdiskコマンドを使用しています。

$ sudo fdisk -l
Disk /dev/sdc: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: WDC WD40EZRZ-00G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 7BABC8AE-DFD4-4249-9877-E00C4E8A169C

Device     Start        End    Sectors  Size Type
/dev/sdc1   2048 7814037134 7814035087  3.7T Linux filesystem

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Disk model: TS256GMTS800    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 87F71BE3-96D5-4AF9-B694-6E2DE9543803

Device         Start       End   Sectors   Size Type
/dev/sda1       2048   1050623   1048576   512M EFI System
/dev/sda2    1050624 433233919 432183296 206.1G Linux filesystem
/dev/sda3  433233920 500117503  66883584  31.9G Linux swap

Disk /dev/sdb: 3.7 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: WDC WD40EZRZ-00G
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: EEF005D9-4A2A-48EC-A27A-009F7D5BA083

Device          Start        End    Sectors  Size Type
/dev/sdb1        2048 3900000000 3899997953  1.8T Linux filesystem
/dev/sdb2  3900000256 7814037134 3914036879  1.8T Linux filesystem

Disk /dev/sdd: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: WDC WDS200T2B0B 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CC896053-2073-495A-A3F0-3D0ECAC02B6E

Device          Start        End    Sectors  Size Type
/dev/sdd1        2048    1050623    1048576  512M EFI System
/dev/sdd2     1050624 3772981247 3771930624  1.8T Linux filesystem
/dev/sdd3  3772981248 3907028991  134047744 63.9G Linux swap

Disk /dev/sde: 14.4 GiB, 15489564672 bytes, 30253056 sectors
Disk model: STORAGE DEVICE  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9edea3d6

Device     Boot  Start      End  Sectors  Size Id Type
/dev/sde1         8192   532479   524288  256M  c W95 FAT32 (LBA)
/dev/sde2       532480 30253055 29720576 14.2G 83 Linux

上記の出力は、HDDやSSDが沢山マウントしてあるので分かりづらいですが、サイズから/dev/sdeがRaspberry Pi用のmicroSDカードだと判断できます。

次に、microSDカードのデータを"raspi.img"としてカレントディレクトリにバックアップします。バックアップには、ddコマンドを使用します。

※ ifがバックアップ対象、ofが出力先のファイルPATH、bsが1度に読み書きするサイズ
$ sudo dd if=/dev/sde of=raspi.img bs=10M

バックアップが完了した後、microSDカードをカードリーダから取り外します。

バックアップimageをmicroSDカードにリストア

先程バックアップしたRaspberry Piのimageを新しいmicroSD(今回は64GB)にリストアします。microSDカードがどのデバイスファイルに割り当てられたかは、前述の手順と同様にfdiskコマンドで確認します(確認結果は省略し、/dev/sdeだったと仮定して以下の手順を進めます)。

バックアップと同様に、リストアにもddコマンドを使用します。

※ ifがバックアップしたimage、ofが出力先のmicroSDカードのPATH、bsが1度に読み書きするサイズ
$ sudo dd if=raspi.img of=/dev/sde bs=20M

microSDカードのパーティションを拡張

今回の例では、Raspberry Pi用のmicroSDカードは、容量が16GBから64GBに拡張されました。しかしながら、ddコマンドで新しいmicroSDカードにリストアしただけでは、使用できる領域は16GBのままです。

そのため、microSDカードのパーティションサイズをmicroSDカードの容量限界まで拡張します。パーティションの拡張には、Raspberry Pi公式の設定ツールであるraspi-configコマンドを使用します。

以下の手順は、Raspberry Pi上で実行してください。

$sudo raspi-config

※ 以下の順で選択肢を選んでください。
[7 Advanced Options]
  ⇓
[A1 Expand Filesystem]
  ⇓
再起動を促すメッセージでYes

おまけ:バックアップimageサイズを縮小する方法

Raspberry Pi公式がバックアップimageを縮小するためのperlスクリプトを提供しています。以下の書式で使用します。

※ スクリプトに実行権限を付与
$ chmod a+x resizeimage.pl 

※ キャッシュをファイルに書き込まないとエラーとなるため、書き出し
$ sync

※ 書式:sudo ./resizeimage.pl $(imageの絶対PATH)
$ sudo ./resizeimage.pl  /home/nao/img/raspi.img
raspi.img:
==========
Old size - 14771 MB (14.43 GB)
New size - 7304 MB (7.13 GB)
Image file was reduced by 7467 MB (7.29 GB)