Come dire quali file sono interamente o parzialmente all'interno di una banda di un'immagine di un disco bundle?

3

Ho un'immagine con un errore in una delle sue bande:

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

La personalità del file system dell'immagine è HFS con distinzione tra maiuscole e minuscole .

Domanda

Al livello HFS Plus:

  • come posso sapere quali file sono interamente o parzialmente all'interno di quella banda?

I nomi e i percorsi dei file saranno l'ideale.

Sfondo

L'errore viene rilevato da ZFS ed è permanente (non ho scelto ridondanza per il pool). Il file system twoz è montato da ZEVO.

Alla radice del pacchetto probabilmente non c'è nulla che possa aiutarci:

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

Mi aspetto che la directory bands non contenga nulla tranne le bande.

Un esperimento con cat

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

Il risultato sono principalmente dati binari e, non sorprendentemente, un errore I / O sembra impedire il completamento del comando - così ho abortito.

Intervallato da dati binari, alcuni contenuti sono leggibili dall'uomo. Alcuni di questi contenuti leggibili sono quasi certamente all'interno di un file ( xulrunner ) che ha subito un errore I / O quando ho tentato di ripristinare i dati dall'immagine del disco.

Preferirei un approccio più diretto, che non implicasse il tentativo di leggere tutti i dati dal volume.

Mi chiedo se una risposta autorevole a questa domanda implicherà la conoscenza del driver dell'immagine del disco o di un framework privato. Ad esempio in OS X 10.8.2:

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

/System/Library/PrivateFrameworks/DiskImages.framework

    
posta Graham Perrin 03.03.2013 - 21:05
fonte

1 risposta

2

Supponendo di poter collegare lo sparsebundle, dovresti essere in grado di farlo usando fileXray, che è $ 79 per una licenza d'uso personale e trovata al link

fileXray è in grado di "invertire la memoria del volume della mappa", nel senso che può "determinare a quale file appartiene un determinato blocco o offset di byte su un volume". L'opzione rilevante è - who_owns_byte, spiegata a pagina 172 della documentazione, che può essere trovata all'indirizzo http: // filexray.com / fileXray.pdf (collegamento interrotto perché non mi consente di pubblicare più di due link).

Ora, secondo la pagina 54 della documentazione, "È importante notare che un dump del dispositivo deve essere" raw ", cioè non deve richiedere alcuna trasformazione aggiuntiva come la decompressione o la decifratura. In altre parole, per un file immagine disco da utilizzare direttamente da fileXray, l'immagine non deve essere compressa, crittografata o sparsa. fileXray rifiuterà tale immagine. " Tuttavia, continua dicendo "Se si dispone di un'immagine di questo tipo che è compressa, crittografata o sparsa, convertirla usando il programma della riga di comando di hdiutil di Mac OS X, o semplicemente allegarla (opzionalmente senza montarla) usando hdiutil e usa fileXray sul dispositivo a blocchi risultante invece del file immagine. "

Quindi, una volta che lo sparsebundle è collegato o montato, la domanda è quale offset di byte fornire all'opzione --who_owns_byte.

Apple fornisce "routine per manipolare un fascio sparse" al link

Basandoci su quel codice, possiamo vedere nella routine doSparseRead che il bandName della prima banda per un dato offset è il bandNum come numero esadecimale. In particolare, asprintf (& bandName, "% s / bands /% x", ctx- > pathname, bandNum).

Il bandNum è l'offset / blockSize, poiché off_t bandNum = (offset + nread) / blockSize e nread inizia da 0, che troncerà il risultato della divisione, quindi l'offset dovrebbe essere bandNum * blockSize o bandNum * blockSize + misura del blocco. Nota che blockSize è la dimensione della banda, poiché off_t blockSize = ctx- > bandSize;

Guardare a doSparseWrite sembra dare la stessa risposta, dal momento che off_t bandNum = (offset + scritto) / blockSize; con scritta inizializzata a 0 e asprintf (& bandName, "% s / bande /% x", ctx- > pathname, bandNum);

Sarebbe fantastico se qualcuno con accesso a fileXray potesse provare questo.

    
risposta data 18.04.2013 - 17:46
fonte

Leggi altre domande sui tag