SD card を ddコマンドでバックアップする

はじめに

Raspberry Pi を使用する多くの場合、ストレージとしてSD(microSD)カードを使いますが、以前の実績のある環境を復元できるようにするために、イメージとしてバックアップできると便利です。

今回は、以前使用していた16GBのSDカードをUbuntuネイティブ環境(22.04)にてバックアップしました。

dmesg

SDカード挿入後、dmesg には下記が出力されていました。

(略)
[   87.657425] mmc0: new ultra high speed SDR104 SDHC card at address 0007
[   87.670036] mmcblk0: mmc0:0007 SD16G 14.4 GiB 
[   87.672381]  mmcblk0: p1 p2 < p5 p6 p7 >

fdisk

対象となるファイルディスクリプタを探すため fdisk を実行します。

wurly@k8s-worker1:~$ sudo fdisk -l

(省略)

Device           Start       End   Sectors   Size Type
/dev/nvme0n1p1    2048   2203647   2201600     1G EFI System
/dev/nvme0n1p2 2203648   6397951   4194304     2G Linux filesystem
/dev/nvme0n1p3 6397952 500115455 493717504 235.4G Linux filesystem

(省略)

Disk /dev/mmcblk0: 14.43 GiB, 15489564672 bytes, 30253056 sectors
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: 0x00059948

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         2048  2792968  2790921  1.3G  e W95 FAT16 (LBA)
/dev/mmcblk0p2      2792969 30253055 27460087 13.1G  5 Extended
/dev/mmcblk0p5      2793472  2859005    65534   32M 83 Linux
/dev/mmcblk0p6      2859008  2994175   135168   66M  c W95 FAT32 (LBA)
/dev/mmcblk0p7      2998272 30253055 27254784   13G 83 Linux

いろいろ出力されるのでわかりにくいですが、 “Disk identifier” が含まれている下記2つのブロックが物理的なストレージを示してます。

/dev/nvme0n1 がメインのNVMe SSDで、 /dev/mmcblk0 が今回の SDカードと判断します。

バックアップ&リストア

バックアップ

ブロックサイズの指定をしないとかなり遅いので、bs=67108864 (64MB) を指定して上手くいきました。 また、進捗表示されないと不便なので status=progress も指定します。

sudo dd if=/dev/mmcblk0 bs=67108864 status=progress | gzip > ./hoge.dd.gz

リストア

バックアップのときと同様のオプションを使用します。

gzip -c ./hoge.dd.gz | sudo dd of=/dev/mmcblk0 bs=67108864 status=progress

事例

Raspberry Pi 3B バックアップ

下記でバックアップしました。

$ sudo dd if=/dev/mmcblk0  of=./rasp3b20240223.dd
30253056+0 records in
30253056+0 records out
15489564672 bytes (15 GB, 14 GiB) copied, 291.306 s, 53.2 MB/s

K8Sコントロールプレーン(ラズパイ)バックアップ、N台目が決まっていない状態

汎用的に使用できるようにするため、有線側のLANを無効にします。

/etc/netplan/01-netcfg.yaml の記述を全てコメントアウトします。

ホスト名を下記に変更します。

$ hostnamectl set-hostname k8s-ctrl99

sudo dd if=/dev/mmcblk0 bs=67108864 status=progress | gzip > ./k8s-rsp4b-base.dd.gz

K8Sコントロールプレーン(ラズパイ)バックアップ、N台目が決まっている状態

backup-k8s-ctrl1.sh

sudo dd if=/dev/mmcblk0 bs=67108864 status=progress | gzip > ./k8s-rsp4b-ctrl1.dd.gz

backup-k8s-ctrl2.sh

sudo dd if=/dev/mmcblk0 bs=67108864 status=progress | gzip > ./k8s-rsp4b-ctrl2.dd.gz

backup-k8s-ctrl3.sh

sudo dd if=/dev/mmcblk0 bs=67108864 status=progress | gzip > ./k8s-rsp4b-ctrl3.dd.gz

K8Sコントロールプレーン(ラズパイ)リストア

バックアップから復帰させます。

gzip -c ./k8s-rsp4b-base.dd.gz | sudo dd of=/dev/mmcblk0 bs=67108864 status=progress

ホストネームをセット、固定IPをセットし、WiFiは無効にします。

hostnamectl set-hostname k8s-ctrl1

おまけ

踏み台にしてコピーする場合

alias scpk8sw1='scp -o ProxyCommand="ssh -W %h:%p root@192.168.1.100" -i ~/.ssh/id_ed25519'

# scp -o ProxyCommand="ssh -W %h:%p root@192.168.1.100" -i ~/.ssh/id_ed25519 wurly@192.168.10.21:/home/wurly/k8s-rsp4b-base.dd.gz ./

おわりに

以上です。

Copied title and URL