rom_flash 4.1 KB
Newer Older
S
songchenwen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#!/bin/bash

sScriptName="$(basename $0)"

if [ $(pidof ${sScriptName}| wc -w) -gt 2 ]; then
    pids=$(pidof ${sScriptName})
    echo "其他任务正在执行刷机 ${pids}"
    exit 1
fi

needed_binaries=(unzip gunzip pv losetup tar zstdmt zstdcat)

need_warn=""
for i in "${needed_binaries[@]}"; do
    w_b=$(which $i)
    if [ "$w_b" == "" ]; then
        need_warn="${need_warn} $i"
    fi
done
if ! [ "$need_warn" == "" ]; then
    echo "无法刷机, 需要这些可执行文件 $need_warn"
    exit 1
fi

workingdir=/root/r2sflasher/

rm -rf $workingdir
mkdir -p $workingdir

cd $workingdir

inputfile=$1
nobackup=$2
lomntpoint=/mnt/img
S
songchenwen 已提交
35
backupfile=$workingdir/backup.tar.gz
S
songchenwen 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

if [ "$inputfile" == "" ];then
   echo "需要传入 ROM zip 文件"
   exit 1
fi

if [ -f "$inputfile" ]; then
    echo "固件上传成功"
else
    echo "固件上传失败"
    cd /root
    rm -rf $workingdir
    exit 1
fi

inputfileext=${inputfile##*.}

gzfile=""

if [ "$inputfileext" == "gz" ]; then
    gzfile="$inputfile"
fi

if [ "$inputfileext" == "zip" ]; then
    gzfile=$(unzip -Z -1 "$inputfile" | grep "sd.img.gz$")
61
    imgfile=$(unzip -Z -1 "$inputfile" | grep ".img$")
S
songchenwen 已提交
62

63
    if [ "$gzfile" == "" ] && [ "$imgfile" == "" ]; then
S
songchenwen 已提交
64 65 66 67 68
        echo "没发现 sd.img.gz 结尾的固件包"
        cd /root
        rm -rf $workingdir
        exit 1
    fi
69 70 71 72 73 74 75 76 77 78
    
    if ! [ "$gzfile" == "" ]; then
        unzip "$inputfile" "$gzfile"
        imgfile=""
    else
        if ! [ "$imgfile" == "" ]; then
            unzip "$inputfile" "$imgfile"
        fi 
    fi
    
S
songchenwen 已提交
79 80
    rm $inputfile

81 82
    if [ -f "$gzfile" ] || [ -f "$imgfile" ]; then
        echo "zip 固件已解压至 ${gzfile}${imgfile}"
S
songchenwen 已提交
83 84 85 86 87 88 89 90
    else
        echo "zip 固件解压失败"
        cd /root
        rm -rf $workingdir
        exit 1
    fi
fi

91
if [ "$gzfile" == "" ] && [ "$imgfile" == "" ]; then
S
songchenwen 已提交
92 93 94 95 96 97 98
    echo "不是有效的 ROM 文件"
    cd /root
    rm $inputfile
    rm -rf $workingdir
    exit 1
fi

99 100 101
if ! [ "$gzfile" == "" ]; then
    echo "开始解压 gz 文件......"
    imgfile="rom.img"
S
songchenwen 已提交
102
    pv -f -F "%e %p" -i 1 "$gzfile" | gunzip -dc > "$imgfile"
103 104 105 106 107 108 109 110 111 112
    if [ -f "$imgfile" ]; then
        echo "gz 固件已解压至 $imgfile"
        rm $gzfile
    else
        echo "gz 固件解压失败"
        rm $gzfile
        cd /root
        rm -rf $workingdir
        exit 1
    fi
S
songchenwen 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
fi

lodev=$(losetup -f)
echo "使用设备 $lodev 测试 ROM 文件"

mkdir -p "$lomntpoint"
losetup -o 100663296 $lodev "$imgfile"
mount $lodev "$lomntpoint"
if [ $? -ne 0 ]; then
    echo "img 文件挂载失败"
    losetup -d $lodev
    cd /root
    rm -rf $workingdir
    exit 1
fi

cd "$lomntpoint"
imgbindir=$(ls | grep "bin")
if [ imgbindir == "" ]; then
    echo "img 文件错误"
    cd /root
    umount "$lomntpoint"
    losetup -d $lodev
    rm -rf $workingdir
    exit 1
fi

if [ "$2" == "nobackup" ]; then
    echo "不备份设置"
else 
    echo "开始备份设置"
    rm -f "$backupfile"
    sysupgrade -b "$backupfile"
    if ! [ -f "$backupfile" ]; then
        echo "生成备份文件失败"
        cd /root
        umount "$lomntpoint"
        losetup -d $lodev
        rm -rf $workingdir
        exit 1
    fi
    echo "开始写入备份到镜像文件"
    tar zxf "$backupfile"
    echo "备份文件已写入, 移除挂载"
    rm "$backupfile"
fi

cd /tmp
umount "$lomntpoint"
losetup -d $lodev

zstfile="/tmp/$imgfile.zst"
echo "开始压缩镜像至 $zstfile"
rm -f $zstfile
zstdmt "${workingdir}${imgfile}" -o "$zstfile"
rm -rf $workingdir

if [ -f "$zstfile" ]; then
    echo 1 > /proc/sys/kernel/sysrq
    echo "卸载 SD 卡"
    echo u > /proc/sysrq-trigger || umount /

    rotestfile="/rotest.txt"
    touch "$rotestfile"
    if [ $? -eq 0 ]; then
        rm "$rotestfile"
        echo "卸载 SD 卡失败, 请重启后再继续使用"
        exit 1
    fi

    echo "开始刷机, 请不要断电或关机, 如果刷机失败请取出 SD 卡用电脑重新写入 ROM"
S
songchenwen 已提交
184
    pv -f -F "刷机中, 请不要断电或关机 %e %p" -i 1 "$zstfile" | zstdcat | dd of=/dev/mmcblk0 conv=fsync
S
songchenwen 已提交
185 186
    echo "刷机完毕, 正在重启, 请稍候..."
    sleep 5
S
songchenwen 已提交
187 188 189 190 191
    echo o > /proc/sysrq-trigger
else
    echo "压缩出错"
    exit 1
fi