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 ####
|
||||
|
||||
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 <<END
|
||||
d
|
||||
2
|
||||
n
|
||||
p
|
||||
2
|
||||
${new_root_info[1]}
|
||||
${new_root_info[2]}
|
||||
y
|
||||
w
|
||||
END
|
||||
sync
|
||||
}
|
||||
|
||||
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..."
|
||||
|
||||
board=$(cat ${SYS_BOARD_FILE})
|
||||
|
Loading…
x
Reference in New Issue
Block a user