mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 10:08:59 +00:00
13c9f1f37d
1. Create "rootfs_data" dynamicaly
U-Boot firmware images can contain only 2 UBI volumes: bootfs (container
with U-Boot + kernel + DTBs) and rootfs (e.g. squashfs). There is no way
to include "rootfs_data" UBI volume or make firmware file tell U-Boot to
create one.
For that reason "rootfs_data" needs to be created dynamically. Use
preinit script to handle that. Fire it right before "mount_root" one.
2. Relate "rootfs_data" to flashed firmware
As already explained flashing new firmware with U-Boot will do nothing
to the "rootfs_data". It could result in new firmware reusing old
"rootfs_data" overlay UBI volume and its file. Users expect a clean
state after flashing firmware (even if flashing the same one).
Solve that by reading flash counter of running firmware and storing it
in "rootfs_data" UBI volume. Every mismatch will result in wiping old
data.
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
(cherry picked from commit 93259e8ca2
)
74 lines
1.9 KiB
Bash
74 lines
1.9 KiB
Bash
# SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause
|
|
|
|
FS_STATE_READY=2
|
|
|
|
# $(1): file to read from
|
|
# $(2): offset in bytes
|
|
get_hex_u32_le() {
|
|
dd if="$1" skip=$2 bs=1 count=4 2>/dev/null | hexdump -v -e '1/4 "%02x"'
|
|
}
|
|
|
|
# Setup /tmp/env.config to provide "metadata" UBI volume access
|
|
#
|
|
# It can be used with "fw_printenv -c /tmp/env.config"
|
|
bcm4908_pkgtb_setup_env_config() {
|
|
local size=$((0x$(get_hex_u32_le /dev/ubi0_1 4)))
|
|
|
|
dd if=/dev/ubi0_1 of=/tmp/env.head count=8 iflag=count_bytes
|
|
dd if=/dev/ubi0_1 of=/tmp/env.body skip=8 iflag=skip_bytes
|
|
printf "%s\t0x%x\t0x%x\t0x%x" "/tmp/env.body" 0x0 $size $size > /tmp/env.config
|
|
}
|
|
|
|
bcm4908_committed_image_seq() {
|
|
bcm4908_pkgtb_setup_env_config
|
|
|
|
commited="$(fw_printenv -n -c /tmp/env.config COMMITTED)"
|
|
[ -n "$commited" ] && {
|
|
seq=$(fw_printenv -n -c /tmp/env.config SEQ | cut -d ',' -f $commited)
|
|
[ -n "$seq" ] && {
|
|
echo $seq
|
|
return
|
|
}
|
|
}
|
|
|
|
echo "Failed to read COMMITED and SEQ from metadata1" >&2
|
|
}
|
|
|
|
# Make sure "rootfs_data" UBI volume matches currently flashed image
|
|
#
|
|
# On mismatch "rootfs_data" will be wiped and assigned
|
|
#
|
|
# $1: UBI volume of "rootfs_data" (e.g. ubi0_123)
|
|
bcm4908_verify_rootfs_data() {
|
|
local ubivol="$1"
|
|
local dir=/tmp/rootfs_data
|
|
local seq="$(bcm4908_committed_image_seq)"
|
|
|
|
[ -z "$seq" ] && return
|
|
|
|
mkdir $dir
|
|
if ! mount -t ubifs /dev/$ubivol $dir; then
|
|
echo "Failed to mount $ubivol UBI volume" >&2
|
|
rmdir $dir
|
|
return
|
|
fi
|
|
|
|
# Wipe rootfs_data if it doesn't belong to us
|
|
[ "$(readlink $dir/.openwrt-image-seq)" != "$seq" ] && {
|
|
echo "Removing \"rootfs_data\" content"
|
|
rm -rf $dir/..?* $dir/.[!.]* $dir/*
|
|
}
|
|
|
|
# If rootfs_data is clean (or was just wiped) claim it
|
|
[ -z "$(ls -A $dir)" ] && {
|
|
echo "Assigning \"rootfs_data\" to the current firmware"
|
|
# Claim this "rootfs_data"
|
|
ln -s $seq $dir/.openwrt-image-seq
|
|
# Mark it ready to avoid "mount_root" wiping it again
|
|
ln -s $FS_STATE_READY $dir/.fs_state
|
|
}
|
|
|
|
umount $dir
|
|
rmdir $dir
|
|
}
|