#はじめに
ラズパイイメージをSDカードからまるまるバックアップしてバージョン管理がしたい。
環境はUbuntu 20.0.4
#ddコマンドについて
ddコマンドは、dataset definitionコマンドで、ディスクドライブのデータを読み出し・書き込みを行うコマンド。ファイルでのコピーとは異なり、バイナリとしてコピーできるので、MBRやGPTなどのパーティション情報や、ファイルシステムのメタデータまでバックアップができる。そのため、SDカードやHDDの完全なバックアップをとることができるので、万が一今のディスクが破壊されたとしても、バックアップイメージを新しいディスクドライブに書き込めば全く同じ状態に戻すことができる。
なお、ddコマンドはdisk destroyerとも呼ばれている。これは、書き込み先のディスクを誤ってOSの入っているシステムドライブに指定してしまうとデータが壊れて起動しなくなってしまう(筆者は2,3回破壊している・・・)という恐ろしいコマンドであることに由来している。
コマンドを実行する前に、書き込み先を念入りに確認すること。。
#手順
まず、fdiskコマンドを使用してSDカードがどのデバイスファイルとして認識されているか確認する。
#SDカードを外した状態で実行
$sudo fdisk -l > before.txt
#SDカードを挿入した状態で実行
$sudo fdisk -l > after.txt
#diffコマンド挿入前後で追加されたデバイスファイルの差分を確認する
$diff -urpN before.txt after.txt
--- before.txt 2020-09-20 15:01:01.056882300 +0900
+++ after.txt 2020-09-20 15:00:35.895621277 +0900
@@ -59,6 +59,19 @@ Device Start End Sectors
/dev/sda2 1050624 490233855 489183232 233.3G Linux filesystem
+Disk /dev/sdb: 29.74 GiB, 31914983424 bytes, 62333952 sectors
+Disk model: SD Card Reader
+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: 0x4a030cf2
+
+Device Boot Start End Sectors Size Id Type
+/dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA)
+/dev/sdb2 532480 62333951 61801472 29.5G 83 Linux
+
+
Disk /dev/loop8: 160.16 MiB, 167931904 bytes, 327992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
/dev/sdbがバックアップ対象SDカードのデバイスファイルであることが分かる。sdb1, sdb2とかっていうのは、ディスク内のパーティション番号。
ddコマンドでバックアップする。32GBもバックアップしたくないな。。
とりあえず、テスト用bs(buffer size)3回分(3*4M = 12MB)だけバックアップする。
$sudo dd bs=4M if=/dev/sdb of=./backup.img conv=fsync count=3
$ls -l
total 12288
-rw-r--r-- 1 root root 12582912 9月 20 15:07 backup.img
できた!
count=3を削除すれば、まるごとバックアップできるはず。