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 の実行
いやはやなかなか。