且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

OK335xS-Android mkmmc-android-ubifs.sh hacking

更新时间:2022-08-12 20:59:07

  1 #/*******************************************************************************
  2 # *            OK335xS-Android mkmmc-android-ubifs.sh hacking
  3 # * 声明:
  4 # *     通过分析该源代码,可以知道常说的自动烧写软件的工作原理
  5 # *     参考:sfidsk创建可启动分区问题--http://segmentfault.com/a/1190000002493628
  6 # *                                2015-6-4 晴 深圳 南山平山村 曾剑锋
  7 # ******************************************************************************/
  8 #!/bin/bash
  9 
 10 # 如果命令行参数等于1,则告知用户如何使用该软件,第一个参数为mmc设备节点
 11 EXPECTED_ARGS=1                        
 12 if [ $# == $EXPECTED_ARGS ]
 13 then
 14         echo "Assuming Default Locations for Prebuilt Images"
 15         $0 $1 Boot_Images/MLO Boot_Images/u-boot.img Boot_Images/uImage Boot_Images/uEnv.txt Filesystem/ubi.img Media_Clips START_HERE Boot_Images/boot.scr
 16         exit
 17 fi
 18 
 19 # 判断参数字符串是否为空,从这里我们可以知道参数长度为6
 20 if [[ -z $1 || -z $2 || -z $3 || -z $4 || -z $5 || -z $6 ]]
 21 then
 22     echo "mkmmc-android-ubifs.sh Usage:"
 23     echo "    sudo ./mkmmc-android-ubifs.sh <device> <MLO> <u-boot.img> <uImage> <uEnv.txt> <ubi.img> <Optional_Media_Clips_Folder> <Optional_Start_Here_Folder> "
 24     echo "    Example: sudo ./mkmmc-android-ubifs.sh /dev/sdc MLO u-boot.img uImage uEnv.txt ubi.img Media_Clips START_HERE"
 25     exit
 26 fi
 27 
 28 # 检查参数传入的文件是否存在
 29 if ! [[ -e $2 ]]
 30 then
 31     echo "Incorrect MLO location!"
 32     exit
 33 fi
 34 
 35 if ! [[ -e $3 ]]
 36 then
 37     echo "Incorrect u-boot.img location!"
 38     exit
 39 fi
 40 
 41 if ! [[ -e $4 ]]
 42 then
 43     echo "Incorrect uImage location!"
 44     exit
 45 fi
 46 
 47 if ! [[ -e $5 ]]
 48 then
 49     echo "Incorrect uEnv.txt location!"
 50     exit
 51 fi
 52 
 53 if ! [[ -e $6 ]]
 54 then
 55     echo "Incorrect ubifs location!"
 56     exit
 57 fi
 58 
 59 # 提醒用户,如果继续,mmc中数据将丢失
 60 echo "All data on "$1" now will be destroyed! Continue? [y/n]"
 61 read ans
 62 if ! [ $ans == 'y' ]
 63 then
 64     exit
 65 fi
 66 
 67 echo "[Unmounting all existing partitions on the device ]"
 68 
 69 umount $1*                                      # 卸载可能挂载的mmc设备节点
 70 
 71 echo "[Partitioning $1...]"                     # 提示开始对mmc设备重新分区
 72 
 73 # 开始擦除分区表,每次擦除1024字节,一共擦除1024次,也就是相当于擦除:
 74 #     1024字节 * 1024 次 = 1M 字节
 75 DRIVE=$1
 76 dd if=/dev/zero of=$DRIVE bs=1024 count=1024    
 77      
 78 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`   # 获取mmc的总大小
 79      
 80 echo DISK SIZE - $SIZE bytes                            # 显示mmc的总大小
 81  
 82 # mmc为1G所以CYLINDERS=1024*1024*1024/255/63/512=130,63为扇区数,255磁头数,
 83 # 其他的参数目前没搞懂,反正这里就是计算一共有多少个CYLINDER
 84 CYLINDERS=`echo $SIZE/255/63/512 | bc`                   
 85  
 86 echo CYLINDERS - $CYLINDERS                             # 显示柱面的多少
 87 
 88 # 这里分了4个区,目前没有完全理解这里的分区原理:
 89 #     1. 第一分区:
 90 #         1. 可用地址开始(不进行指定则为第一可用柱面);
 91 #         2. 占用40个柱面;
 92 #         3. 分区ID: 0x0C(FAT32(LBA)分区);
 93 #         4. *:从man文档感觉是代表可启动分区.
 94 #     2. 第二分区:
 95 #         1. 可用地址开始;
 96 #         2. 占用1个柱面;
 97 #         3. 分区ID: 0x0C(FAT32(LBA)分区);
 98 #         4. -:从man文档感觉是代表非启动分区.
 99 #     3. 第三分区:
100 #         1. 可用地址开始;
101 #         2. 占用($CYLINDERS / 4)个柱面;
102 #         3. 分区ID: 未指定(默认貌似是Linux);
103 #         4. -:同上
104 #     4. 第四分区:
105 #         1. 可用地址开始;
106 #         2. 剩余柱面(不进行指定则指全部柱面);
107 #         3. 分区ID: 未指定(默认貌似是Linux);
108 #         4. -:同上
109 {
110 echo ,40,0x0C,*
111 echo ,1,0x0C,-
112 echo ,$(expr $CYLINDERS / 4),,-
113 echo ,,,-
114 } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE
115 
116 echo "[Making filesystems...]"          # 提示开始制作文件系统
117 
118 if [[ ${DRIVE} == /dev/*mmcblk* ]]
119 then
120         DRIVE=${DRIVE}p                 # 获取设备节点模板
121 fi
122 
123 # 格式化各个分区
124 mkfs.vfat -F 32 -n boot ${DRIVE}1 &> /dev/null
125 mkfs.vfat -F 32 -n dummy ${DRIVE}2 &> /dev/null
126 mkfs.ext4 -L usrdata ${DRIVE}3 &> /dev/null
127 mkfs.vfat -F 32 -n data ${DRIVE}4 &> /dev/null
128 
129 echo "[Copying files...]"              
130 
131 # 将各个文件拷贝进入对应的分区,结果绝大部分拷入了boot分区 @__@
132 mount ${DRIVE}1 /mnt
133 echo "[Copying boot files...]"
134 cp $2 /mnt/MLO
135 cp $3 /mnt/u-boot.img
136 cp $4 /mnt/uImage
137 cp $5 /mnt/uEnv.txt
138 cp $9 /mnt/boot.scr
139 echo "[Copying ubifs image...]"
140 cp $6 /mnt/ubi.img
141 if [ "$8" ]
142 then
143         echo "[Copying start-here folder to boot partition...]"
144         cp -r $8 /mnt/START_HERE
145 fi
146 echo "[syncing...]"
147 sync                        # flush file system buffers
148 umount ${DRIVE}1
149 
150 if [ "$7" ]
151 then
152         echo "[Copying all media clips to data partition...]"
153         mount ${DRIVE}4 /mnt
154         cp -r $7/* /mnt/
155         umount ${DRIVE}4
156 fi
157 
158 echo "[Done]"