Hola peperfus. Tienes razón, hay que tener en cuenta que la partición linux incluye rootfs_data la cual puede impedir el sysupgrade, y desde luego con un firmware original o CFE directamente rechazaría la imagen.
La estructura del firmware Openwrt para Broadcom es fácil de entender. Primero hay un header de tamaño 0x100 bytes, luego está el kernel y a continuación rootfs.
rootfs empalma con rootfs_data a partir de una marca para alinear el sistema jffs2. la cual es en hexadecimal
DEADCODE
De forma habilidosa lo que hace el sistema de creación de firmwares de Openwrt es rellenar con ceros todo lo que hay después de rootfs hasta alinear el firmware con el tamaño de bloque, y colocar esa marca a continuación. Así que esa marca es el final del firmware. Esa marca es la que indica donde empezar a generar el jffs2 la primera vez que se inicia Openwrt, por tanto se borrará.
Entonces lo que debemos hacer es cortar cortar todo lo que sobra a la partición linux para obtener solo lo que es firmware flasheable y colocar al final del mismo esa marca manualmente con editor hexadecimal. Aunque por supuesto podría automatizarse con comandos.
Para hacer el corte y colocar la marca tenemos que sacar la calculadora, si sabemo previamente el tamño de las particiones cuando Openwrt saca esa información en el dmesg al arrancar.
O bien usar el propio header del firmware, ahí está toda la información del tamaño. Para analizar el header en la wiki hay una pequeña utilidad.
https://openwrt.org/docs/techref/brcm63xx.imagetagCompilamos la utilidad analyzetag mediante gcc
gcc analyzetag.c -o brcmanalyze
por ejemplo ejecutando sobre un firmware openwrt nos suelta esto
./brcmanalyze -t bc310 -i openwrt-brcm63xx-generic-squashfs-cfe.bin
Broadcom image analyzer - v0.1.0
Copyright (C) 2009 Daniel Dickinson
Tag Version: 6
Signature 1: Broadcom Corporatio
Signature 2: ver. 2.0
Chip ID: 63268
Board ID: 963167REF3
Bigendian: true
Image size: 0038ff04, 3735300
CFE Address: 00000000, 0
CFE Length: 00000000, 0
Flash Root Address: bfc10100, 3217096960
Flash Root Length: 001e15ac, 1971628
Flash Kernel Address: bfc10100, 3217096960
Flash Kernel Length: 001ae958, 1763672
Vendor information:
Image CRC: 5a0bbdc5 [Computed Value: 5a0bbdc5]
Rootfs CRC: [Computed Value: 78117b80]
Image CRC from sections: 5a0bbdc5 [Computed Value: 68d41778]
Header CRC: 2a5bc89c [Computed Value: 2a5bc89c]
Kernel CRC: 2188206c [Computed Value: 2188206c]
Rootfs CRC: 807b1178 [Computed Value: 807b1178]
La información que nos interesa
Image size: 0038ff04, 3735300
a 0x0038ff04 le sumamos el propio tamaño del header, que como comenté son 0x100, y nos da el tamaño total. Ese es el tamaño que debemos cortar, y el último paso es colocar la marca DEADCODE en los últimos cuatro bytes,
Quedaría algo así al final del firmware
003F:FFC0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003F:FFD0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003F:FFE0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003F:FFF0 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040:0000 | DE AD C0 DE
Hay que fijarse que la marca queda alineada para saber que lo estamos haciendo bien.
Otra opción interesante sería hacer un backup de la partición
linux, y modificar el header para que incluya nuestro
rootfs_data modificado. Esto lo dejo como deberes para casa