omap3-mkcard.sh

非常に面白い。特に sfdisk コマンド。長年 (とは言え 10 数年) Linux 弄ってますが、このコマンド使うの始めてでした。まだまだ修行が足りん。
面白いのでスクリプトを読んでみる事に。
以下に全体を引用。

#!/bin/sh
if [ ! "$1" = "/dev/sda" ] ; then
    DRIVE=$1
    if [ -b "$DRIVE" ] ; then
        dd if=/dev/zero of=$DRIVE bs=1024 count=1024
        SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
        echo DISK SIZE - $SIZE bytes
        CYLINDERS=`echo $SIZE/255/63/512 | bc`
        echo CYLINDERS - $CYLINDERS
        {
        echo ,9,0x0C,*
        echo ,,,-
        } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE
        mkfs.vfat -F 32 -n "boot" ${DRIVE}1
        mke2fs -j -L "rootfs" ${DRIVE}2
    fi 
fi

どうやって一つづつ見ていこう。とりあえず最初の数行は

  • Linux の root partition として採用が多い /dev/sda が指定された場合はマズいかもしれないので処理しない
  • 引数の値 (デバイスファイル文字列) を DRIVE という変数に格納
  • $DRIVE なデバイスファイルがブロックデバイスではない場合、処理しない
  • $DRIVE なデバイスについて、1024 * 1024 bytes な領域に /dev/zero を書き込む
  • fdisk -l な出力からサイズを取り出して SIZE に格納

ええと最後なナニですが、fdisk -l の出力が以下なカンジです。

Disk /dev/sdb: 1020 MB, 1020788736 bytes
255 heads, 63 sectors/track, 124 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1           9       72261    c  W95 FAT32 (LBA)
/dev/sdb2              10         124      923737+  83  Linux

最初の行の 5 番目のエントリですな。
しかもこれって、コマンド実行した後の状態なんですが、見事にそのまんまです。

  • 255 heads
  • 63 sectors
  • sector size は 512 bytes
  • cylinder size は (* 255 63 512) で 8225280 bytes
  • 全体のサイズを cylinder size で割った 124 が cylinder の数

よくよく考えたら /dev/sdb って SDCard なんだよね。cylinder ってなんか変だ。

以降は

  • 直前で SIZE に格納した値を echo で出力
  • CYLINDERS にシリンダの数を計算して格納
  • CYLINDERS に格納した値を echo で出力
  • sfdisk の実行
    • 最初の区画は先頭から 9 cylinder を 0x0C (FAT32LBA) で確保してブート可能に
    • 最後の区画は残り全部を Linux なナニで
    • head、sector、cylinder を明示して sfdisk 実行
  • mkfs.vfat の実行
  • mke2fs の実行

いやはやなかなか。