diff --git a/board/common/overlay/sbin/fwupdate b/board/common/overlay/sbin/fwupdate index e249ff33e0..6ef83e5778 100755 --- a/board/common/overlay/sbin/fwupdate +++ b/board/common/overlay/sbin/fwupdate @@ -35,6 +35,7 @@ fi #### configuration #### set -a +set -e SYS_VERSION_FILE=/etc/version SYS_BOARD_FILE=/etc/board @@ -81,8 +82,6 @@ else exit 1 fi -set +a - #### versions #### @@ -255,19 +254,19 @@ function do_extract() { # verify available partition space - fw_boot_info=$(fdisk -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") + fw_boot_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") fw_boot_info=(${fw_boot_info}) fw_boot_size=${fw_boot_info[3]} - fw_root_info=$(fdisk -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") + fw_root_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") fw_root_info=(${fw_root_info}) fw_root_size=${fw_root_info[3]} - disk_boot_info=$(fdisk -l -o device,start,end,size ${DISK_DEV} | grep ${BOOT_DEV}) + disk_boot_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep ${BOOT_DEV}) disk_boot_info=(${disk_boot_info}) disk_boot_size=${disk_boot_info[3]} - disk_root_info=$(fdisk -l -o device,start,end,size ${DISK_DEV} | grep ${ROOT_DEV}) + disk_root_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep ${ROOT_DEV}) disk_root_info=(${disk_root_info}) disk_root_size=${disk_root_info[3]} @@ -307,33 +306,72 @@ function extract_status() { #### flash boot #### +function reallocate_boot_part() { + boot_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep "${BOOT_DEV}") + boot_info=(${boot_info}) + + root_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep "${ROOT_DEV}") + root_info=(${root_info}) + + fw_boot_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") + fw_boot_info=(${fw_boot_info}) + + if [[ ${boot_info[1]} == ${fw_boot_info[1]} ]] && + [[ ${boot_info[2]} == ${fw_boot_info[2]} ]]; then + + return # all good + fi + + echo "reallocating boot partition..." + + # check overlapping with root partition + if [[ ${fw_boot_info[2]} -ge ${root_info[1]} ]]; then + echo "cannot reallocate boot partition: will overlap with root" + return 1 + fi + + fdisk -w auto ${DISK_DEV} >/dev/null < ${FW_DIR}/${ROOT_INFO_FILE} + + reallocate_boot_part dd if=${FW_DIR}/${FW_FILE_EXTR} skip=${boot_start} of=${BOOT_DEV} bs=1048576 count=${boot_size} &>${FW_DIR}/${DD_LOG_FILE} & pid=$! @@ -404,13 +442,13 @@ function run_pre_upgrade() { } function reallocate_root_part() { - root_info=$(fdisk -l -o device,start,end,size ${DISK_DEV} | grep "${ROOT_DEV}") + root_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep "${ROOT_DEV}") root_info=(${root_info}) - data_info=$(fdisk -l -o device,start,end,size ${DISK_DEV} | grep "${DATA_DEV}") + data_info=$(fdisk --bytes -l -o device,start,end,size ${DISK_DEV} | grep "${DATA_DEV}") data_info=(${data_info}) - fw_root_info=$(fdisk -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") + fw_root_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") fw_root_info=(${fw_root_info}) if [[ ${root_info[1]} == ${fw_root_info[1]} ]] && @@ -419,21 +457,22 @@ function reallocate_root_part() { return # all good fi + echo "reallocating root partition..." + # check overlapping with data partition if [[ ${fw_root_info[2]} -ge ${data_info[1]} ]]; then echo "cannot reallocate root partition: will overlap with data" return 1 fi - fdisk ${DISK_DEV} >/dev/null </dev/null <