Comtrend STB-7007 backup memoria flash (V)

Llegados a este punto, con información sobre el hardware y el software. Seria importante realizar un backup de la memoria flash por lo que pueda pasar, sobretodo si vamos a tocar cosas y encontrar el problema que luego no arranca el sistema.

Para realizar la copia, utilizaremos el comando dd y conectaremos un pendrive en el USB.

Con el comando cat /proc/mtd nos informa que el sistema tiene un total de 18 particiones.

[root@stb:/] # cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 00080000 00010000 "CFE"
mtd1: 00020000 00010000 "CFE config"
mtd2: 00320000 00010000 "reserved"
mtd3: 00020000 00010000 "secure storage"
mtd4: 0001f800 00010000 "MAC address"
mtd5: 00000800 00010000 "hdcp"
mtd6: 00800000 00020000 "Kernel"
mtd7: 00c00000 00020000 "/usr"
mtd8: 01000000 00020000 "/usr/local"
mtd9: 02000000 00020000 "/usr/lib/MediaBrowser"
mtd10: 02000000 00020000 "/usr/lib/MediaServer"
mtd11: 00800000 00020000 "Kernel (alt)"
mtd12: 00c00000 00020000 "/usr (alt)"
mtd13: 01000000 00020000 "/usr/local (alt)"
mtd14: 02000000 00020000 "/usr/lib/MediaBrowser (alt)"
mtd15: 02000000 00020000 "/usr/lib/MediaServer (alt)"
mtd16: 00400000 00020000 "Splash"
mtd17: 32e00000 00020000 "/rw/yaffs"
[root@stb:/] #

Durante el proceso de arranque se crean 6 particiones (mtd0 a mtd5) que corresponden con la memoria NOR Flash Spansion S29GL032A.

Creating 6 MTD partitions on "Broadcom 9xxxx mapped flash":
0x0000000000000000-0x0000000000080000 : "CFE"
0x0000000000080000-0x00000000000a0000 : "CFE config"
0x00000000000a0000-0x00000000003c0000 : "reserved"
0x00000000003c0000-0x00000000003e0000 : "secure storage"
0x00000000003e0000-0x00000000003ff800 : "MAC address"
mtd: partition "MAC address" doesn't end on an erase block -- force read-only
0x00000000003ff800-0x0000000000400000 : "hdcp

Mapa de particiones NOR Flash

 * +----------------------------------+
 * |       Mapa de particiones        |
 * |                                  |
 * +-0x00000000-----------------------+
 * |            bootloader   CFE      | 512 kb
 * +-0x00080000-----------------------+
 * |            CFE config            | 128 kb
 * +-0x000a0000-----------------------+
 * |            reserve               | 3.2 Mb
 * +-0x003c0000-----------------------+
 * |            secure storage        | 128 kb
 * +-0x003e0000-----------------------+
 * |            MAC address           | 126 kb
 * +-0x003ff800-----------------------+
 * |            hdcp                  | 2 kb
 * +-0x00400000-----------------------+

Las otras 12 particiones (mtd6 a mtd17) corresponden a la memoria NAND Flash Samsung K9K8G08U0A.

Creating 12 MTD partitions on "bcm7xxx-nand.0":
0x0000000006400000-0x0000000006c00000 : "Kernel"
0x0000000006c00000-0x0000000007800000 : "/usr"
0x0000000007800000-0x0000000008800000 : "/usr/local"
0x0000000008800000-0x000000000a800000 : "/usr/lib/MediaBrowser"
0x000000000a800000-0x000000000c800000 : "/usr/lib/MediaServer"
0x0000000000000000-0x0000000000800000 : "Kernel (alt)"
0x0000000000800000-0x0000000001400000 : "/usr (alt)"
0x0000000001400000-0x0000000002400000 : "/usr/local (alt)"
0x0000000002400000-0x0000000004400000 : "/usr/lib/MediaBrowser (alt)"
0x0000000004400000-0x0000000006400000 : "/usr/lib/MediaServer (alt)"
0x000000000c800000-0x000000000cc00000 : "Splash"
0x000000000cc00000-0x000000003fa00000 : "/rw/yaffs"

Mapa de particiones NAND Flash

 * +----------------------------------------+
 * |       Mapa de particiones              |
 * |                                        |
 * +-0x00000000-----------------------------+
 * |            Kernel (alt)                | 8 Mb
 * +-0x00800000-----------------------------+
 * |            /usr (alt)                  | 12 Mb
 * +-0x01400000-----------------------------+
 * |            /usr/local (alt)            | 16 Mb
 * +-0x02400000-----------------------------+
 * |            /usr/lib/MediaBrowser (alt) | 32 Mb
 * +-0x04400000-----------------------------+
 * |            /usr/lib/MediaServer (alt)  | 32 Mb
 * +-0x06400000-----------------------------+
 * |            Kernel                      | 8 Mb
 * +-0x06c00000-----------------------------+
 * |            /usr                        | 12 Mb
 * +-0x07800000-----------------------------+
 * |            /usr/local                  | 16 Mb
 * +-0x08800000-----------------------------+
 * |            /usr/lib/MediaBrowser       | 32 Mb
 * +-0x0a800000-----------------------------+
 * |            /usr/lib/MediaServer        | 32 Mb
 * +-0x0c800000-----------------------------+
 * |            Splash                      | 4 Mb
 * +-0x0cc00000-----------------------------+
 * |            /rw/yaffs                   | 833 Mb
 * +-0x3fa00000-----------------------------+

Una vez analizada la estructura de la memoria flash, procederemos a realizar el backup.
EL primer paso sera encender el equipo y dejar que finalice el proceso de arranque completo, después conectaremos el pendrive al usb.

Ahora desde la consola, se crea la carpeta donde se montará el usb y se comprueba que este montado correctamente. En mi caso la carpeta la he creado en /tmp/usb.

[root@stb:/] # mkdir /tmp/usb
[root@stb:/] # mount /dev/sda1 /tmp/usb
[root@stb:/] # df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/romblock7            3.3M      3.3M         0 100% /usr
/dev/romblock8           12.3M     12.3M         0 100% /usr/local
/dev/romblock9           11.3M     11.3M         0 100% /usr/lib/MediaBrowser
/dev/romblock10           1.0M      1.0M         0 100% /usr/lib/MediaServer
/dev/mtdblock17         814.0M      2.3M    811.7M   0% /rw
tmpfs                    32.0M     20.0k     32.0M   0% /tmp
/dev/sda1                 7.4G      3.6G      3.9G  48% /tmp/usb
[root@stb:/] # 

Copia de seguridad de la memoria NOR Flash.

[root@stb:/] # dd if=/dev/mtd0 of=/tmp/usb/cfe.bin
1024+0 records in
1024+0 records out
[root@stb:/] # dd if=/dev/mtd1 of=/tmp/usb/cfe_config.bin
256+0 records in
256+0 records out
[root@stb:/] # dd if=/dev/mtd2 of=/tmp/usb/reserve       
6400+0 records in
6400+0 records out
[root@stb:/] # dd if=/dev/mtd3 of=/tmp/usb/secure_storage
256+0 records in
256+0 records out
[root@stb:/] # dd if=/dev/mtd4 of=/tmp/usb/MAC_address   
252+0 records in
252+0 records out
[root@stb:/] # dd if=/dev/mtd5 of=/tmp/usb/hdcp       
4+0 records in
4+0 records out
[root@stb:/] #

Copia de seguridad de la memoria NAND Flash.

[root@stb:/] # dd if=/dev/mtd6 of=/tmp/usb/kernel
16384+0 records in
16384+0 records out
[root@stb:/] # dd if=/dev/mtd7 of=/tmp/usb/usr
24576+0 records in
24576+0 records out
[root@stb:/] # dd if=/dev/mtd8 of=/tmp/usb/usr_local
32768+0 records in
32768+0 records out
[root@stb:/] # dd if=/dev/mtd9 of=/tmp/usb/u_l_mb
65536+0 records in
65536+0 records out
[root@stb:/] # dd if=/dev/mtd10 of=/tmp/usb/u_l_ms
65536+0 records in
65536+0 records out
[root@stb:/] # dd if=/dev/mtd11 of=/tmp/usb/kernelalt
16384+0 records in
16384+0 records out
[root@stb:/] # dd if=/dev/mtd12 of=/tmp/usb/usr_alt
24576+0 records in
24576+0 records out
[root@stb:/] # dd if=/dev/mtd13 of=/tmp/usb/usr_lo_al
32768+0 records in
32768+0 records out
[root@stb:/] # dd if=/dev/mtd14 of=/tmp/usb/u_l_mb_alt
65536+0 records in
65536+0 records out
[root@stb:/] # dd if=/dev/mtd15 of=/tmp/usb/u_l_ms_alt
65536+0 records in
65536+0 records out
[root@stb:/] # dd if=/dev/mtd16 of=/tmp/usb/splash
8192+0 records in
8192+0 records out
[root@stb:/] # dd if=/dev/mtd17 of=/tmp/usb/yaffs
1667072+0 records in
1667072+0 records out

Ahora ya tenemos nuestra copia completada, recomiendo tener dos copias del backup, una sin tocar "original" y la otra para análisis, modificaciones, etc. Un buen lugar puede ser el disco duro o la nube personal.

Estos son los enlaces a mi copia.

mtd0: ["CFE"] 512KB
mtd1: ["CFE config"] 128KB
mtd2: ["reserved"] 3.1MB
mtd3: ["secure storage"] 128KB
mtd4: ["MAC address"] 126KB
mtd5: ["hdcp"] 2KB
mtd6: ["Kernel"] 8MB
mtd7: ["/usr"] 12MB
mtd8: ["/usr/local"] 16MB
mtd9: ["/usr/lib/MediaBrowser"] 32MB
mtd10 ["/usr/lib/MediaServer"] 32MB
mtd11 ["Kernel (alt)"] 8MB
mtd12 ["/usr (alt)"] 12MB
mtd13 ["/usr/local (alt)"] 16MB
mtd14 ["/usr/lib/MediaBrowser (alt)"] 32MB
mtd15 ["/usr/lib/MediaServer (alt)"] 32MB
mtd16 ["Splash"] 4MB
mtd17 ["/rw/yaffs"] 833MB

6 comentarios:

Lucas dijo...

Muchas gracias por aportar esta guía y tus archivos, la verdad no se me había ocurrido usar el comando dd, usándolo pude hacer la copia de seguridad de la memoria NOR.

Si quieres revisar alguna de mis particiones avísame y la subo.

La placa I2C puede recuperar el equipo incluso si el CFE no arranca? porque si es así lo que yo deseo hacer es tratar de reemplazar el CFE original de mi equipo por otro de uno que use el mismo procesador y que pueda arrancar cualquier kernel, aunque como no tengo la placa I2C no puedo recuperarlo en caso de que no funcione, si quieres podrías intentar hacer eso tu.

Sergio dijo...

Hola Lucas,

si en caso de problemas se puede recuperar sin problemas con la placa de I2C, ya he probado a cargar los cfe.bin de los VU, pero no arranca.

Lucas dijo...

Hola Sergio, podrías probar con los bootloaders de los xtrend, específicamente los de la serie 5xxx, 6xxx y 9xxx que son los que usan un BCM7413.

Puedes conseguir algunos de aquí:

http://www.et-view.net/bbs/bsub3_1

Sergio dijo...

Hola Lucas,

ya he probado los bootloader de esos modelos, pero no ha habido suerte, no arranca. Los modelos que se llevan el BCM7413 son:
XTrend ET5000 - BCM7413
XTrend ET6000 - BCM7413
XTrend 9000 - BCM7413
XTrend 9200 - BCM7413
XTrend 9500 - BCM7413
Vu+ Ultimo - BCM7413
Vu+ Uno - BCM7413

Lucas dijo...

Me parece que cambiar el bootloader no va a ser tan fácil como pensaba... lo único que se me ocurre es que quizá el bootloader tenga que pesar exactamente lo mismo que el tuyo, que son 512 KB, había abierto los CFE con un editor hexadecimal y me di cuenta que la mayor parte del final esta ocupada por "FF" que por lo que veo son espacios vacíos, quizás si rellenas el CFE del xtrend con eso hasta llegar al peso exacto del original puede que funcione.

Si eso no funciona me parece que habrá que ver como pasar a lenguaje ensamblador el binario del CFE, aunque honestamente no tengo idea de como hacer eso.

Sergio dijo...

Hola Lucas,

Yo comentaba lo de la suma MD5, pero tambien podria ser una comprobacion del CRC. Ahora estoy mirando el contenido de la memoria NOR y NAND flash. El tamaño del archivo no es lo importante, en el bootloader se define la posición de memoria desde donde arranca y las particiones que utiliza de la NAND. Si el bootloader espera una posición y no es la correcta, no arranca. Si quieres analizar los contenidos de la NOR y NAND, estos son algunos comandos que te pueden ser utiles: file (información del tipo de archivo), hexdump (volcado del contenido en hexadecimal) y strings (extraer los strings del archivo)

Publicar un comentario