#!/bin/bash # Author: Guo Wenxue QQ: 281143292 # # This script will create a bootable SD card and install u-boot into it. # Formatting can be skipped if the SD card is already formatted properly. # SD card had better smaller than 16GB. # # It must be run with root permissions. Example: # $ sudo ./uboot-sdcard.sh # PWD=`pwd` PRJ_PATH=`dirname ${PWD}` IMG_PATH=${PRJ_PATH}/linux-bsp/images function check_root_run() { AMIROOT=`whoami | awk {'print $1'}` if [ "$AMIROOT" != "root" ] ; then echo "" echo " **** Error *** must run script with sudo" echo "" exit fi } # find the avaible SD cards function find_avaible_sdcard() { echo " " echo "Availible Drives to write images to: " echo " " ROOTDRIVE=`mount | grep 'on / ' | awk {'print $1'} | cut -c6-8` echo "# major minor size name " cat /proc/partitions | grep -v $ROOTDRIVE | grep '\' | grep -n '' echo " " ENTERCORRECTLY=0 while [ $ENTERCORRECTLY -ne 1 ] do read -p 'Enter Device Number: ' DRIVENUMBER echo " " DEVNAME=`cat /proc/partitions | grep -v 'sda' | grep '\' | grep -n '' | grep "${DRIVENUMBER}:" | awk '{print $5}'` DRIVE=/dev/$DEVNAME DEVSIZE=`cat /proc/partitions | grep -v 'sda' | grep '\' | grep -n '' | grep "${DRIVENUMBER}:" | awk '{print $4}'` if [ -n "$DEVNAME" ] ; then ENTERCORRECTLY=1 echo "$DEVNAME was selected" else echo "Invalid selection" fi echo "" done } function check_umount_sdcard() { echo "" echo "+-----------------------------------------+" echo "| Check and umount SD card $DEVNAME |" echo "+-----------------------------------------+" echo "" #unmount drives if they are mounted unmounted1=`df | grep '\<'$DEVNAME'1\>' | awk '{print $1}'` unmounted2=`df | grep '\<'$DEVNAME'2\>' | awk '{print $1}'` unmounted3=`df | grep '\<'$DEVNAME'3\>' | awk '{print $1}'` if [ -n "$unmounted1" ] ; then echo " unmounted ${DRIVE}1" sudo umount -f ${DRIVE}1 fi if [ -n "$unmounted2" ] ; then echo " unmounted ${DRIVE}2" sudo umount -f ${DRIVE}2 fi if [ -n "$unmounted3" ] ; then echo " unmounted ${DRIVE}3" sudo umount -f ${DRIVE}3 fi } function check_partition_sdcard() { echo "" echo "+-----------------------------------------+" echo "| Check SD cards partitions |" echo "+-----------------------------------------+" echo "" # check to see if the device is already partitioned SIZE1=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'1\>' | awk '{print $3}'` SIZE2=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'2\>' | awk '{print $3}'` SIZE3=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'3\>' | awk '{print $3}'` SIZE4=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'4\>' | awk '{print $3}'` echo " ${DEVNAME}1 ${DEVNAME}2 ${DEVNAME}3" echo $SIZE1 $SIZE2 $SIZE3 echo "" PARTITION="0" if [ -n "$SIZE1" -a -n "$SIZE2" ] ; then if [ "$SIZE1" -gt "72000" -a "$SIZE2" -gt "700000" ] ; then echo "Detected device has partitions already" PARTITION=1 fi else echo "WARN: SD Card is not correctly partitioned" fi } function format_sdcard() { check_partition_sdcard if [ $PARTITION -eq 1 ] ; then ENTERCORRECTLY=0 while [ $ENTERCORRECTLY -ne 1 ] do echo "" read -p 'Would you like to re-partition the drive anyways [y/n] : ' CASEPARTITION ENTERCORRECTLY=1 echo "" case $CASEPARTITION in "y") echo "Now partitioning $DEVICEDRIVENAME ...";PARTITION=0;; "n") echo "Skipping partitioning"; return ;; *) echo "Please enter y or n";ENTERCORRECTLY=0;; esac done fi echo "" echo "+-----------------------------------------+" echo "| Now making 2 partitions |" echo "+-----------------------------------------+" echo "" dd if=/dev/zero of=$DRIVE bs=1024 count=1024 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` # sfdisk的-D参数指定与DOS兼容,并自动在每个分区前预留空间,以存放MBR(Master Boot Record); # 第一行分区描述,40,0x0C,*, 自动分配起始柱面,数量为40,分区ID为0x0C(表示FAT32分区),< bootable >为*, 表示可启动分区。 # 第二行分区描述,41,,,-, 起始柱面为41,后面的所有空间分配到该分区。 sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF ,40,0x0C,* 41,,,- EOF echo "" echo "+-----------------------------------------+" echo "| Format boot partition as FAT |" echo "+-----------------------------------------+" echo "" mkfs.vfat -F 32 -n "boot" ${DRIVE}1 echo "" echo "+-----------------------------------------+" echo "| Format rootfs partition as ext3 |" echo "+-----------------------------------------+" echo "" mkfs.ext3 -L "rootfs" ${DRIVE}2 sync sync } function install_uboot() { echo "" echo "+-----------------------------------------+" echo "| Install bootloader into SD card |" echo "+-----------------------------------------+" echo "" ENTERCORRECTLY=0 while [ $ENTERCORRECTLY -ne 1 ] do read -p 'Would you like to continue install u-boot ? [y/n] : ' EXITQ echo "" echo " " ENTERCORRECTLY=1 case $EXITQ in "n") ;; "y") mkdir /media/{boot,rootfs} 2> /dev/null sudo mount ${DRIVE}1 /media/boot COPY=0 if [ -s ${IMG_PATH}/MLO ] ; then echo "cp -f ${IMG_PATH}/MLO /media/boot" cp -f ${IMG_PATH}/MLO /media/boot COPY=1 fi if [ -s ${IMG_PATH}/u-boot.img ] ; then echo "cp -f ${IMG_PATH}/u-boot.img /media/boot" cp -f ${IMG_PATH}/u-boot.img /media/boot COPY=2 fi if [ $COPY != 2 ] ; then echo "ERROR: MLO or u-boot.img copy failure" fi echo "ls /medial/boot" ls --color /media/boot echo "" echo "Install bootloader done" echo "" sudo umount /media/boot return;; *) echo "Please enter y or n"; ENTERCORRECTLY=0;; esac done } check_root_run find_avaible_sdcard check_umount_sdcard format_sdcard install_uboot