mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-07-29 06:06:32 +00:00
fwupdate: add root partition relocation support
This commit is contained in:
parent
4fbdb4071c
commit
821c062073
@ -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})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user