5 votos

¿Cómo recuperar los datos y directorios aparentemente perdidos del volumen APFS? `Bloque encontrado a cero`.

TL;DR - Mi volumen APFS parece estar parcialmente dañado y falta mi directorio de usuario, /Users/jivan . ¿Cómo puedo recuperarlo?


El cable SATA de mi MacBookPro9,2, que ejecutaba Mojave, falló recientemente. Mientras esperaba un cable de repuesto, utilicé un adaptador SATA a USB para intentar diagnosticar si la unidad (una Kingston A400 de 480 GB) era la culpable, utilizando Ubuntu en otro portátil. Parece que algunos de los datos de la unidad se corrompió debido a la falla del cable, como gdisk informó que la tabla principal de GPT estaba dañada. La restauré desde la tabla GPT de respaldo, ya que aparentemente estaba intacta.

A continuación, utilicé apfs-fuse para intentar montar los volúmenes APFS en la unidad (sólo tiene un ESP y un contenedor APFS sin cifrar con la instalación de Mojave que estaba utilizando). Esto mostró que todos los datos en el volumen APFS principal estaba intacto, aparte de mi carpeta de usuario, /Users/jivan . Mientras que jivan se muestra mediante ls /mnt/apfs-volume/Users , intentando cd o ls en jivan informa de un error de E/S.


Arranqué en MacOS Catalina Internet Recovery en mi MacBook para inspeccionar la unidad más allá utilizando el cable SATA a USB, pero diskutil apfs list informó que el contenedor APFS no tenía volúmenes junto con algunos errores, como los siguientes:

APFS Containers (2 found)
|
+-- Container ERROR -69808
    ======================
    APFS Container Reference:     disk23
    Size (Capacity Ceiling):      ERROR -69620
    Capacity In Use By Volumes:   ERROR -69620
    Capacity Not Allocated:       ERROR -69620
    |
    +-< Physical Store disk22s2 60A9A81B-E7B9-4471-A76B-B98A419B5928
    |   -----------------------------------------------------------
    |   APFS Physical Store Disk:   disk22s2
    |   Size:                       479894224896 B (479.9 GB)
    |
    +-> No Volumes

También, fsck_apfs -n /dev/disk22 da lo siguiente (y lo mismo para disk22s2 y disk23 ):

** Checking the container superblock.
** Checking the EFI jumpstart record.
** Checking the space manager.
** Checking the space manager free queue trees.
** Checking the object map.
** Checking volume.
** Checking the APFS volume superblock.
** The volume macOS was formatted by diskmanagementd (945.241.4) and last modified by apfs_kext (1412.11.7).
** Checking the object map.
error: (oid 0xd31c1) om: btn: found zeroed-out block
   Object map is invalid.
** The volume /dev/disk22 could not be verified completely.

Después de que llegara mi cable SATA de repuesto, volví a instalar la unidad Kingston en mi MacBook utilizando el nuevo cable, y curiosamente, diskutil apfs list en Internet Recovery reveló los volúmenes APFS. Decidí instalar Catalina en otra unidad (un disco duro giratorio de Samsung), y arranqué desde ella usando mi cable SATA a USB para inspeccionar más. Catalina montó el volumen APFS principal de la unidad Kingston automáticamente al iniciar la sesión, y muestra el mismo árbol de directorios y contenidos que apfs-fuse en mi portátil Ubuntu, pero el /Users/jivan aparentemente falta por completo en el volumen; ls -al /Volumes/apfs-volume/Users sólo muestra el archivo .localized y el directorio Shared .

En este entorno, aquí está la salida de algunos comandos. Aquí, disk0 es la unidad de Kingston afectada, y disk2 es la unidad Samsung desde la que arranco por USB:

diskutil apfs list -

APFS Containers (2 found)
|
+-- Container disk1 37FD550D-60EE-4499-8C8F-DA1B831D5307
|   ====================================================
|   APFS Container Reference:     disk1
|   Size (Capacity Ceiling):      479894224896 B (479.9 GB)
|   Capacity In Use By Volumes:   393049374720 B (393.0 GB) (81.9% used)
|   Capacity Not Allocated:       86844850176 B (86.8 GB) (18.1% free)
|   |
|   +-< Physical Store disk0s2 60A9A81B-E7B9-4471-A76B-B98A419B5928
|   |   -----------------------------------------------------------
|   |   APFS Physical Store Disk:   disk0s2
|   |   Size:                       479894224896 B (479.9 GB)
|   |
|   +-> Volume disk1s1 6E2363BF-6CE3-4C87-9F02-BFFE741B8C6E
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk1s1 (No specific role)
|   |   Name:                      macOS (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         389137477632 B (389.1 GB)
|   |   FileVault:                 No
|   |
|   +-> Volume disk1s2 1190A062-F647-4365-A53F-2D0F18786F4C
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk1s2 (Preboot)
|   |   Name:                      Preboot (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         23650304 B (23.7 MB)
|   |   FileVault:                 No
|   |
|   +-> Volume disk1s3 FD9795DB-502A-4234-AD25-CAC5DC529D4C
|   |   ---------------------------------------------------
|   |   APFS Volume Disk (Role):   disk1s3 (Recovery)
|   |   Name:                      Recovery (Case-insensitive)
|   |   Mount Point:               Not Mounted
|   |   Capacity Consumed:         507379712 B (507.4 MB)
|   |   FileVault:                 No
|   |
|   +-> Volume disk1s4 24A3A499-3198-4C08-8566-4F1CBBCCC463
|       ---------------------------------------------------
|       APFS Volume Disk (Role):   disk1s4 (VM)
|       Name:                      VM (Case-insensitive)
|       Mount Point:               Not Mounted
|       Capacity Consumed:         3221250048 B (3.2 GB)
|       FileVault:                 No
|
+-- Container disk3 DE001FA1-3FF2-4F81-B9DF-14D7625570CF
    ====================================================
    APFS Container Reference:     disk3
    Size (Capacity Ceiling):      499898105856 B (499.9 GB)
    Capacity In Use By Volumes:   27490463744 B (27.5 GB) (5.5% used)
    Capacity Not Allocated:       472407642112 B (472.4 GB) (94.5% free)
    |
    +-< Physical Store disk2s2 C586BA38-5AC2-4FA5-B915-6A5AB52530FF
    |   -----------------------------------------------------------
    |   APFS Physical Store Disk:   disk2s2
    |   Size:                       499898105856 B (499.9 GB)
    |
    +-> Volume disk3s1 3278C2B2-F51A-42BB-91D5-D451BC6A9DF6
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s1 (Data)
    |   Name:                      macOS - Data (Case-sensitive)
    |   Mount Point:               /System/Volumes/Data
    |   Capacity Consumed:         7580196864 B (7.6 GB)
    |   FileVault:                 No
    |
    +-> Volume disk3s2 B0CD759B-06AF-4928-90B8-E04E9777CF9F
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s2 (Preboot)
    |   Name:                      Preboot (Case-insensitive)
    |   Mount Point:               Not Mounted
    |   Capacity Consumed:         25210880 B (25.2 MB)
    |   FileVault:                 No
    |
    +-> Volume disk3s3 DE577553-733C-462C-85DB-7FBEE04DAD1B
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s3 (Recovery)
    |   Name:                      Recovery (Case-insensitive)
    |   Mount Point:               Not Mounted
    |   Capacity Consumed:         525926400 B (525.9 MB)
    |   FileVault:                 No
    |
    +-> Volume disk3s4 DAE3C853-521B-426F-A183-BBBD9395F305
    |   ---------------------------------------------------
    |   APFS Volume Disk (Role):   disk3s4 (VM)
    |   Name:                      VM (Case-insensitive)
    |   Mount Point:               /private/var/vm
    |   Capacity Consumed:         8591003648 B (8.6 GB)
    |   FileVault:                 No
    |
    +-> Volume disk3s5 B9CFDA60-3D07-4499-9DE5-9F0D1ADFC63F
        ---------------------------------------------------
        APFS Volume Disk (Role):   disk3s5 (System)
        Name:                      macOS (Case-sensitive)
        Mount Point:               /
        Capacity Consumed:         10606632960 B (10.6 GB)
        FileVault:                 No

diskutil info disk0 -

Device Identifier:         disk0
Device Node:               /dev/disk0
Whole:                     Yes
Part of Whole:             disk0
Device / Media Name:       KINGSTON SA400S37480G
Volume Name:               Not applicable (no file system)
Mounted:                   Not applicable (no file system)
File System:               None
Content (IOContent):       GUID_partition_scheme
OS Can Be Installed:       No
Media Type:                Generic
Protocol:                  SATA
SMART Status:              Verified
Disk Size:                 480.1 GB (480103981056 Bytes) (exactly 937703088 512-Byte-Units)
Device Block Size:         512 Bytes
Read-Only Media:           No
Read-Only Volume:          Not applicable (no file system)
Device Location:           Internal
Removable Media:           Fixed
Solid State:               Yes
Virtual:                   No
Hardware AES Support:      No

sudo fsck_apfs -n /dev/disk0 (y lo mismo para disk0s2 , disk1 y disk1s1 ) -

** Checking the container superblock.
** Checking the EFI jumpstart record.
** Checking the space manager.
** Checking the space manager free queue trees.
** Checking the object map.
** Checking volume.
** Checking the APFS volume superblock.
** The volume macOS was formatted by diskmanagementd (945.241.4) and last modified by apfs_kext (1412.11.7).
** Checking the object map.
error: (oid 0xd31c1) om: btn: found zeroed-out block
   Object map is invalid.
** The volume /dev/disk0 could not be verified completely.

¿Hay alguna posibilidad de recuperar mis datos?

5voto

SuperDuck Puntos 1026

Hay un particular fsck error:

** Checking the object map.
error: (oid 0xd31c1) om: btn: found zeroed-out block
   Object map is invalid.

Aquí, om se refiere al mapa de objetos del macOS volumen, y btn se refiere a un nodo del árbol B en ese mapa de objetos. Evidentemente, parte del nodo se ha puesto a cero, lo que ha provocado que algunas o todas las dentrías de /Users/jivan siendo inaccesible.

I desarrolló algunas herramientas para inspeccionar el contenedor APFS, con la esperanza de que las versiones más antiguas del mapa de objetos y otras estructuras del sistema de archivos estuvieran intactas (como las referenciadas por una transacción APFS anterior), permitiéndome así acceder a mis archivos. Utilizando estas herramientas, descubrí que algunos nodos del árbol B de root del sistema de archivos de mi volumen principal de APFS habían sido eliminados. Gracias al comportamiento de APFS basado en transacciones/copias al escribir, pude buscar en todo el disco versiones más antiguas de estos nodos perdidos, y encontré con éxito instancias recientes de ellos - excepto para el nodo hoja particular que contiene los registros del sistema de archivos para /Users/jivan por lo que no se puede determinar directamente su contenido. Sin embargo, he podido comprobar que /Users/jivan tenía una identificación de 0xb54a8 y así buscar los nodos que contengan dentaduras de artículos cuyo ID de padre sea también 0xb54a8 estos nodos fueron los que listaron el contenido de /Users/jivan .

Para hacer más fácilmente una recuperación automatizada, reconstruí el nodo interno que faltaba del árbol B del sistema de archivos, y luego usé mi apfs-recover para obtener realmente cada archivo. Por ejemplo, para recuperar /Users/jivan/Documents/my file.pdf puedo hacerlo:

apfs-recover /dev/disk2s2 0 "/Users/jivan/Documents/my file.pdf" > "~/Desktop/my file.pdf"

En lugar de ejecutar dicho comando para cada archivo, escribí un Bash script, pull.sh que, cuando se le da un directorio de recuperación de destino y un archivo que enumera las rutas de los archivos que se intentan recuperar, ejecuta apfs-recover para cada una de esas rutas de archivos y envía el resultado a una ruta correspondiente en el directorio de recuperación. Por ejemplo, si el contenido de filepaths.txt son

/Users/jivan/Documents/my doc.pdf
/Users/jivan/Pictures/my pic.jpg

y luego correr pull.sh ~/Desktop/RECOVERY filepaths.txt recupera los archivos en las siguientes rutas:

~/Desktop/RECOVERY/Users/jivan/Documents/my doc.pdf
~/Desktop/RECOVERY/Users/jivan/Pictures/my pic.jpg

He añadido las entradas deseadas en filepaths.txt con algo de ayuda programática, y luego pude recuperar con éxito la gran mayoría de mis archivos. Para cualquier archivo particularmente importante que este script</strkeep><strkeep> no logre recuperar (debido a errores en el software que he escrito o a estructuras APFS adicionales malformadas/faltantes en el disco afectado) tendré que profundizar, pero esto está efectivamente resuelto ahora.

Todas las herramientas mencionadas están disponibles en el repositorio Git .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X