#!/bin/bash # 参考文章: # 1. Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数 # http://c.biancheng.net/cpp/view/2739.html # <CMD state="Updater" type="push" body="send" file="mksdcard-android.sh.tar">Sending partition shell</CMD> # <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD> # <CMD state="Updater" type="push" body="$ sh mksdcard-android.sh /dev/mmcblk0"> Partitioning...</CMD> # <CMD state="Updater" type="push" body="$ ls -l /dev/mmc* ">Formatting sd partition</CMD> # partition size in MB BOOTLOAD_RESERVE=8 # bootload 8MB BOOT_ROM_SIZE=8 # 启动rom 8MB SYSTEM_ROM_SIZE=512 # 系统rom 512MB CACHE_SIZE=512 # 缓存 512MB RECOVERY_ROM_SIZE=8 # 恢复rom 8MB VENDER_SIZE=8 # 供货商 8MB MISC_SIZE=8 # 杂项 8MB help() { # basename String [ Suffix ] # basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任何指定的 Suffix 参数, # 并将剩余的基本文件名称写至标准输出。 bn=`basename $0` cat << EOF usage $bn <option> device_node options: -h displays this help message -s only get partition size -np not partition. -f flash android image. EOF } # check the if root? # 检查当前是否拥有root权限 userid=`id -u` if [ $userid -ne "0" ]; then echo "you're not root?" exit fi # parse command line # 解析命令行参数 moreoptions=1 node="na" cal_only=0 flash_images=0 not_partition=0 not_format_fs=0 # $#: 传递给脚本或函数的参数个数。 # # $ sh mksdcard-android.sh /dev/mmcblk0 # $1: /dev/mmcblk0 # # moreoptions: 1 # node: /dev/mmcblk0 while [ "$moreoptions" = 1 -a $# -gt 0 ]; do case $1 in -h) help; exit ;; -s) cal_only=1 ;; -f) flash_images=1 ;; -np) not_partition=1 ;; -nf) not_format_fs=1 ;; *) moreoptions=0; node=$1 ;; esac [ "$moreoptions" = 0 ] && [ $# -gt 1 ] && help && exit [ "$moreoptions" = 1 ] && shift done # 如果node设备节点不存在,那么就退出程序 if [ ! -e ${node} ]; then help exit fi # call sfdisk to create partition table # 调用sfdisk来创建分区表 # get total card size # extend_size 增加了这个分量,同时data_size减小了这个分量,所以磁盘总量不变 seprate=40 # -s [or --show-size]: 显示一个分区的大小,单位是KB。 total_size=`sfdisk -s ${node}` total_size=`expr ${total_size} / 1024` # 重新计算,将单位换算成MB boot_rom_sizeb=`expr ${BOOT_ROM_SIZE} + ${BOOTLOAD_RESERVE}` extend_size=`expr ${SYSTEM_ROM_SIZE} + ${CACHE_SIZE} + ${VENDER_SIZE} + ${MISC_SIZE} + ${seprate}` data_size=`expr ${total_size} - ${boot_rom_sizeb} - ${RECOVERY_ROM_SIZE} - ${extend_size} + ${seprate}` # create partitions if [ "${cal_only}" -eq "1" ]; then cat << EOF BOOT : ${boot_rom_sizeb}MB RECOVERY: ${RECOVERY_ROM_SIZE}MB SYSTEM : ${SYSTEM_ROM_SIZE}MB CACHE : ${CACHE_SIZE}MB DATA : ${data_size}MB MISC : ${MISC_SIZE}MB EOF exit fi # destroy the partition table # 删除以前的分区表,从这里可以看出,分区表的大小貌似是1024字节 dd if=/dev/zero of=${node} bs=1024 count=1 sfdisk --force -uM ${node} << EOF ,${boot_rom_sizeb},83 ,${RECOVERY_ROM_SIZE},83 ,${extend_size},5 ,${data_size},83 ,${SYSTEM_ROM_SIZE},83 ,${CACHE_SIZE},83 ,${VENDER_SIZE},83 ,${MISC_SIZE},83 EOF # adjust the partition reserve for bootloader. # if you don't put the uboot on same device, you can remove the BOOTLOADER_ERSERVE # to have 8M space. # the minimal sylinder for some card is 4M, maybe some was 8M # just 8M for some big eMMC 's sylinder # -N# : 只改变分区的编号 # sfdisk --force -uM ${node} -N1 << EOF ${BOOTLOAD_RESERVE},${BOOT_ROM_SIZE},83 EOF # For MFGTool Notes: # MFGTool use mksdcard-android.tar store this script # if you want change it. # do following: # tar xf mksdcard-android.sh.tar # vi mksdcard-android.sh # [ edit want you want to change ] # rm mksdcard-android.sh.tar; tar cf mksdcard-android.sh.tar mksdcard-android.sh