はじめに
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 ./
おわりに
以上です。