#! /bin/sh# mk3PartSDCard.sh v0.3# Licensed under terms of GPLv2# 参考文档:# 1. sfidsk创建可启动分区问题# http://segmentfault.com/a/1190000002493628# 2. sfdisk 中文手册# http://blog.csdn.net/hnmsky/article/details/7650964# 3. linux sfdisk partition# http://blog.csdn.net/shell_albert/article/details/8425530# 4. How to Make 3 Partition SD Card# http://processors.wiki.ti.com/index.php/How_to_Make_3_Partition_SD_Cardif [ $# -ne 1 ]; then echo "USAGE:" echo " $0" exit -1;fi# 获取SD卡设备节点,并擦除分区表DRIVE=$1dd 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 BytesCYLINDERS=`echo $SIZE/255/63/512 | bc`# Usage:# sfdisk [options] [...]# # 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 units to be used; 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 change only the partition with this # -n do not actually write to disk# -O save the sectors that will be overwritten to # -I restore sectors from # -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[= ] activate bootable flag# -U, --unhide[= ] 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 set the number of cylinders to use# -H, --heads set the number of heads to use# -S, --sectors set the number of sectors to use## sfdisk的-D参数指定与DOS兼容,并自动在每个分区前预留空间,以存放MBR(Master Boot Record);## , , , ## bootable 可以指定为[*|-]格式,默认值是"-"也就是没有可引导标记。# 这个标记仅对DOS有意义:DOS会给带有可引导标记的主分区分配 C: 盘符## id 应该以无"0x"前缀的格式给出其十六进制值,或者[E|S|L]简写字母:# L(83)是默认值;# S(82,LINUX_SWAP);# E(5,扩展分区)。# # 第一行分区描述,9,0x0C,* 自动分配起始柱面,数量为9,分区ID为0x0C(表示FAT32分区), 为*, 表示可启动分区。# 第二行分区描述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}1umount ${DRIVE}1mkfs.ext3 -L "rootfs" ${DRIVE}2umount ${DRIVE}2mkfs.ext3 -L "START_HERE" ${DRIVE}3