GeoAI & Remote Sensing for Mine Waste Stability in Chile
11 de octubre de 2026
Tenía un Nexus 7 de 2012 (grouper) con Android 5.1.1 juntando polvo. Nura (antes postmarketOS) lo soporta con kernel mainline y U-Boot, así que decidí darle una segunda vida.
El problema: instalar U-Boot reemplaza el bootloader de ASUS y sobrescribe toda la memoria interna, y parte de lo que hay que respaldar es único de cada tablet. Este tutorial cuenta cómo lo hice con una regla: no escribir nada hasta tener un respaldo completo, verificado y una forma probada de volver.
Advertencia. Esto puede dejar tu tablet inservible. Los respaldos son de tu unidad y no sirven para otra. No compartas tu SBK ni el archivo
bct.imgque se genera más adelante. Hazlo bajo tu propio riesgo.
grouper). La guía oficial también cubre la versión 3G (tilapia); yo probé grouper, placa E1565.sudo dpkg --add-architecture i386
sudo apt update
sudo apt install adb fastboot build-essential gcc-arm-none-eabi git python3-usb \
libc6:i386 libstdc++6:i386 zlib1g:i386 autoconf bison flex libgnutls28-dev \
libncurses-dev libssl-dev python3-cryptography python3-dev python3-setuptools swig
Las librerías i386 son porque nvflash es un programa de 32 bits. Si usas conda, ejecuta las herramientas con el Python del sistema (export PATH=/usr/bin:/bin:$PATH): el de conda no trae pyusb.
mkdir -p ~/nexus7 && cd ~/nexus7
git clone --recursive https://codeberg.org/libre-tegra/fusee-tools.git
git clone https://codeberg.org/libre-tegra/re-crypt.git
git clone --depth 1 --branch v2026.07 https://source.denx.de/u-boot/u-boot.git
wget https://codeberg.org/clamor-s/bootloader-collection/raw/branch/master/asus-google-grouper-tilapia-4.23-bootloader.bin
(cd fusee-tools/payloads && make -j1 ARCH=arm CROSS_COMPILE=arm-none-eabi-)
Versiones que usé: fusee-tools 04cc468, re-crypt 7f3b468, U-Boot v2026.07, TWRP 3.7.0_9, imagen de Nura 20261009-1907.
Activa la depuración USB en Android y revisa:
adb shell getprop ro.hardware # grouper
adb shell getprop ro.bootloader # 4.23
adb shell ls /sys/bus/i2c/drivers/max77663/ # si aparece un dispositivo: placa E1565
adb shell ls /sys/bus/i2c/drivers/tps6591x/ # si aparece un dispositivo: placa PM269
adb reboot bootloader && fastboot getvar all && fastboot reboot
En mi caso: grouper, bootloader 4.23, hardware ER3 y, sorpresa, bootloader ya desbloqueado. Eso habilita el paso 2.
Si el bootloader está desbloqueado, puedes arrancar TWRP sin instalarlo y copiar la memoria entera. No reemplaza el respaldo por APX (paso 4), pero te da una segunda copia independiente y una forma de restaurar Android tal cual estaba.
Descarga twrp-3.7.0_9-0-grouper.img desde twrp.me y verifica su SHA-256. Usa fastboot boot, no fastboot flash:
adb reboot bootloader
fastboot boot twrp-3.7.0_9-0-grouper.img
adb shell 'umount /sdcard; umount /data; umount /cache'
adb exec-out "dd if=/dev/block/mmcblk0 bs=1048576 2>/dev/null" > mmcblk0.img
adb exec-out "dd if=/dev/block/mmcblk0boot0 2>/dev/null" > mmcblk0boot0.img
adb exec-out "dd if=/dev/block/mmcblk0boot1 2>/dev/null" > mmcblk0boot1.img
adb shell "dd if=/dev/block/mmcblk0 bs=1048576 2>/dev/null | sha256sum" # comparar con:
sha256sum mmcblk0.img
adb reboot
Son ~7,1 GiB a unos 3,5 MiB/s: más o menos 35 minutos. Dos detalles: el dd de TWRP es de 32 bits y no puede saltar más allá de 2 GiB con skip (lee todo para llegar), y TWRP deja una carpeta vacía TWRP en /sdcard.
APX (o RCM) es el modo de recuperación del chip Tegra. Se reconoce porque la pantalla queda negra y el PC muestra:
ID 0955:7330 NVIDIA Corp. APX
La guía oficial dice: con la tablet apagada, mantener volumen arriba y enchufar el USB. A mí no me funcionó. Ojo con dos trampas: mantener Power con la tablet apagada la enciende, y si la enchufas apagada arranca en modo carga.
Lo que sí funcionó, siempre, fue pedírselo al kernel:
adb reboot forced-recovery
Funciona desde Android y también desde TWRP.
Con la tablet en APX, carga el bootloader original en RAM y lee las zonas críticas:
cd ~/nexus7/fusee-tools
./run_bootloader.sh -s T30 -t ./bct/grouper.bct -b ../asus-google-grouper-tilapia-4.23-bootloader.bin
NV=./utils/nvflash_v1.13.87205
mkdir -p ~/nexus7/respaldo
$NV --resume --getpartitiontable ~/nexus7/respaldo/partitiontable.txt
$NV --resume --rawdeviceread 0 2688 ~/nexus7/respaldo/bricksafe.img
for p in EKS PER MDA GP1 GPT; do $NV --resume --read $p ~/nexus7/respaldo/$p.img; done
run_bootloader.sh no escribe nada: usa --setbct, que según la propia ayuda de nvflash carga la BCT en la RAM interna del chip. La pantalla muestra el logo de Google.
bricksafe.img (10,5 MiB) contiene la BCT, la tabla de particiones, el bootloader y EKS: es la pieza clave para volver.
La BCT y la SBK necesitan cada una un APX nuevo. --getbct en modo --resume se cae (error 139). Reinicia la tablet (mantén Power ~10 s), vuelve a APX y:
./get_bct.sh -s T30 -t ~/nexus7/respaldo/bct_original.bct # -t es el archivo de SALIDA
Cuidado: si usas -t ./bct/grouper.bct como en el ejemplo del README, sobrescribes la BCT genérica del repositorio.
Otro APX nuevo para la SBK (la clave AES única de cada Tegra):
./dump_sbk.sh -s T30
# Dumped SBK [ 0x........ 0x........ 0x........ 0x........ ]
Guárdala en un lugar seguro, con ese mismo formato. La tablet se reinicia sola.
NVFlash ve boot0 + boot1 + el área de usuario como un solo disco, en sectores de 4096 bytes:
| Partición | Desde | Tamaño | Dónde queda |
|---|---|---|---|
| BCT | 0 | 3 MiB | boot0 y el inicio de boot1 |
| PT | 3 MiB | 512 KiB | boot1 |
| EBT (bootloader) | 3,5 MiB | 6 MiB | final de boot1 + inicio del área de usuario |
| EKS | 9,5 MiB | 1 MiB | área de usuario |
| GP1 | 10,5 MiB | 1 MiB | área de usuario (en mi caso, todo ceros) |
| SOS, LNX, APP… | 11,5 MiB | … | las particiones de Android |
Si hiciste el paso 2, puedes comprobar que bricksafe.img es exactamente boot0 + boot1 + los primeros 6,5 MiB de mmcblk0.img, y que PER, MDA y GPT coinciden con sus zonas de la imagen. En mi caso fue todo idéntico byte a byte: dos lecturas por caminos distintos.
La BCT y el bootloader que hay en la memoria están cifrados con la SBK. Si la clave es correcta, al descifrarlos tiene que salir la BCT que entregó get_bct.sh y el bootloader 4.23 que descargaste:
#!/usr/bin/env python3
# python3 verificar_sbk.py bricksafe.img bct_original.bct bootloader-4.23.bin sbk.txt
import sys
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.cmac import CMAC
brick, bct, bl, sbk = (open(p, "rb").read() for p in sys.argv[1:5])
key = b"".join(int(w, 16).to_bytes(4, "big") for w in sbk.decode().split())
def dec(data):
d = Cipher(algorithms.AES(key), modes.CBC(bytes(16))).decryptor()
return d.update(data) + d.finalize()
n = len(bct) # 6128 bytes en Tegra 3
cmac = CMAC(algorithms.AES(key)); cmac.update(brick[16:n])
print("BCT descifrada = BCT de get_bct:", dec(brick[16:n]) == bct[16:])
print("firma de la BCT válida:", cmac.finalize() == brick[:16])
ebt = brick[0x380000:0x380000 + len(bl)] # el EBT empieza a 3,5 MiB
print("bootloader descifrado = bootloader 4.23:", dec(ebt) == bl)
sbk.txt contiene las cuatro palabras 0x... separadas por espacios. Si las tres líneas dicen True, la SBK es la correcta y, de paso, sabes que el bootloader.bin descargado es exactamente el de tu tablet.
cd ~/nexus7/u-boot
make ARCH=arm CROSS_COMPILE=arm-none-eabi- grouper_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j$(nproc)
cd ../re-crypt
python3 re-crypt.py --dev grouper --sbk 0x........ 0x........ 0x........ 0x........ \
--bl ../u-boot/u-boot-dtb-tegra.bin --split
Esto genera bct.img (para boot0) y ebt.img (U-Boot cifrado, para boot1). Tres cosas que vale la pena saber:
rmtree('__pycache__'). Es en su última línea, después de escribir los archivos: no afecta.bct.img, y esa copia queda grabada en boot0. Trata bct.img como secreto.Antes de escribir nada, confirma que tienes una forma de volver a APX una vez instalado U-Boot. Con la tablet en APX, mantén volumen abajo y carga U-Boot en RAM:
cd ~/nexus7/fusee-tools
./run_bootloader.sh -s T30 -t ./bct/grouper.bct -b ../u-boot/u-boot-dtb-tegra.bin
nvflash dirá bootloader download failed: es normal, U-Boot no habla su protocolo. En la tablet aparece el menú de U-Boot. Elige reboot RCM: la tablet debe volver a aparecer como APX. Esa es tu vía de regreso después de la migración.
Repite el paso 7, pero en el menú elige fastboot. Comprueba que hablas con U-Boot y escribe:
fastboot getvar version-bootloader # U-Boot 2026.07
fastboot flash 0.1 bct.img # boot0
fastboot flash 0.2 ebt.img # boot1
fastboot reboot # mantén volumen abajo
Si vuelve el menú de U-Boot, ahora está arrancando desde la memoria interna.
Las imágenes listas están en images.nura.eco, con varias interfaces: console, i3wm, mate, sxmo-de-dwm y xfce4. No hay Phosh ni Plasma porque la GPU del Tegra 3 no tiene aceleración en este stack. Elegí sxmo, pensado para pantallas táctiles y botones.
sha256sum -c 20261009-1907-postmarketOS-edge-sxmo-de-dwm-1.18.0-nvidia-tegra-armv7.img.xz.sha256
En el menú de U-Boot elige mount internal storage: la tablet aparece en el PC como un disco. Identifícalo con cuidado: compara lsblk antes y después, y revisa que mida lo mismo que la memoria de la tablet (7,1 GiB en el modelo de 8 GB) y que esté conectado por usb. Un dd al disco equivocado no tiene vuelta.
lsblk -o NAME,SIZE,TRAN
xzcat 20261009-1907-...-nvidia-tegra-armv7.img.xz | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync
sync
udisksctl power-off -b /dev/sdX
Al expulsar el disco, U-Boot vuelve a su menú: elige reboot. En mi caso el primer arranque quedó en negro después del logo; al reiniciar apareció todo.
| Botón | 1 toque | 2 toques | 3 toques o mantener |
|---|---|---|---|
| Volumen abajo | teclado en pantalla | disposición de ventanas | cerrar app |
| Volumen arriba | menú | menú principal | — |
| Power | bloquear / apagar pantalla | — | terminal |
Para el Wi-Fi: menú, luego Networks. O desde la terminal:
nmcli device wifi list
nmcli device wifi connect "MiRed" password "miclave"
Según la wiki de Nura, en esta tablet hay que desactivar la protección 802.11w (frecuente con WPA3). Si no conecta, prueba con una red solo WPA2.
La tablet también aparece en el PC como red USB, con la IP 172.16.42.1. En mi primer arranque SSH no respondía; si lo necesitas, actívalo desde la terminal de la tablet.
Escríbelo antes de migrar. El resumen:
run_bootloader.sh, igual que en el paso 4, y escribir las zonas de arranque:
$NV --resume --rawdevicewrite 0 2688 bricksafe.img
--download de EKS, PER, MDA, GP1 y GPT con nvflash (un APX nuevo para cada uno) y después Android con fastboot.fastboot boot de TWRP y escribir la imagen completa con adb exec-in "dd of=/dev/block/mmcblk0 bs=1048576" < mmcblk0.img. Lo ensayé escribiendo solo a la RAM: hay que congelar la interfaz de TWRP (kill -STOP a /sbin/recovery, porque vuelve a montar /cache sola) y esperar a que dd termine en la tablet antes de verificar.No uses flash-all.sh de la imagen de fábrica de Google: según la wiki de Nura, trae el bootloader roto.
Ninguna de estas escrituras la he probado, porque no se pueden ensayar sin borrar la tablet. Lo que sí probé: todas las entradas a APX, la carga en RAM, todas las lecturas y exec-in.
error -71 en journalctl -k). Lo resolví limpiando el puerto micro-USB con un palito y cambiando el cable. Antes de flashear, observé 2 minutos sin cortes.adb reboot forced-recovery sí.python3 del sistema, que es el que tiene pyusb.--getbct en --resume se cae: usa get_bct.sh en un APX nuevo.bootloader download failed al cargar U-Boot en RAM: es normal.Todo el trabajo difícil es de otros. Gracias a quienes mantienen estas herramientas:
El logo de Nura es de sus autores y se usa aquí solo para identificar el proyecto.