環境はUbuntu 16.04、コマンドはすべてrootで実行しています。
1. デバイスの特定
ラズパイのOSが入ったSDカードを指して fdisk -l
を実行
この例だと /dev/mmcblk0
がddコマンドの対象(ifパラメータ)になる
# fdisk -l
Disk /dev/sda: 477 GiB, 512110190592 bytes, 1000215216 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: 0xa11e823f
デバイス 起動 Start 最後から セクタ Size Id タイプ
/dev/sda1 * 2048 966846463 966844416 461G 83 Linux
/dev/sda2 966848510 1000214527 33366018 15.9G 5 拡張領域
/dev/sda5 966848512 1000214527 33366016 15.9G 82 Linux スワップ / Solaris
# ここがSDカード。容量とかであたりを付ける
# ddのifに渡すのは /dev/mmcblk0 になる。
Disk /dev/mmcblk0: 14.8 GiB, 15836643328 bytes, 30930944 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: 0xb7ba065b
デバイス 起動 Start 最後から セクタ Size Id タイプ
/dev/mmcblk0p1 8192 93814 85623 41.8M c W95 FAT32 (LBA)
/dev/mmcblk0p2 94208 30930943 30836736 14.7G 83 Linux
2. ddコマンドでバックアップ作成
# dd if=/dev/mmcblk0 of=/tmp/RPI−tensorflow-keras.img bs=1M
3. 空のSDカードに差し替えてumountする
コマンドたたくのが面倒で、Nautilusからマウントを外しちゃいました。
画面左のボリューム一覧の部分にSDカードが新しく出てくるのでそこのEjectボタン的なのを押しました。
4. ddコマンドでレストア。
# dd if=/root/RPI−tensorflow-keras.img of=/dev/mmcblk0 bs=1M
進捗を確認
pkillコマンドというものがあってそれで確認できました。
※Macでこれをやるとddがkillされちゃうらしいので注意。
# pkill -USR1 dd
----------------------
# 別ターミナルでdd実行中の画面
# dd if=/root/RPI−tensorflow-keras.img of=/dev/mmcblk0 bs=1M
9733+0 レコード入力
9733+0 レコード出力
10205790208 bytes (10 GB, 9.5 GiB) copied, 795.021 s, 12.8 MB/s
11936+0 レコード入力
11935+0 レコード出力
12514754560 bytes (13 GB, 12 GiB) copied, 993.262 s, 12.6 MB/s
12818+0 レコード入力
12817+0 レコード出力
13439598592 bytes (13 GB, 13 GiB) copied, 1072.74 s, 12.5 MB/s
12892+0 レコード入力
12892+0 レコード出力
13518241792 bytes (14 GB, 13 GiB) copied, 1079.82 s, 12.5 MB/s
と、ここまで来て
容量が足りないと怒られる。メーカーは違うけど16GB表記なんだけどなんで????
FDISKで容量を確認すると確かに違う。。。。同じの買えってことなのか?
これじゃバックアップ気軽にとれないんだけどな。
# SDカードA
Disk /dev/mmcblk0: 14.8 GiB, 15836643328 bytes, 30930944 sectors
# SDカードB
Disk /dev/mmcblk0: 14.4 GiB, 15487467520 bytes, 30248960 sectors
容量の小さいほうをベースにするとうまくいく
結局コピー元とコピー先をひっくり返したら上手くいきました。なんだかなぁって感じですが。
コピー元を作るときは最小限の容量のカードで、実際に使うものは一回り大きいサイズの物を使う
って感じの運用が良さげかもしれません。ddで8GB->16GBのコピーはやったことがないですが、
公式のイメージは4GBちょっとで、16GBにddで書き込んだらルートのパーティション拡張して
よしなにやってくれたので、初回起動時とか raspi-config
とかが上手いことやってくれそうな気がします。