From 821c0620738888d480819de064d908e5d71a1d23 Mon Sep 17 00:00:00 2001 From: Calin Crisan Date: Fri, 1 Feb 2019 23:14:03 +0200 Subject: [PATCH] fwupdate: add root partition relocation support --- board/common/overlay/sbin/fwupdate | 87 +++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/board/common/overlay/sbin/fwupdate b/board/common/overlay/sbin/fwupdate index 2bdc879257..e249ff33e0 100755 --- a/board/common/overlay/sbin/fwupdate +++ b/board/common/overlay/sbin/fwupdate @@ -34,6 +34,8 @@ fi #### configuration #### +set -a + SYS_VERSION_FILE=/etc/version SYS_BOARD_FILE=/etc/board OS_CONF_FILE=/etc/init.d/os_conf @@ -68,6 +70,7 @@ source ${SYS_VERSION_FILE} BOOT_DEV=$(mount | grep /boot | cut -d ' ' -f 1) ROOT_DEV=${BOOT_DEV:0:-1}2 +DATA_DEV=${BOOT_DEV:0:-1}3 DISK_DEV=$(mount | grep /boot | cut -d ' ' -f 1) if [[ "${ROOT_DEV}" =~ ^([/a-z0-9]+)(p[0-9])$ ]]; then # e.g. /dev/mmcblk0p2 DISK_DEV=${BASH_REMATCH[1]} @@ -78,6 +81,8 @@ else exit 1 fi +set +a + #### versions #### @@ -250,19 +255,19 @@ function do_extract() { # verify available partition space - fw_boot_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") + fw_boot_info=$(fdisk -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 --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") + fw_root_info=$(fdisk -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 --bytes -l -o device,start,end,size ${DISK_DEV} | grep ${BOOT_DEV}) + disk_boot_info=$(fdisk -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 --bytes -l -o device,start,end,size ${DISK_DEV} | grep ${ROOT_DEV}) + disk_root_info=$(fdisk -l -o device,start,end,size ${DISK_DEV} | grep ${ROOT_DEV}) disk_root_info=(${disk_root_info}) disk_root_size=${disk_root_info[3]} @@ -318,12 +323,12 @@ function do_flash_boot() { mv /sbin/reboot /sbin/reboot.bak ln -s /bin/true /sbin/reboot - boot_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") + boot_info=$(fdisk -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}1") boot_info=(${boot_info}) boot_start=$((${boot_info[1]} / 2048)) # in MB boot_size=$((${boot_info[3]} / 1048576)) # in MB - root_info=$(fdisk --bytes -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") + root_info=$(fdisk -l -o device,start,end,size ${FW_DIR}/${FW_FILE_EXTR} | grep "${FW_FILE_EXTR}2") root_info=(${root_info}) root_start=$((${root_info[1]} / 2048)) # in MB root_size=$((${root_info[3]} / 1048576)) # in MB @@ -372,7 +377,77 @@ function flash_cleanup() { #### flash reboot #### +function run_pre_upgrade() { + root_start=$(cat ${FW_DIR}/${ROOT_INFO_FILE} | cut -d ' ' -f 1) + tmp_mnt="/tmp/fwupdate_root" + loop="/dev/loop4" + pre_upgrade="${tmp_mnt}/usr/share/pre-upgrade/*" + + mkdir -p ${tmp_mnt} + losetup -o $((root_start * 1024 * 1024)) ${loop} ${FW_DIR}/${FW_FILE_EXTR} + mount ${loop} ${tmp_mnt} + if [[ -d ${pre_upgrade} ]]; then + for script in ${pre_upgrade}/*.sh; do + echo "running pre-upgrade script $(basename ${script})" + if [[ -x ${script} ]] && ! ${script}; then + # non-zero exit status of pre-upgrade script indicates that + # the upgrade process must not be continued + + echo "aborted by pre-upgrade script" + return 1 + fi + done + fi + + umount ${tmp_mnt} + losetup -d ${loop} +} + +function reallocate_root_part() { + root_info=$(fdisk -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=(${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=(${fw_root_info}) + + if [[ ${root_info[1]} == ${fw_root_info[1]} ]] && + [[ ${root_info[2]} == ${fw_root_info[2]} ]]; then + + return # all good + fi + + # 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 <