microSDカードの複製について

CAT724からみたSDカードは以下のデバイスになります

/dev/mmcblk0       ... CPUボード上の microSDカード(カード全体)
/dev/mmcblk0p1     ...   第1パーティション
/dev/mmcblk0p2     ...   第2パーティション
/dev/mmcblk0p3     ...   第3パーティション
/dev/mmcblk1       ... マザーボード上の標準サイズSDカード(カード全体)
/dev/mmcblk1p1     ...   第1パーティション
/dev/mmcblk1p2     ...   第2パーティション
/dev/mmcblk1p3     ...   第3パーティション

内蔵ROMで起動するようにする

SDカードで起動している時は SDカードを read/write でマウントしていて、ファイルが変更されうる状態のため、その状態のカードをコピーすることは危険です。

内蔵ROMで起動するようにします。

CAT724のbootloader で
>> admin
password:silinux
#> setparam -d         (内蔵ROM起動に変更)
#> boot

内蔵ROMでLinuxが起動している状態で

login:root
password:root

方法1:ddで丸コピーする方法

全く同一銘柄/同一ロットの microSD カード同士であれば dd (disk dump)コマンドで丸コピー出来ます。ただし「2Gバイト」のように売られている製品でも実際の容量は2Gバイト ”前後” であるため容量が合わないときはこの方法は使えません。(小さい容量→大きい容量への方向であれば大丈夫ですが逆はできません)

コピー先となる microSD を 標準サイズSDカードにサイズを変更するアダプタを経由してマザーボードのSDソケットに入れます。

# dd if=/dev/mmcblk0 of=/dev/mmcblk1

こうすると if (input file) から of (output file) に dd (disk dump)で 丸コピーされますから、パーティションやフォーマットも含め完全に複製されます。

方法2:異なる銘柄のSDカードをコピーするには

新しいSDカードに対して、パーティションを切る → フォーマット → ファイルコピーの順で作業しSDを複製します。

コピー元のSDカードのパーティショニングを確認する

コピー元(/dev/mmcblk0)のパーティション情報をメモします。

# cfdisk /dev/mmcblk0

サンプルで次のようになっていたとします。

Name        Flags   Part Type  FS Type          [Label]        Size (MB)
------------------------------------------------------------------------
mmcblk0p1            Primary   FAT16          [           ]       512.00
mmcblk0p2            Primary   Linux ext3                        3000.01
mmcblk0p3            Primary   Linux swap / Solaris               419.11

cfdiskのメニューから[Print]→[Table]を選択すると PartitionID (1バイトの数字) を見る事も出来ます。

         ---Starting----      
 # Flags Head Sect  Cyl    ID 
-- ----- ---- ---- -----  ----
 1  0x00    1    1     0  0x06
 2  0x00    0    1 15625  0x83
 3  0x00    0    1 107178 0x82
 4  0x00    0    0     0  0x00

実際の /dev/mmcblk0p1 使用容量を確認するには一度 read only でマウントして df -h で表示します。

# mount /dev/mmcblk0p2 /media/sd -o ro              (read only マウント)
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mmcblk0p2        2.8G  488M  2.2G  19% /media/sd
# umount /media/sd/                                 (アンマウント)

表にするとこのようになります

パーティションフォーマットIDサイズ使用容量
1FAT160x06512MB-
2ext30x833,000MB488M
3swap0x82419MB-
4無し0x00----

パーティションを作成する

上記を参照に新しいSDカード(/dev/mmcblk1)にパーティションを作成します。

# cfdisk /dev/mmcblk1
パーティションの作成方法の実際は「組み込みLinuxガイド」等を参考にしてください。

フォーマット

# mkdosfs -F16 /dev/mmcblk1p1
# mkfs.ext3 /dev/mmcblk1p2
# mkswap /dev/mmcblk1p3

コピー

# mkdir /media/sd1
# mount /dev/mmcblk0p2 /media/sd1 -o ro     転送元のカードをread onlyマウントする
# mkdir /media/sd2
# mount /dev/mmcblk1p2 /media/sd2           転送先のカードをマウントする
# cd /media/sd2
# cp -av /media/sd1/* .                      全部コピー
# cd 
# sync
# umount /media/sd1
# umount /media/sd2

SDカードで起動試験する

CAT724のbootloader で
>> admin
password:silinux
#> setparam -s         (SDカードをrootfs指定に変更)
#> boot

関連