3 votes

Comment savoir quels fichiers se trouvent entièrement ou partiellement à l'intérieur d'une bande d'une image disque de type sparse bundle ?

J'ai une image avec une erreur dans l'une de ses bandes :

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

La personnalité du système de fichiers de l'image est Sensible à la casse Journaled HFS+ .

Question

Au niveau de HFS Plus :

  • comment puis-je savoir quels fichiers sont entièrement ou partiellement dans cette bande ?

Les noms et les chemins des fichiers seront idéaux.

Contexte

L'erreur est détectée par ZFS et est permanente (je n'ai pas choisi de redondance pour le pool). Système de fichiers twoz est monté par ZEVO.

À la racine du paquet, il n'y a probablement rien pour nous aider :

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;
}

Je m'attends à ce que le bands pour ne rien contenir d'autre que des bandes.

Une expérience avec cat

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

Le résultat est principalement constitué de données binaires et, sans surprise, une erreur d'E/S semble empêcher l'exécution de la commande - j'ai donc abandonné.

Entrecoupé de données binaires, une partie du contenu est lisible par l'homme. Une partie de ce contenu lisible se trouve très certainement dans un fichier ( xulrunner ) qui a subi une erreur d'E/S lorsque j'ai tenté de restaurer les données à partir de l'image disque.

Je préférerais une approche plus directe, qui n'implique pas de tenter de lire toutes les données du volume.


Je me demande si une réponse faisant autorité à cette question impliquera la connaissance du pilote d'image disque ou d'un cadre privé. Dans OS X 10.8.2 par exemple :

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

/System/Library/PrivateFrameworks/DiskImages.framework

2voto

Joe G Points 21

En supposant que vous puissiez joindre le sparsebundle, vous devriez pouvoir le faire en utilisant fileXray, qui coûte 79 $ pour une licence d'utilisation personnelle et se trouve à l'adresse suivante http://filexray.com

fileXray est capable de "cartographier à l'envers le stockage des volumes", ce qui signifie qu'il peut "déterminer à quel fichier appartient un bloc ou un octet donné sur un volume". L'option pertinente est --who_owns_byte, expliquée à la page 172 de la documentation, qui peut être trouvée à http:// filexray.com / fileXray.pdf (lien cassé car il ne me laisse pas poster plus de deux liens).

Or, selon la page 54 de la documentation, "il est important de noter qu'un vidage de périphérique doit être "brut", c'est-à-dire qu'il ne doit pas nécessiter de transformations supplémentaires telles que la décompression ou le décryptage. En d'autres termes, pour qu'un fichier image de disque puisse être utilisé directement par fileXray, l'image ne doit pas être compressée, cryptée ou éparse. fileXray rejettera une telle image." Cependant, il poursuit en disant : "Si vous avez une telle image qui est compressée, cryptée ou éparse, convertissez-la en utilisant le programme de ligne de commande Mac OS X hdiutil, ou attachez-la simplement (éventuellement sans la monter) en utilisant hdiutil et utilisez fileXray sur le périphérique de bloc résultant au lieu du fichier image."

Donc, une fois que vous avez attaché ou monté le sparsebundle, la question est de savoir quel décalage d'octet fournir à l'option --who_owns_byte.

Apple fournit des "routines permettant de manipuler un paquet de données éparses" à l'adresse suivante http://www.opensource.apple.com/source/hfs/hfs-191/CopyHFSMeta/SparseBundle.c

Sur la base de ce code, nous pouvons voir dans la routine doSparseRead que le bandName de la première bande pour un décalage donné est le bandNum sous forme de nombre hexadécimal. En particulier, asprintf(&bandName, "%s/bands/%x", ctx->pathname, bandNum).

Le bandNum est le décalage / blockSize, puisque off_t bandNum = (offset + nread) / blockSize et que nread commence à 0, ce qui tronquera le résultat de la division, donc le décalage devrait être bandNum * blockSize ou bandNum * blockSize + blockSize. Notez que le blockSize est le bandSize, puisque off_t blockSize = ctx->bandSize ;

L'examen de doSparseWrite semble donner la même réponse, puisque off_t bandNum = (offset + écrit) / blockSize ; avec écrit initialisé à 0 et asprintf(&bandName, "%s/bands/%x", ctx->pathname, bandNum) ;

Ce serait formidable si quelqu'un ayant accès à fileXray pouvait essayer cela.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X