¿Cómo saber qué archivos están total o parcialmente dentro de una banda de una imagen de disco de paquete disperso?

3

Tengo una imagen con un error en una de sus bandas:

/Volumes/twoz/macbookpro08-centrim.sparsebundle/bands/3252

La personalidad del sistema de archivos de la imagen es HFS + sensible a mayúsculas y minúsculas .

Pregunta

En el nivel HFS Plus:

  • ¿Cómo puedo saber qué archivos están total o parcialmente dentro de esa banda?

Los nombres y las rutas de los archivos serán ideales.

Fondo

El error es detectado por ZFS y es permanente (no elegí redundancia para el grupo). El sistema de archivos twoz está montado por ZEVO.

En la raíz del paquete probablemente no haya nada que nos ayude:

sh-3.2$ sudo ls -ahl /Volumes/twoz/macbookpro08-centrim.sparsebundle
total 8952
drwx------@ 3 root  wheel    10B  3 Mar 19:38 .
drwxr-xr-x  7 root  wheel     7B  9 Dec 17:16 ..
-rw-r--r--  1 root  wheel   499B 30 Dec 12:20 Info.bckup
-rw-r--r--  1 root  wheel   499B 30 Dec 12:20 Info.plist
drwx------  2 root  wheel    26K  3 Mar 08:16 bands
-rw-r--r--  1 root  wheel   445B  3 Mar 06:48 com.apple.TimeMachine.MachineID.bckup
-rw-r--r--  1 root  wheel   445B  3 Mar 06:48 com.apple.TimeMachine.MachineID.plist
-rw-r--r--  1 root  wheel   1.4K  3 Mar 08:20 com.apple.TimeMachine.Results.plist
-rw-r--r--  1 root  wheel    11K  3 Mar 08:20 com.apple.TimeMachine.SnapshotHistory.plist
-rwx------  1 root  wheel     0B  9 Dec 17:16 token
sh-3.2$ sudo defaults read /Volumes/twoz/macbookpro08-centrim.sparsebundle/Info
{
    CFBundleInfoDictionaryVersion = "6.0";
    "band-size" = 8388608;
    "bundle-backingstore-version" = 1;
    "diskimage-bundle-type" = "com.apple.diskimage.sparsebundle";
    size = 821820674048;
}

Espero que el directorio bands no contenga nada excepto bandas.

Un experimento con cat

sudo cat /Volumes/twoz/macbookpro08-centrim.sparsebundle/bands/3252

El resultado es principalmente datos binarios y, como es de esperar, un error de E / S parece impedir la finalización del comando, por lo que aborté.

Intercalado con datos binarios, parte del contenido es legible para humanos. Es probable que parte de ese contenido legible esté dentro de un archivo ( xulrunner ) que sufrió un error de E / S cuando intenté restaurar datos de la imagen del disco.

Prefiero un enfoque más directo, que no implique intentar leer todos los datos del volumen.

Me pregunto si una respuesta autorizada a esta pregunta involucrará el conocimiento del controlador de imagen de disco o un marco privado. En OS X 10.8.2 por ejemplo:

sh-3.2$ hdiutil info
framework       : 344
driver          : 10.7v344

/System/Library/PrivateFrameworks/DiskImages.framework

    
pregunta Graham Perrin 03.03.2013 - 21:05

1 respuesta

2

Suponiendo que puede adjuntar el sparsebundle, debería poder hacerlo usando fileXray, que es de $ 79 para una licencia de uso personal y se encuentra en enlace

fileXray es capaz de "invertir el almacenamiento de volumen del mapa", lo que significa que puede "determinar a qué archivo pertenece un bloque o byte offset de un volumen dado". La opción relevante es --who_owns_byte, explicado en la página 172 de la documentación, que se puede encontrar en http: // filexray.com / fileXray.pdf (enlace roto porque no me permite publicar más de dos enlaces).

Ahora, de acuerdo con la página 54 de la documentación, "Es importante tener en cuenta que un volcado de dispositivo debe ser 'en bruto', es decir, no debe requerir ninguna transformación adicional, como la descompresión o el descifrado. En otras palabras, para una archivo de imagen de disco para ser utilizado directamente por fileXray, la imagen no debe estar comprimida, encriptada o dispersa. fileXray rechazará dicha imagen ". Sin embargo, continúa diciendo: "Si tiene una imagen comprimida, encriptada o dispersa de este tipo, puede convertirla utilizando el programa de línea de comandos hdiutil de Mac OS X o simplemente adjuntarla (opcionalmente sin montarla) usando hdiutil y use fileXray en el dispositivo de bloque resultante en lugar del archivo de imagen ".

Entonces, una vez que tengas el paquete disperso adjunto o montado, la pregunta es qué compensación de bytes se debe proporcionar a la opción --who_owns_byte.

Apple proporciona "rutinas para manipular un paquete disperso" en enlace

Sobre la base de ese código, podemos ver en la rutina doSparseRead que el BandName de la primera banda para un desplazamiento dado es bandNum como un número hexadecimal. En particular, asprintf (& bandName, "% s / bands /% x", ctx- > nombre de ruta, bandNum).

bandNum es offset / blockSize, ya que off_t bandNum = (offset + nread) / blockSize y nread comienza en 0, lo que truncará el resultado de la división, por lo que el offset debería ser bandNum * blockSize o bandNum * blockSize + tamaño de bloque. Tenga en cuenta que blockSize es bandSize, ya que off_t blockSize = ctx- > bandSize;

Mirar en doSparseWrite parece dar la misma respuesta, ya que off_t bandNum = (offset + escrito) / blockSize; con inicializado escrito en 0 y asprintf (& bandName, "% s / bands /% x", ctx- > nombre de ruta, bandNum);

Sería fantástico si alguien con acceso a fileXray pudiera intentarlo.

    
respondido por el Joe G 18.04.2013 - 17:46

Lea otras preguntas en las etiquetas