#! /bin/sh
# mk3PartSDCard.sh v0.3
# Licensed under terms of GPLv2

# 参考文档:
# 1. sfidsk创建可启动分区问题
#
# 2. sfdisk 中文手册
#
# 3. linux sfdisk partition
#
# 4. How to Make 3 Partition SD Card
#

if [ $# -ne 1 ]; then
echo "USAGE:"
echo " $0 <device node>"
exit -1;
fi

# 获取SD卡设备节点,并擦除分区表
DRIVE=$1
dd if=/dev/zero of=$DRIVE bs=1024 count=1024

# 获取SD卡大小,并在terminal中显示字节大小
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
echo DISK SIZE - $SIZE bytes

# 计算磁柱数
# 每一个柱面的大小为255*63*512=8,225,280 Bytes
CYLINDERS=`echo $SIZE/255/63/512 | bc`

# Usage:
# sfdisk [options] <device> [...]
#
# Options:
# -s, --show-size list size of a partition
# -c, --id change or print partition Id
# --change-id change Id
# --print-id print Id
# -l, --list list partitions of each device
# -d, --dump idem, but in a format suitable for later input
# -i, --increment number cylinders etc. from 1 instead of from 0
# -u, --unit <letter> units to be used; <letter> can be one of
# S (sectors), C (cylinders), B (blocks), or M (MB)
# -1, --one-only reserved option that does nothing currently
# -T, --list-types list the known partition types
# -D, --DOS for DOS-compatibility: waste a little space
# -E, --DOS-extended DOS extended partition compatibility
# -R, --re-read make the kernel reread the partition table
# -N <number> change only the partition with this <number>
# -n do not actually write to disk
# -O <file> save the sectors that will be overwritten to <file>
# -I <file> restore sectors from <file>
# -V, --verify check that the listed partitions are reasonable
# -v, --version display version information and exit
# -h, --help display this help text and exit
#
# Dangerous options:
# -f, --force disable all consistency checking
# --no-reread do not check whether the partition is in use
# -q, --quiet suppress warning messages
# -L, --Linux do not complain about things irrelevant for Linux
# -g, --show-geometry print the kernel's idea of the geometry
# -G, --show-pt-geometry print geometry guessed from the partition table
# -A, --activate[=<device>] activate bootable flag
# -U, --unhide[=<dev>] set partition unhidden
# -x, --show-extended also list extended partitions in the output,
# or expect descriptors for them in the input
# --leave-last do not allocate the last cylinder
# --IBM same as --leave-last
# --in-order partitions are in order
# --not-in-order partitions are not in order
# --inside-outer all logicals inside outermost extended
# --not-inside-outer not all logicals inside outermost extended
# --nested every partition is disjoint from all others
# --chained like nested, but extended partitions may lie outside
# --onesector partitions are mutually disjoint
#
# Override the detected geometry using:
# -C, --cylinders <number> set the number of cylinders to use
# -H, --heads <number> set the number of heads to use
# -S, --sectors <number> set the number of sectors to use
#

# sfdisk的-D参数指定与DOS兼容,并自动在每个分区前预留空间,以存放MBR(Master Boot Record);
#
# <start>, <size>, <id>, <bootable>
#
# bootable 可以指定为[*|-]格式,默认值是"-"也就是没有可引导标记。
# 这个标记仅对DOS有意义:DOS会给带有可引导标记的主分区分配 C: 盘符
#
# id 应该以无"0x"前缀的格式给出其十六进制值,或者[E|S|L]简写字母:
# L(83)是默认值;
# S(82,LINUX_SWAP);
# E(5,扩展分区)。
#
# 第一行分区描述,9,0x0C,* 自动分配起始柱面,数量为9,分区ID为0x0C(表示FAT32分区),<bootable>为*, 表示可启动分区。
# 第二行分区描述10,115,,- 同样自动分配起柱面,数量为115,其它为默认。
# 第三行分区描述126,,,- 同样自动分配起柱面,剩下所有的数量,其它为默认。
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
,9,0x0C,*
10,115,,-
126,,,-
EOF

# 这里可以得到一张FAT32分区的SD卡,我有时候我们就只需要一张这样的卡
# sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
# ,,0x0C,*
# EOF

# 格式化各个分区,格式化完卸载对应的分区
mkfs.vfat -F 32 -n "boot" ${DRIVE}1
umount ${DRIVE}1
mkfs.ext3 -L "rootfs" ${DRIVE}2
umount ${DRIVE}2
mkfs.ext3 -L "START_HERE" ${DRIVE}3