• Extraer datos de una partición Production de OpenWrt

    La partición de producción de OpenWrt guarda todos los datos importantes. Desde el rootfs hasta los datos guardados en el overlay, que son los datos que se han escrito «sobre» los datos del rootfs original (aunque realmente no es que se sobreescriban, sino que los datos del overlay «tienen más prioridad» que los del rootfs sin modificar). A la hora de extraer esos datos, lo que realmente nos interesa son los datos del overlay.

    Si tenemos OpenWrt instalado en una MicroSD, y esta está en /dev/sdb, hacemos:

    sudo fdisk -l /dev/sdb

    Vemos una salida como esta:

    Disco /dev/sdb: 29,71 GiB, 31902400512 bytes, 62309376 sectores
    Modelo de disco: USB3.0 CRW -SD
    Unidades: sectores de 1 * 512 = 512 bytes
    Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
    Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Tipo de etiqueta de disco: gpt
    Identificador del disco: 5452574F-2211-4433-5566-778899AABB00
    
    Disposit. Comienzo    Final Sectores Tamaño Tipo
    /dev/sdb1       34     8191     8158     4M Sistema de ficheros de Linux
    /dev/sdb2     8192     9215     1024   512K Sistema de ficheros de Linux
    /dev/sdb3     9216    13311     4096     2M Sistema de ficheros de Linux
    /dev/sdb4    13312    21503     8192     4M Sistema EFI
    /dev/sdb5    24576    90111    65536    32M Sistema EFI
    /dev/sdb6    90112   131071    40960    20M Sistema EFI
    /dev/sdb7   131072 62309342 62178271  29,6G desconocido

    La partición que nos interesa es la última, porque suele ser la de producción. Procedemos a quemarla en un archivo:

    sudo dd if=/dev/sdb7 of='/root/sdb7.img' status=progress

    Salida:

    62178271+0 records in
    62178271+0 records out
    31835274752 bytes (32 GB, 30 GiB) copied, 340,193 s, 93,6 MB/s

    Miramos que tipo de imagen es:

    sudo file /root/sdb7.img

    Salida:

    /root/sdb7.img: Device Tree Blob version 17, size=4096,    boot CPU=0, string block size=142, DT structure block size=3820

    Eso es una buena señal. Normalmente, la partición de producción es un Device Tree Blob. Entonces, como sabemos que la partición de overlay aparece a 1024 bytes desde el inicio real del filesystem como F2FS y la firma mágica de un F2FS es 10 20 f5 f2, para montar la partición overlay de ese archivo hacemos:

    vImg='/root/sdb7.img'
    vOffsetFirma=$(LC_ALL=C grep -aobm1 $'\x10\x20\xf5\xf2' "$vImg" | cut -d ':' -f 1)
    vOffsetOverlay=$((vOffsetFirma - 1024))
    mkdir -p /mnt/overlay-openwrt
    mount -o loop,ro,offset="$vOffsetOverlay" -t f2fs "$vImg" /mnt/overlay-openwrt

    Eso ya nos deja montada la partición overlay como sólo lectura en la carpeta /mnt/overlay-openwrt. A partir de entonces ya podemos navegar por esa carpeta para extraer los archivos que nos interese extraer de ella.

    EXTRA: Si necesitamos obtener un poco de información sobre la imagen del archivo:

    apt-get update && apt-get -y install u-boot-tools
    dumpimage -l /root/sdb7.img

    Salida:

    FIT description: ARM64 OpenWrt FIT (Flattened Image Tree)
    Created: Tue Feb 4 00:09:37 2025
      Image 0 (kernel-1)
        Description: ARM64 OpenWrt Linux-6.6.73
        Created: Tue Feb 4 00:09:37 2025
        Type: Kernel Image
        Compression: gzip compressed
        Data Size: 5633434 Bytes = 5501.40 KiB = 5.37 MiB
        Architecture: AArch64
        OS: Linux
        Load Address: 0x44000000
        Entry Point: 0x44000000
        Hash algo: crc32
        Hash value: 9451099d
        Hash algo: sha1
        Hash value: feeb11863ab132c7c24bf1c70a1daec2dfba4c62
      Image 1 (fdt-1)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree blob
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 31935 Bytes = 31.19 KiB = 0.03 MiB
        Architecture: AArch64
        Load Address: 0x43f00000
        Hash algo: crc32
        Hash value: fae8a5f6
        Hash algo: sha1
        Hash value: 4487cda227d6248f1d6cf259593bedbbfc609872
      Image 2 (fdt-mt7986a-bananapi-bpi-r3-emmc)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree overlay mt7986a-bananapi-bpi-r3-emmc
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 990 Bytes = 0.97 KiB = 0.00 MiB
        Architecture: AArch64
        Hash algo: crc32
        Hash value: 85e4da58
        Hash algo: sha1
        Hash value: 471cf60107fbdc3dcb772696c05db2eb3c1d8a17
      Image 3 (fdt-mt7986a-bananapi-bpi-r3-nand)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree overlay mt7986a-bananapi-bpi-r3-nand
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 1166 Bytes = 1.14 KiB = 0.00 MiB
        Architecture: AArch64
        Hash algo: crc32
        Hash value: 80cf140c
        Hash algo: sha1
        Hash value: cd9c9ecb32a6ebeb009f82eb718e49d29feff6a1
      Image 4 (fdt-mt7986a-bananapi-bpi-r3-nor)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree overlay mt7986a-bananapi-bpi-r3-nor
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 1214 Bytes = 1.19 KiB = 0.00 MiB
        Architecture: AArch64
        Hash algo: crc32
        Hash value: a3898f18
        Hash algo: sha1
        Hash value: c45f4ad930273fbc6721b946a380aca1c9bbd5a4
      Image 5 (fdt-mt7986a-bananapi-bpi-r3-sd)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree overlay mt7986a-bananapi-bpi-r3-sd
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 836 Bytes = 0.82 KiB = 0.00 MiB
        Architecture: AArch64
        Hash algo: crc32
        Hash value: d42f2ae8
        Hash algo: sha1
        Hash value: 17df94373cd82dec3921ddc92c3a61bcc4cef81d
      Image 6 (fdt-mt7986a-bananapi-bpi-r3-respeaker-2mics)
        Description: ARM64 OpenWrt bananapi_bpi-r3 device tree overlay mt7986a-bananapi-bpi-r3-respeaker-2mics
        Created: Tue Feb 4 00:09:37 2025
        Type: Flat Device Tree
        Compression: uncompressed
        Data Size: 1366 Bytes = 1.33 KiB = 0.00 MiB
        Architecture: AArch64
        Hash algo: crc32
        Hash value: e18d9119
        Hash algo: sha1
        Hash value: ab6aca488c28a6bbb0b991053346e9ab977be747
      Image 7 (rootfs-1)
        Description: ARM64 OpenWrt bananapi_bpi-r3 rootfs
        Created: Tue Feb 4 00:09:37 2025
        Type: Filesystem Image
        Compression: uncompressed
        Data Size: 32088064 Bytes = 31336.00 KiB = 30.60 MiB
        Hash algo: crc32
        Hash value: f1e8489e
        Hash algo: sha1
        Hash value: 3a7a8d742a6aa810077b6230809bbb012b7c7d73
    Default Configuration: 'config-mt7986a-bananapi-bpi-r3'
    Configuration 0 (config-mt7986a-bananapi-bpi-r3)
      Description: OpenWrt bananapi_bpi-r3
      Kernel: kernel-1
      FDT: fdt-1
      Loadables: rootfs-1
    Configuration 1 (mt7986a-bananapi-bpi-r3-emmc)
      Description: OpenWrt bananapi_bpi-r3 overlay mt7986a-bananapi-bpi-r3-emmc
      Kernel: unavailable
      FDT: fdt-mt7986a-bananapi-bpi-r3-emmc
    Configuration 2 (mt7986a-bananapi-bpi-r3-nand)
      Description: OpenWrt bananapi_bpi-r3 overlay mt7986a-bananapi-bpi-r3-nand
      Kernel: unavailable
      FDT: fdt-mt7986a-bananapi-bpi-r3-nand
    Configuration 3 (mt7986a-bananapi-bpi-r3-nor)
      Description: OpenWrt bananapi_bpi-r3 overlay mt7986a-bananapi-bpi-r3-nor
      Kernel: unavailable
      FDT: fdt-mt7986a-bananapi-bpi-r3-nor
    Configuration 4 (mt7986a-bananapi-bpi-r3-sd)
      Description: OpenWrt bananapi_bpi-r3 overlay mt7986a-bananapi-bpi-r3-sd
      Kernel: unavailable
      FDT: fdt-mt7986a-bananapi-bpi-r3-sd
    Configuration 5 (mt7986a-bananapi-bpi-r3-respeaker-2mics)
      Description: OpenWrt bananapi_bpi-r3 overlay mt7986a-bananapi-bpi-r3-respeaker-2mics
      Kernel: unavailable
      FDT: fdt-mt7986a-bananapi-bpi-r3-respeaker-2mics

    Vemos ahí el rootfs original de la versión de OpenWrt que está instalada en la MicroSD:

    Image 7 (rootfs-1)
    Type: Filesystem Image
    Compression: uncompressed
    Data Size: 32088064 Bytes

    Pero la partición sdb7.img no se monta directamente porque es una FIT image. Primero hay que extraer la subimagen rootfs-1:

    dumpimage -T flat_dt -p 7 -o /root/rootfs-1.img /root/sdb7.img

    Posible salida:

    Extracted:
    Image 7 (rootfs-1)
    Description: ARM64 OpenWrt bananapi_bpi-r3 rootfs
    Created: Tue Feb 4 00:09:37 2025
    Type: Filesystem Image
    Compression: uncompressed
    Data Size: 32088064 Bytes = 31336.00 KiB = 30.60 MiB
    Hash algo: crc32
    Hash value: f1e8489e
    Hash algo: sha1
    Hash value: 3a7a8d742a6aa810077b6230809bbb012b7c7d73

    Si queremos ver información de la imagen que se extrajo:

    file /root/rootfs-1.img

    Posible salida:

    /root/rootfs-1.img: Squashfs filesystem, little endian, version 4.0, xz compressed, 32086721 bytes, 3502 inodes, blocksize: 262144 bytes, created: Mon Feb 3 23:09:37 2025

    Bien, ya tenemos un filesystem real: SquashFS! Para montarlo en solo lectura:

    mkdir -p /mnt/rootfs-openwrt
    mount -o loop,ro -t squashfs /mnt/PartDatos/NiPeGun/rootfs-1.img /mnt/rootfs-openwrt

    Deja una respuesta