#!/bin/bash #====================================================================================== # Function: Update openwrt to emmc for Amlogic S9xxx STB # Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit # Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic #====================================================================================== # The script supports directly setting parameters for update, skipping interactive selection # openwrt-update-amlogic ${OPENWRT_FILE} ${AUTO_MAINLINE_UBOOT} ${RESTORE_CONFIG} # E.g: openwrt-update-amlogic openwrt_s905d.img.gz yes restore # E.g: openwrt-update-amlogic openwrt_s905d.img.gz no no-restore # You can also execute the script directly, and interactively select related functions # E.g: openwrt-update-amlogic # Receive one-key command related parameters IMG_NAME="${1}" AUTO_MAINLINE_UBOOT="${2}" BACKUP_RESTORE_CONFIG="${3}" # Current device model MYDEVICE_NAME=$(cat /proc/device-tree/model | tr -d '\000') if [[ -z "${MYDEVICE_NAME}" ]]; then echo "The device name is empty and cannot be recognized." exit 1 elif [[ ! -f "/etc/flippy-openwrt-release" ]]; then echo "The [ /etc/flippy-openwrt-release ] file is missing." exit 1 else echo -e "Current device: ${MYDEVICE_NAME} [ amlogic ]" sleep 3 fi # Find the partition where root is located ROOT_PTNAME=$(df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print $3}') if [ "${ROOT_PTNAME}" == "" ]; then echo "Cannot find the partition corresponding to the root file system!" exit 1 fi # Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats case ${ROOT_PTNAME} in mmcblk?p[1-4]) EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}') if lsblk -l -o NAME | grep "${EMMC_NAME}boot0" >/dev/null; then ROOT_DISK_TYPE="EMMC" else ROOT_DISK_TYPE="SD" fi PARTITION_NAME="p" LB_PRE="${ROOT_DISK_TYPE}_" ;; [hsv]d[a-z][1-4]) EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}') ROOT_DISK_TYPE="USB" PARTITION_NAME="" LB_PRE="${ROOT_DISK_TYPE}_" ;; *) echo "Unable to recognize the disk type of ${ROOT_PTNAME}!" exit 1 ;; esac DOCKER_ROOT="/mnt/${EMMC_NAME}${PARTITION_NAME}4/docker/" cd /mnt/${EMMC_NAME}${PARTITION_NAME}4/ mv -f /tmp/upload/* . 2>/dev/null && sync if [[ "${IMG_NAME}" == *.img ]]; then echo -e "Update using [ ${IMG_NAME} ] file. Please wait a moment ..." elif [ $(ls *.img -l 2>/dev/null | grep "^-" | wc -l) -ge 1 ]; then IMG_NAME=$(ls *.img | head -n 1) echo -e "Update using [ ${IMG_NAME} ] ] file. Please wait a moment ..." elif [ $(ls *.img.xz -l 2>/dev/null | grep "^-" | wc -l) -ge 1 ]; then xz_file=$(ls *.img.xz | head -n 1) echo -e "Update using [ ${xz_file} ] file. Please wait a moment ..." xz -d ${xz_file} 2>/dev/null IMG_NAME=$(ls *.img | head -n 1) elif [ $(ls *.img.gz -l 2>/dev/null | grep "^-" | wc -l) -ge 1 ]; then gz_file=$(ls *.img.gz | head -n 1) echo -e "Update using [ ${gz_file} ] file. Please wait a moment ..." gzip -df ${gz_file} 2>/dev/null IMG_NAME=$(ls *.img | head -n 1) elif [ $(ls *.7z -l 2>/dev/null | grep "^-" | wc -l) -ge 1 ]; then gz_file=$(ls *.7z | head -n 1) echo -e "Update using [ ${gz_file} ] file. Please wait a moment ..." bsdtar -xmf ${gz_file} 2>/dev/null [ $? -eq 0 ] || 7z x ${gz_file} -aoa -y 2>/dev/null IMG_NAME=$(ls *.img | head -n 1) elif [ $(ls *.zip -l 2>/dev/null | grep "^-" | wc -l) -ge 1 ]; then zip_file=$(ls *.zip | head -n 1) echo -e "Update using [ ${zip_file} ] file. Please wait a moment ..." unzip -o ${zip_file} 2>/dev/null IMG_NAME=$(ls *.img | head -n 1) else echo -e "Please upload or specify the update openwrt firmware file." echo -e "Upload method: system menu → Amlogic Service → Manually Upload Update" echo -e "Specify method: Place the openwrt firmware file in [ /mnt/${EMMC_NAME}${PARTITION_NAME}4/ ]" echo -e "The supported file suffixes are: *.img, *.img.xz, *.img.gz, *.7z, *.zip" echo -e "After upload the openwrt firmware file, run again." exit 1 fi sync # check file if [ ! -f "${IMG_NAME}" ]; then echo "No update file found." exit 1 else echo "Start update from [ ${IMG_NAME} ]" fi # Check the necessary dependencies DEPENDS="lsblk uuidgen grep awk btrfs mkfs.fat mkfs.btrfs md5sum fatlabel" echo "Check the necessary dependencies..." for dep in ${DEPENDS}; do WITCH=$(which ${dep}) if [ "${WITCH}" == "" ]; then echo "Dependent command: ${dep} does not exist, upgrade cannot be performed, only flash through U disk/TF card!" exit 1 else echo "${dep} path: ${WITCH}" fi done echo "Check passed" # find boot partition BOOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\/boot$/ {print $0}') if [ "${BOOT_PART_MSG}" == "" ]; then echo "Boot The partition does not exist, so the update cannot be continued!" exit 1 fi BOOT_NAME=$(echo ${BOOT_PART_MSG} | awk '{print $1}') BOOT_PATH=$(echo ${BOOT_PART_MSG} | awk '{print $2}') BOOT_UUID=$(echo ${BOOT_PART_MSG} | awk '{print $4}') BR_FLAG=1 echo -ne "Whether to backup and restore the current config files? y/n [y]\b\b" if [[ ${BACKUP_RESTORE_CONFIG} == "restore" ]]; then yn="y" elif [[ ${BACKUP_RESTORE_CONFIG} == "no-restore" ]]; then yn="n" else read yn fi case $yn in n* | N*) BR_FLAG=0 ;; esac # find root partition ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\/$/ {print $0}') ROOT_NAME=$(echo ${ROOT_PART_MSG} | awk '{print $1}') ROOT_PATH=$(echo ${ROOT_PART_MSG} | awk '{print $2}') ROOT_UUID=$(echo ${ROOT_PART_MSG} | awk '{print $4}') case $ROOT_NAME in ${EMMC_NAME}${PARTITION_NAME}2) NEW_ROOT_NAME="${EMMC_NAME}${PARTITION_NAME}3" NEW_ROOT_LABEL="${LB_PRE}ROOTFS2" ;; ${EMMC_NAME}${PARTITION_NAME}3) NEW_ROOT_NAME="${EMMC_NAME}${PARTITION_NAME}2" NEW_ROOT_LABEL="${LB_PRE}ROOTFS1" ;; *) echo "ROOTFS The partition location is incorrect, so the update cannot continue!" exit 1 ;; esac echo "NEW_ROOT_NAME: [ ${NEW_ROOT_NAME} ]" # find new root partition NEW_ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | grep "${NEW_ROOT_NAME}" | awk '$3 ~ /^part$/ && $5 !~ /^\/$/ && $5 !~ /^\/boot$/ {print $0}') if [ "${NEW_ROOT_PART_MSG}" == "" ]; then echo "The new ROOTFS partition does not exist, so the update cannot continue!" exit 1 fi NEW_ROOT_NAME=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $1}') NEW_ROOT_PATH=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $2}') NEW_ROOT_UUID=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $4}') NEW_ROOT_MP=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $5}') echo "NEW_ROOT_MP: [ ${NEW_ROOT_MP} ]" # backup old bootloader if [ ! -f /root/BackupOldBootloader.img ]; then echo "Backup bootloader -> [ BackupOldBootloader.img ] ... " dd if=/dev/${EMMC_NAME} of=/root/BackupOldBootloader.img bs=1M count=4 conv=fsync echo "Backup bootloader complete." echo fi # losetup losetup -f -P ${IMG_NAME} if [ ${?} -eq 0 ]; then LOOP_DEV=$(losetup | grep "${IMG_NAME}" | awk '{print $1}') if [ "${LOOP_DEV}" == "" ]; then echo "loop device not found!" exit 1 fi else echo "losetup [ ${IMG_FILE} ] failed!" exit 1 fi # fix loopdev issue in kernel 5.19 function fix_loopdev() { local parentdev=${1##*/} if [ ! -d /sys/block/${parentdev} ]; then return fi subdevs=$(lsblk -l -o NAME | grep -E "^${parentdev}.+\$") for subdev in ${subdevs}; do if [ ! -d /sys/block/${parentdev}/${subdev} ]; then return elif [ -b /dev/${sub_dev} ]; then continue fi source /sys/block/${parentdev}/${subdev}/uevent mknod /dev/${subdev} b ${MAJOR} ${MINOR} unset MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN PARTNAME done } fix_loopdev ${LOOP_DEV} WAIT=3 echo "The loopdev is [ $LOOP_DEV ], wait [ ${WAIT} ] seconds. " while [[ "${WAIT}" -ge "1" ]]; do sleep 1 WAIT=$((WAIT - 1)) done # umount loop devices (openwrt will auto mount some partition) MOUNTED_DEVS=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep "${LOOP_DEV}" | awk '$3 !~ /^$/ {print $2}') for dev in ${MOUNTED_DEVS}; do while :; do echo "umount [ ${dev} ] ... " umount -f ${dev} sleep 1 mnt=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep "${dev}" | awk '$3 !~ /^$/ {print $2}') if [ "${mnt}" == "" ]; then break else echo "Retry ..." fi done done # mount src part WORK_DIR=${PWD} P1=${WORK_DIR}/boot P2=${WORK_DIR}/root mkdir -p $P1 $P2 echo "Mount [ ${LOOP_DEV}p1 ] -> [ ${P1} ] ... " mount -t vfat -o ro ${LOOP_DEV}p1 ${P1} if [ $? -ne 0 ]; then echo "Mount p1 [ ${LOOP_DEV}p1 ] failed!" losetup -D exit 1 fi echo "Mount [ ${LOOP_DEV}p2 ] -> [ ${P2} ] ... " ZSTD_LEVEL=6 mount -t btrfs -o ro,compress=zstd:${ZSTD_LEVEL} ${LOOP_DEV}p2 ${P2} if [ $? -ne 0 ]; then echo "Mount p2 [ ${LOOP_DEV}p2 ] failed!" umount -f ${P1} losetup -D exit 1 fi # Prepare the dockerman config file if [ -f ${P2}/etc/init.d/dockerman ] && [ -f ${P2}/etc/config/dockerd ]; then flg=0 # get current docker data root data_root=$(uci get dockerd.globals.data_root 2>/dev/null) if [ "${data_root}" == "" ]; then flg=1 # get current config from /etc/docker/daemon.json if [ -f "/etc/docker/daemon.json" ] && [ -x "/usr/bin/jq" ]; then data_root=$(jq -r '."data-root"' /etc/docker/daemon.json) bip=$(jq -r '."bip"' /etc/docker/daemon.json) [ "${bip}" == "null" ] && bip="172.31.0.1/24" log_level=$(jq -r '."log-level"' /etc/docker/daemon.json) [ "${log_level}" == "null" ] && log_level="warn" _iptables=$(jq -r '."iptables"' /etc/docker/daemon.json) [ "${_iptables}" == "null" ] && _iptables="true" registry_mirrors=$(jq -r '."registry-mirrors"[]' /etc/docker/daemon.json 2>/dev/null) fi fi if [ "${data_root}" == "" ]; then data_root="/opt/docker/" # the default data root fi if ! uci get dockerd.globals >/dev/null 2>&1; then uci set dockerd.globals='globals' uci commit fi # delete alter config , use inner config if uci get dockerd.globals.alt_config_file >/dev/null 2>&1; then uci delete dockerd.globals.alt_config_file uci commit fi if [ ${flg} -eq 1 ]; then uci set dockerd.globals.data_root=${data_root} [ "${bip}" != "" ] && uci set dockerd.globals.bip=${bip} [ "${log_level}" != "" ] && uci set dockerd.globals.log_level=${log_level} [ "${_iptables}" != "" ] && uci set dockerd.globals.iptables=${_iptables} if [ "${registry_mirrors}" != "" ]; then for reg in ${registry_mirrors}; do uci add_list dockerd.globals.registry_mirrors=${reg} done fi uci set dockerd.globals.auto_start='1' uci commit fi fi #update version prompt source /boot/uEnv.txt 2>/dev/null CUR_FDTFILE=${FDT} echo -e "FDT Value [ ${CUR_FDTFILE} ]" cp /boot/uEnv.txt /tmp/uEnv.txt && sync K510="1" [[ "$(hexdump -n 15 -x "${P1}/zImage" 2>/dev/null | head -n 1 | awk '{print $7}')" == "0108" ]] && K510="0" echo -e "K510 [ ${K510} ]" # flippy-openwrt-release info UBOOT_OVERLOAD="" MAINLINE_UBOOT="" ANDROID_UBOOT="" env_openwrt_file="" if [ -f "${P2}/etc/flippy-openwrt-release" ]; then env_openwrt_file="${P2}/etc/flippy-openwrt-release" elif [ -f "/etc/flippy-openwrt-release" ]; then env_openwrt_file="/etc/flippy-openwrt-release" else env_openwrt_file="" fi if [ -n "${env_openwrt_file}" ]; then source "${env_openwrt_file}" 2>/dev/null # Update the parameters used UBOOT_OVERLOAD=${UBOOT_OVERLOAD} MAINLINE_UBOOT=${MAINLINE_UBOOT} ANDROID_UBOOT=${ANDROID_UBOOT} # Unused parameters FDTFILE=${FDTFILE} U_BOOT_EXT=${U_BOOT_EXT} KERNEL_VERSION=${KERNEL_VERSION} SOC=${SOC} fi #format NEW_ROOT echo "umount [ ${NEW_ROOT_MP} ]" umount -f "${NEW_ROOT_MP}" if [[ "${?}" -ne "0" ]]; then echo "Umount [ ${NEW_ROOT_MP} ] failed, Please restart and try again!" umount -f ${P1} umount -f ${P2} losetup -D exit 1 fi # check and fix partition function check_and_fix_partition() { local target_dev_name=${1} # mmcblk2 local target_pt_name=${2} # p2 local target_pt_idx=${3} # 2 local safe_pt_begin_mb=${4} # 800 local safe_pt_begin_byte=$((${safe_pt_begin_mb} * 1024 * 1024)) local cur_pt_begin_sector=$(fdisk -l /dev/${target_dev_name} | grep ${target_dev_name}${target_pt_name} | awk '{printf $2}') local cur_pt_begin_mb=$((${cur_pt_begin_sector} * 512 / 1024 / 1024)) if [ ${cur_pt_begin_mb} -ge ${safe_pt_begin_mb} ]; then # check pass return fi local cur_pt_end_sector=$(fdisk -l /dev/${target_dev_name} | grep ${target_dev_name}${target_pt_name} | awk '{printf $3}') local cur_pt_end_byte=$(((${cur_pt_end_sector} + 1) * 512 - 1)) echo "Unsafe partition found, repairing ... " parted /dev/${target_dev_name} rm ${target_pt_idx} || ( echo "rm partion ${target_pt_idx} failed" exit 1 ) parted /dev/${target_dev_name} mkpart primary btrfs "${safe_pt_begin_byte}b" "${cur_pt_end_byte}b" || ( echo "create new partion ${target_pt_idx} failed" exit 1 ) echo "Partition repaired" } # check if need fix partition if [ "${NEW_ROOT_NAME}" == "mmcblk2p2" ]; then if [ "${MYDEVICE_NAME}" == "Phicomm N1" ] || [ "${MYDEVICE_NAME}" == "Octopus Planet" ]; then # 最新研究结果: # Phicomm N1当采用官方 "天天链" 固件底包时, # 796MB开始的 12 字节在每次重启后会被 bootloader 覆写, # 因此把安全位置设定在800MB之后 # The latest research results: # When Phicomm N1 uses the official "tian tian lian" firmware bottom package, # the 12 bytes starting from 796MB will be overwritten by bootloader after each reboot, # so the safe location is set after 800MB SAFE_PT_BEGIN_MB=800 check_and_fix_partition "${EMMC_NAME}" "p2" 2 ${SAFE_PT_BEGIN_MB} fi fi echo "Format [ ${NEW_ROOT_PATH} ]" NEW_ROOT_UUID=$(uuidgen) mkfs.btrfs -f -U ${NEW_ROOT_UUID} -L ${NEW_ROOT_LABEL} -m single ${NEW_ROOT_PATH} if [ $? -ne 0 ]; then echo "Format [ ${NEW_ROOT_PATH} ] failed!" umount -f ${P1} umount -f ${P2} losetup -D exit 1 fi echo "Mount [ ${NEW_ROOT_PATH} ] -> [ ${NEW_ROOT_MP} ]" mount -t btrfs -o compress=zstd:${ZSTD_LEVEL} ${NEW_ROOT_PATH} ${NEW_ROOT_MP} if [ $? -ne 0 ]; then echo "Mount [ ${NEW_ROOT_PATH} ] -> [ ${NEW_ROOT_MP} ] failed!" umount -f ${P1} umount -f ${P2} losetup -D exit 1 fi # begin copy rootfs cd ${NEW_ROOT_MP} echo "Start copying data, From [ ${P2} ] TO [ ${NEW_ROOT_MP} ] ..." ENTRYS=$(ls) for entry in ${ENTRYS}; do if [[ "${entry}" == "lost+found" ]]; then continue fi echo "Remove old [ ${entry} ] ... " rm -rf ${entry} if [[ "${?}" -ne "0" ]]; then echo "failed." exit 1 fi done echo "Create folder ... " btrfs subvolume create etc mkdir -p .snapshots .reserved bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www ln -sf lib/ lib64 ln -sf tmp/ var sync COPY_SRC="root etc bin sbin lib opt usr www" echo "Copy data begin ... " for src in ${COPY_SRC}; do echo "Copy [ ${src} ] ... " (cd ${P2} && tar cf - ${src}) | tar xf - sync done # if not backup, then force rewrite the etc/docker/daemon.json if [ "${BR_FLAG}" -eq 0 ]; then cat >./etc/docker/daemon.json <./etc/fstab <./etc/config/fstab </dev/null; then if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then ln -sf ../init.d/shortcut-fe S99shortcut-fe fi fi ) # move /etc/config/balance_irq to /etc/balance_irq [ -f "./etc/config/balance_irq" ] && mv ./etc/config/balance_irq ./etc/ sync echo "Create initial etc snapshot -> .snapshots/etc-000" btrfs subvolume snapshot -r etc .snapshots/etc-000 sync [ -d /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker ] || mkdir -p /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker rm -rf opt/docker && ln -sf /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker/ opt/docker if [ -f /mnt/${NEW_ROOT_NAME}/etc/config/AdGuardHome ]; then [ -d /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/data ] || mkdir -p /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/data if [ ! -L /usr/bin/AdGuardHome ]; then [ -d /usr/bin/AdGuardHome ] && cp -a /usr/bin/AdGuardHome/* /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/ fi ln -sf /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome /mnt/${NEW_ROOT_NAME}/usr/bin/AdGuardHome fi #rm -f /mnt/${NEW_ROOT_NAME}/usr/sbin/openwrt-install-amlogic #rm -f /mnt/${NEW_ROOT_NAME}/usr/sbin/openwrt-update-amlogic rm -f /mnt/${NEW_ROOT_NAME}/root/install-to-emmc.sh sync echo "Copy data complete ..." BACKUP_LIST=$(${P2}/usr/sbin/openwrt-backup -p) if [[ "${BR_FLAG}" -eq "1" && -n "${BACKUP_LIST}" ]]; then echo -n "Start restoring configuration files ... " ( cd / eval tar czf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz "${BACKUP_LIST}" 2>/dev/null ) tar xzf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz [ -f ./etc/config/dockerman ] && sed -e "s/option wan_mode 'false'/option wan_mode 'true'/" -i ./etc/config/dockerman 2>/dev/null [ -f ./etc/config/dockerd ] && sed -e "s/option wan_mode '0'/option wan_mode '1'/" -i ./etc/config/dockerd 2>/dev/null [ -f ./etc/config/verysync ] && sed -e 's/config setting/config verysync/' -i ./etc/config/verysync 2>/dev/null # Restore fstab cp -f .snapshots/etc-000/fstab ./etc/fstab cp -f .snapshots/etc-000/config/fstab ./etc/config/fstab # 还原 luci cp -f .snapshots/etc-000/config/luci ./etc/config/luci # 还原/etc/config/rpcd cp -f .snapshots/etc-000/config/rpcd ./etc/config/rpcd sync echo "Restore configuration information complete." fi echo "Modify the configuration file ... " rm -f "./etc/rc.local.orig" "./etc/first_run.sh" "./etc/part_size" rm -rf "./opt/docker" && ln -sf "/mnt/${EMMC_NAME}${PARTITION_NAME}4/docker" "./opt/docker" rm -f ./etc/bench.log cat >>./etc/crontabs/root </dev/null; then echo "sshd:x:22:sshd" >>./etc/group fi if ! grep "sshd:x:22:22:sshd:" ./etc/passwd >/dev/null; then echo "sshd:x:22:22:sshd:/var/run/sshd:/bin/false" >>./etc/passwd fi if ! grep "sshd:x:" ./etc/shadow >/dev/null; then echo "sshd:x:${ddd}:0:99999:7:::" >>./etc/shadow fi if [ "${BR_FLAG}" -eq "1" ]; then if [ -x ./bin/bash ] && [ -f ./etc/profile.d/30-sysinfo.sh ]; then sed -e 's/\/bin\/ash/\/bin\/bash/' -i ./etc/passwd fi sync fi sed -e "s/option hw_flow '1'/option hw_flow '0'/" -i ./etc/config/turboacc ( cd etc/rc.d rm -f S??shortcut-fe if grep "sfe_flow '1'" ../config/turboacc >/dev/null; then if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then ln -sf ../init.d/shortcut-fe S99shortcut-fe fi fi ) eval tar czf .reserved/openwrt_config.tar.gz "${BACKUP_LIST}" 2>/dev/null rm -f ./etc/part_size ./etc/first_run.sh if [ -x ./usr/sbin/balethirq.pl ]; then if grep "balethirq.pl" "./etc/rc.local"; then echo "balance irq is enabled" else echo "enable balance irq" sed -e "/exit/i\/usr/sbin/balethirq.pl" -i ./etc/rc.local fi fi mv ./etc/rc.local ./etc/rc.local.orig cat >"./etc/rc.local" </dev/null 2>&1;then /etc/init.d/dockerd enable /etc/init.d/dockerd start fi if ! ls /etc/rc.d/S??dockerman >/dev/null 2>&1 && [ -f /etc/init.d/dockerman ];then /etc/init.d/dockerman enable /etc/init.d/dockerman start fi mv /etc/rc.local.orig /etc/rc.local chmod 755 /etc/rc.local exec /etc/rc.local exit EOF chmod 755 ./etc/rc.local* #Mainline U-BOOT detection FLASH_MAINLINE_UBOOT=0 if [[ -n "${MAINLINE_UBOOT}" && -f "${P2}${MAINLINE_UBOOT}" ]]; then cat < .snapshots/etc-001" btrfs subvolume snapshot -r etc .snapshots/etc-001 cd ${WORK_DIR} #echo -n "umount /boot ... " #umount -f /boot #if [ $? -ne 0 ];then # echo "failed! " # umount ${P1} # umount ${P2} # losetup -D # exit 1 #else # echo "ok" #fi # #echo "reformat ${BOOT_PATH} ..." #if mkfs.fat -n "${LB_PRE}BOOT" -F 32 ${BOOT_PATH} 2>/dev/null;then # echo -n "mount /boot ..." # mount -t vfat -o "errors=remount-ro" ${BOOT_PATH} /boot # if [ $? -eq 0 ];then # echo "ok" # else # echo "mount failed! The system has been destroyed and must be refreshed!" # exit 1 # fi #else # echo "format failed! The system has been destroyed and must be refreshed!" # exit 1 #fi echo "Change the label of ${BOOT_PATH} ... " fatlabel ${BOOT_PATH} "${LB_PRE}BOOT" echo "Start copying data, from [ ${P1} ] to [ /boot ] ..." cd /boot echo "Delete the old boot file ..." rm -rf * && sync echo "Copy the new boot file ... " (cd ${P1} && tar cf - .) | tar xf - 2>/dev/null sync if [ -f ${P1}/uInitrd ]; then i=1 max_try=10 while [ "${i}" -le "${max_try}" ]; do uInitrd_original=$(md5sum ${P1}/uInitrd | awk '{print $1}') uInitrd_new=$(md5sum uInitrd | awk '{print $1}') if [ "${uInitrd_original}" = "${uInitrd_new}" ]; then break else rm -f uInitrd && sync cp -f ${P1}/uInitrd uInitrd 2>/dev/null && sync let i++ continue fi done [ "${i}" -eq "10" ] && echo "uInitrd file copy failed." && exit 1 else echo "uInitrd file is missing." fi if [ -f ${P1}/zImage ]; then i=1 max_try=10 while [ "${i}" -le "${max_try}" ]; do zImage_original=$(md5sum ${P1}/zImage | awk '{print $1}') zImage_new=$(md5sum zImage | awk '{print $1}') if [ "${zImage_original}" = "${zImage_new}" ]; then break else rm -f zImage && sync cp -f ${P1}/zImage zImage 2>/dev/null && sync let i++ continue fi done [ "${i}" -eq "10" ] && echo "zImage file copy failed." && exit 1 else echo "zImage file is missing." exit 1 fi if [ ${ROOT_DISK_TYPE} == "EMMC" ]; then rm -f s905_autoscript* aml_autoscript* mv -f boot-emmc.ini boot.ini mv -f boot-emmc.cmd boot.cmd mv -f boot-emmc.scr boot.scr fi if [ "${K510}" -eq "1" ]; then if [ -f "u-boot.ext" ]; then cp -vf u-boot.ext u-boot.emmc elif [ -f ${P1}/${UBOOT_OVERLOAD} ]; then cp -vf ${P1}/${UBOOT_OVERLOAD} ${UBOOT_OVERLOAD} cp -vf ${P1}/${UBOOT_OVERLOAD} u-boot.ext cp -vf ${P1}/${UBOOT_OVERLOAD} u-boot.emmc chmod +x u-boot* fi else rm -f u-boot.ext 2>/dev/null rm -f u-boot.emmc 2>/dev/null fi sync echo "Update boot parameters ... " if [ -f /tmp/uEnv.txt ]; then lines=$(wc -l uEnv.txt cat >>uEnv.txt <uEnv.txt </dev/null losetup -D 2>/dev/null rm -rf ${P1} ${P2} 2>/dev/null rm -f ${IMG_NAME} 2>/dev/null rm -f sha256sums 2>/dev/null sync wait echo "Successfully updated, automatic restarting..." sleep 3 reboot exit 0