#!/bin/sh # 增量更新 /data 分区 # swupdate 已将 data_update.tar.gz 写到 /tmp/data_update.tar.gz # 只在 postinst 阶段执行(此时 rawfile 已经复制完成) if [ "$1" = "preinst" ]; then echo "[update_data] preinst: skip" exit 0 fi TAR="/tmp/data_update.tar.gz" SRC="/tmp/data_update_src" DST="/mnt/data_update" if [ ! -f "$TAR" ]; then echo "[update_data] ERROR: $TAR not found" exit 1 fi # 挂载 data 分区到临时挂载点 mkdir -p "$DST" if ! mount -t ubifs ubi2:data "$DST"; then echo "[update_data] ERROR: failed to mount ubi2:data" exit 1 fi echo "[update_data] mounted ubi2:data on $DST" # 解压到临时目录 mkdir -p "$SRC" tar -xzf "$TAR" -C "$SRC" # 遍历升级包中的所有文件,只覆盖不一样的 find "$SRC" -type f | while read src_file; do rel_path="${src_file#$SRC/}" dst_file="$DST/$rel_path" # 目标目录不存在则创建 dst_dir=$(dirname "$dst_file") [ -d "$dst_dir" ] || mkdir -p "$dst_dir" if [ -f "$dst_file" ]; then src_md5=$(md5sum "$src_file" | cut -d' ' -f1) dst_md5=$(md5sum "$dst_file" | cut -d' ' -f1) if [ "$src_md5" = "$dst_md5" ]; then echo "[update_data] unchanged: $rel_path" continue fi fi cp "$src_file" "$dst_file" echo "[update_data] updated: $rel_path" done # 清理临时文件 rm -rf "$SRC" "$TAR" # 卸载 data 分区 sync umount "$DST" echo "[update_data] unmounted $DST" echo "[update_data] done" exit 0