Manuel Silva Vega

Logo

GeoAI & Remote Sensing for Mine Waste Stability in Chile

View My GitHub Profile

Logo de Nura

Nexus 7 (2012) con Linux de verdad

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.img que se genera más adelante. Hazlo bajo tu propio riesgo.

Qué necesitas

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.

1. Identificar la tablet (solo lectura)

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.

2. Imagen completa de la memoria con TWRP en RAM (opcional)

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.

3. Entrar en APX

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.

4. Respaldo por APX (solo lectura)

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.

Cómo se ve la memoria desde NVFlash

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.

5. Verificar la SBK sin escribir nada

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.

6. Compilar U-Boot y prepararlo con re-crypt

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:

7. Probar U-Boot en RAM antes de flashear

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.

8. Flashear U-Boot

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.

9. Instalar Nura

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.

10. Primeros pasos en sxmo

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.

Volver a Android

Escríbelo antes de migrar. El resumen:

  1. Entrar en APX: menú de U-Boot, reboot RCM. Si U-Boot no arranca, la ROM del chip entra sola en APX.
  2. Cargar el bootloader 4.23 en RAM con run_bootloader.sh, igual que en el paso 4, y escribir las zonas de arranque:
    $NV --resume --rawdevicewrite 0 2688 bricksafe.img
    
  3. Reponer el resto, por una de dos vías:
    • Ruta de la guía: --download de EKS, PER, MDA, GP1 y GPT con nvflash (un APX nuevo para cada uno) y después Android con fastboot.
    • Si tienes la imagen del paso 2: 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.

Problemas que encontré

Créditos y fuentes

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.