[LEDE-DEV] [PATCH v3 3/5] ipq806x/nbg6817: add sysupgrade support
Felix Fietkau
nbd at nbd.name
Mon Oct 24 01:05:17 PDT 2016
On 2016-10-24 09:51, André Valentin wrote:
> Hi!
>
> Am 23.10.2016 um 16:44 schrieb Felix Fietkau:
>> On 2016-10-23 16:25, André Valentin wrote:
>>> Add new way of flashing to mmc devices based on rootfs split with loop devices.
>>>
>>> Signed-off-by: André Valentin <avalentin at marcant.net>
>>> ---
>>> .../ipq806x/base-files/lib/upgrade/platform.sh | 12 +++
>>> .../linux/ipq806x/base-files/lib/upgrade/zyxel.sh | 94 ++++++++++++++++++++++
>>> 2 files changed, 106 insertions(+)
>>> create mode 100644 target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
>>>
>>> diff --git a/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh b/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
>>> new file mode 100644
>>> index 0000000..d228dab
>>> --- /dev/null
>>> +++ b/target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh
>>> @@ -0,0 +1,94 @@
>>> +#
>>> +# Copyright (C) 2016 lede-project.org
>>> +#
>>> +
>>> +zyxel_get_rootfs() {
>>> + local rootfsdev
>>> +
>>> + if read cmdline < /proc/cmdline; then
>>> + case "$cmdline" in
>>> + *block2mtd=*)
>>> + rootfsdev="${cmdline##*block2mtd=}"
>>> + rootfsdev="${rootfsdev%%,*}"
>>> + ;;
>> You can drop the block2mtd part here.
>
> I'll remove it.
>>
>>> + *root=*)
>>> + rootfsdev="${cmdline##*root=}"
>>> + rootfsdev="${rootfsdev%% *}"
>>> + ;;
>>> + esac
>>> +
>>> + echo "${rootfsdev}"
>>> + fi
>>> +}
>>> +
>>> +zyxel_do_flash() {
>>> + local tar_file=$1
>>> + local board=$2
>>> + local kernel=$3
>>> + local rootfs=$4
>>> + local blocksize=65536
>>> +
>>> + # keep sure its unbound
>>> + losetup --detach-all || {
>>> + echo Failed to detach all loop devices. Skip this try.
>>> + reboot -f
>>> + }
>>> +
>>> + echo "flashing kernel to /dev/${kernel}"
>>> + tar xf $tar_file sysupgrade-$board/kernel -O >/dev/$kernel
>>> +
>>> + echo "flashing rootfs to ${rootfs}"
>>> + tar xf $tar_file sysupgrade-$board/root -O >"${rootfs}"
>>> +
>>> + local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
>>> + offset=$(( (($offset + $blocksize - 1) / $blocksize) * $blocksize ))
>>> +
>>> + # Sanity
>>> + [ $offset -lt $blocksize ] && {
>>> + echo Wrong size for rootfs: $offset
>>> + sleep 10
>>> + reboot -f
>>> + }
>>> +
>>> + # Mount loop for rootfs_data
>>> + losetup -o $offset /dev/loop0 "${rootfs}" || {
>>> + echo "Failed to mount looped rootfs_data."
>>> + sleep 10
>>> + reboot -f
>>> + }
>>> +
>>> + echo "Format new rootfs_data at position ${offset}."
>>> + mkfs.ext4 -F -L rootfs_data /dev/loop0
>>> + mkdir /tmp/new_root
>>> + mount -t ext4 /dev/loop0 /tmp/new_root && {
>>> + echo "Saving config to rootfs_data at position ${offset}."
>>> + cp -v /tmp/sysupgrade.tgz /tmp/new_root/
>>> + umount /tmp/new_root
>>> + }
>>> +
>>> + # Cleanup
>>> + losetup -d /dev/loop0 >/dev/null 2>&1
>> I think trying to guesstimate the offset for the ext4 part here, when
>> fstools already handles some of that is a bit fragile. Things like the
>> block size might be changed at some point, so I think it would be a good
>> idea to extend fstools to be able deal with this stuff.
>
> I think we need to store the blocksize in the sysupgrade/control. Because it could
> change between 2 firmwares. What dou you think. In this case an fstools patch is
> not needed.
You're right. I don't think we have a good place to store it though. I
still would prefer to unify the code in fstools anyway instead of
open-coding the same in the shell script.
- Felix
More information about the Lede-dev
mailing list