fwupdate: add root partition relocation support

This commit is contained in:
Calin Crisan 2019-02-01 23:14:03 +02:00
parent 4fbdb4071c
commit 821c062073

View File

@ -34,6 +34,8 @@ fi
#### configuration #### #### configuration ####
set -a
SYS_VERSION_FILE=/etc/version SYS_VERSION_FILE=/etc/version
SYS_BOARD_FILE=/etc/board SYS_BOARD_FILE=/etc/board
OS_CONF_FILE=/etc/init.d/os_conf 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) BOOT_DEV=$(mount | grep /boot | cut -d ' ' -f 1)
ROOT_DEV=${BOOT_DEV:0:-1}2 ROOT_DEV=${BOOT_DEV:0:-1}2
DATA_DEV=${BOOT_DEV:0:-1}3
DISK_DEV=$(mount | grep /boot | cut -d ' ' -f 1) DISK_DEV=$(mount | grep /boot | cut -d ' ' -f 1)
if [[ "${ROOT_DEV}" =~ ^([/a-z0-9]+)(p[0-9])$ ]]; then # e.g. /dev/mmcblk0p2 if [[ "${ROOT_DEV}" =~ ^([/a-z0-9]+)(p[0-9])$ ]]; then # e.g. /dev/mmcblk0p2
DISK_DEV=${BASH_REMATCH[1]} DISK_DEV=${BASH_REMATCH[1]}
@ -78,6 +81,8 @@ else
exit 1 exit 1
fi fi
set +a
#### versions #### #### versions ####
@ -250,19 +255,19 @@ function do_extract() {
# verify available partition space # 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_info=(${fw_boot_info})
fw_boot_size=${fw_boot_info[3]} 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_info=(${fw_root_info})
fw_root_size=${fw_root_info[3]} 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_info=(${disk_boot_info})
disk_boot_size=${disk_boot_info[3]} 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_info=(${disk_root_info})
disk_root_size=${disk_root_info[3]} disk_root_size=${disk_root_info[3]}
@ -318,12 +323,12 @@ function do_flash_boot() {
mv /sbin/reboot /sbin/reboot.bak mv /sbin/reboot /sbin/reboot.bak
ln -s /bin/true /sbin/reboot 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_info=(${boot_info})
boot_start=$((${boot_info[1]} / 2048)) # in MB boot_start=$((${boot_info[1]} / 2048)) # in MB
boot_size=$((${boot_info[3]} / 1048576)) # 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_info=(${root_info})
root_start=$((${root_info[1]} / 2048)) # in MB root_start=$((${root_info[1]} / 2048)) # in MB
root_size=$((${root_info[3]} / 1048576)) # in MB root_size=$((${root_info[3]} / 1048576)) # in MB
@ -372,7 +377,77 @@ function flash_cleanup() {
#### flash reboot #### #### 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 <<END
d
2
n
p
2
${new_root_info[1]}
${new_root_info[2]}
y
w
END
sync
}
function do_flash_reboot() { function do_flash_reboot() {
if [[ ! -f ${FW_DIR}/${ROOT_INFO_FILE} ]]; then
echo "extracted firmware not present"
return 1
fi
run_pre_upgrade || return 1
reallocate_root_part || return 1
echo "preparing for reboot..." echo "preparing for reboot..."
board=$(cat ${SYS_BOARD_FILE}) board=$(cat ${SYS_BOARD_FILE})