電源プチ切り対応したラズパイのMicroSDを自己増殖する。コピー先のMicroSDは、100均のMicroSD-USB変換アダプタを使ってラズパイに挿入する。そのMicroSDは「/dev/sda」として認識されるはずである。ddコマンドだけで安直にコピーしても、おそらく問題は起きないが、コピーチェクの時間まで考慮すると、cp -aで実施した方が速い。そのため、下記のような少し手の込んだ対応をする。
前提:私のラズパイのMicroSD(コピー元)のパーティションは下記のようになっている。UUID関連の出力は省略している。
~# blkid /dev/mmcblk0: PTTYPE="dos" /dev/mmcblk0p1: LABEL="boot" TYPE="vfat" /dev/mmcblk0p2: LABEL="rootfs" TYPE="ext4" /dev/mmcblk0p3: LABEL="nfsroot" TYPE="ext4"
以下、非インタラクティブなシェルにしている。(まだ作成中)
ラズパイの場合、先頭領域をddでコピーしなくても良さそうだが、念のためそうしている。
#!/bin/bash ## 先頭64MBだけはddでコピー(パーティション情報と先頭のfat領域をコピー)。 dd if=/dev/mmcblk0 of=/dev/sda bs=16M count=4 sync ## ベリファイ MD5_ORG=`dd if=/dev/mmcblk0 bs=16M count=4 | md5sum` MD5_SDA=`dd if=/dev/sda bs=16M count=4 | md5sum` if [ ! ${MD5_ORG::32} == ${MD5_SDA::32} ] ; then echo "先頭領域のコピーでエラーが発生しました。途中終了します。" exit 1 fi ## MicroSDの容量変更 # 容量を変える場合はフォーマットの前にパーティション調整する。 # CUIならparted, HDMIモニタのX-Window環境ならgpartedで調整すると楽だろう。 ## ext4フォーマット mkfs.ext4 -F /dev/sda2 mkfs.ext4 -F /dev/sda3 ## ラベル付与 e2label /dev/sda2 rootfs e2label /dev/sda3 nfsroot ## コピー ### 電源ブチ切り対応でROマウントしていた部分を一旦RWにする。 mount -oremount,rw / [ -d /mnt/org ] || mkdir /mnt/org [ -d /mnt/new ] || mkdir /mnt/new mount /dev/mmcblk0p2 /mnt/org mount /dev/sda2 /mnt/new cp -aT /mnt/org /mnt/new sync; echo 3 > /proc/sys/vm/drop_caches umount -f /mnt/org /mnt/new ### ROに戻す。 mount -oremount,ro / mount /dev/mmcblk0p3 /mnt/org mount /dev/sda3 /mnt/new cp -aT /mnt/org /mnt/new sync; echo 3 > /proc/sys/vm/drop_caches umount -f /mnt/org /mnt/new
備考:
ddコマンドはコピーチェックをしないので、書込後のハッシュチェックはした方が良い。
cp や rsync はコマンド内にコピーチェック機能が含まれているので、書込後のハッシュチェックは不要。
rsyncよりcpの方が、コピー後のディスク容量が小さくて済む。どちらでも良いケースでは、標準コマンドであるcpを使う方が良い。 一方で、rsyncやddは、progress(進捗)表示が可能。