RaspberryPi で RaspberryPi をバックアップ
「https://qiita.com/nanbuwks/items/294e54d9f843e9c35032」
の応用です。
やること
- xz ファイル・zip ファイルを解凍しながら microSD カードに書き込みます
- dd を使います
- 進捗も表示します
環境
以下で試しました。
- Ubuntu 18.04
- Raspbian 2020-02-13-raspbian-buster.zip
2022/7/29 追記:
以下の組み合わせで xz 形式のファイルも OK なことを確認しました。
- Ubuntu 22.04
- Raspberry Pi OS Lite Release date: April 4th 2022 2022-04-04-raspios-bullseye-armhf-lite.img.xz
あらかじめ、Raspbian の zip ファイル または Raspbery Pi OS の xz ファイルはダウンロードしておきます。
microSD カードを Ubuntu Linux に刺す
刺すとオートマウントされるので、アンマウントします。
ファイルマネージャでアンマウントすると、デバイスファイルも無くなってしまうので以下で。
$ sudo umount /dev/sdb1
既にRaspbian が書かれている microSDカードなどでは、パーティションが複数あるので全てアンマウントします。
$ sudo umount /dev/sdb2
書き込みの準備
書き込み先を確認します。
$ sudo fdisk -l
ディスク /dev/loop0: 2.4 MiB, 2531328 バイト, 4944 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク /dev/loop1: 4.2 MiB, 4448256 バイト, 8688 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
・・・
ディスク /dev/sdb: 7.4 GiB, 7948206080 バイト, 15523840 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xea7d04d6
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/sdb2 532480 7397375 6864896 3.3G 83 Linux
/dev/sdbというのがわかりました。
書き込みツールは dd を使いますが危険なので、一旦環境変数にコピー元、コピー先を記述することでワンクション置きます。
ZIPファイルの場合は、以下のようにします。
$ export SOURCE=2020-02-13-raspbian-buster.zip
$ export DIST=/dev/sdb
xz ファイルの場合は同様にして、以下のようにします。
$ export SOURCE=2022-04-04-raspios-bullseye-armhf-lite.img.xz
$ export DIST=/dev/sdb
書き込み
ZIPファイルの場合は、以下のようにします。
$ sudo unzip -p $SOURCE | sudo dd bs=4k of=$DIST status=progress
xzファイルの場合は同様にして、以下のようにします。
$ xz -dc $SOURCE | sudo dd bs=4k of=$DIST status=progress
以下のように書き込みが進みます。
1987784704 bytes (2.0 GB, 1.9 GiB) copied, 14 s, 142 MB/s
以下のようになって終わります。メモリバッファがフラッシュしている間は止まっているように見えますが、焦らず待ちます。
924672+0 レコード入力
924672+0 レコード出力
3787456512 bytes (3.8 GB, 3.5 GiB) copied, 387.193 s, 9.8 MB/s
dd はバッファサイズごとに同期書き込みしているのかな? しかし念の為にsyncを3回
$ sync
$ sync
$ sync
microSDカードを取り出して動作確認し、うまく動けばOKです。