ラズパイ MicroSD自己増殖

電源プチ切り対応したラズパイの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(進捗)表示が可能。