Come correggere il settore MBR da 512 byte su un disco di settore di 4096 byte?

Aggiornamento finale:

Sapevo già cosa wherevo fare per risolvere questo problema; Non sapevo come farlo. Speravo che ci sarebbe stato un attrezzo pronto per farlo automaticamente – ma non potevo trovare nessuno. Accetto la risposta di Rod perché, nonostante non risolve direttamente il mio problema, dà un ottimo background sulla questione della dimensione del settore e mi ha dato fiducia che il problema era veramente l'allineamento e l'indirizzamento delle partizioni. Per coloro che vengono a questa domanda avendo lo stesso problema, leggerlo accuratamente e con attenzione, compresi i commenti, prima di fare niente.


All'inizio

Ho avuto un computer e ho bisogno di più spazio Ho comprato una nuova unità da 500 GB e un recinto USB. Presto ho notato che se ho partizionato l'unità sul contenitore e spostato sul computer, non riconoscere le partizioni (e viceversa). Credevo fosse un problema con l'armadio e non mi preoccupavo.

Poi, tragedia

Un giorno meraviglioso, il mio computer ha deciso di non accendere più. Scopri la scheda madre (unbrandata, solo una grande MADE IN CINA printingta su di esso) è morta. L'ho usata come file server e che l'unità da 500 GB è ora piena di dati che non posso permettermi di perdere. Sono rotto ora e non posso permettermi un nuovo computer, quindi la mia unica speranza era la recinzione USB "difettosa".

L'investigazione

Armato di diverse distribuzioni Linux, di un computer porttile, di VirtualBox e del recinto, ho fatto un'analisi forense sull'argomento. La dimensione della dimensione della partizione dmesg era al di là della fine del drive. Così sono andato attraverso i datasheets del disco rigido, i settori calcolati contano da zero, i drive testati manualmente con dd, e tutto sembrava OK, fino a quando ho sparato su fdisk e mi ha detto:

Note: Sector size is 4096 (not 512). 

Quanto modesto di fdisk. Questa "nota" era la radice di tutti i problemi. Dopo alcuni più sfacciati queste conclusioni sono state disegnate:

  • La custodia USB non è difettosa.

  • Il controller SATA sulla scheda madre ora morta è quello che era alless "strano". Non ha segnalato settori di 4096 byte al sistema operativo, quindi il sistema operativo creato felicemente la MBR utilizzando indirizzi di settore a 512 byte.

  • Ora, quando cerco di accedere alla partizione, il sistema operativo tenta di utilizzare gli indirizzi basati su 512 byte su un'unità a 4096 byte e, naturalmente, non functionrà.

La domanda

  • Quindi, come posso correggere gli indirizzi nel MBR in modo che siano validi in una dimensione del settore di 4096 byte, a parte la modifica manuale del MBR su un editor esadecimale e

  • Le partizioni non sono allineate per i settori di 4096 byte. C'è qualche attrezzo disponibile per allinearli, oltre a copiare e uscire da un'altra unità? (Non ho unità di ricambio), o dovrò creare uno strumento che "sposta" i dati al lato un po 'di pezzi alla volta? Le partizioni sono ext3.

Grazie!

Aggiornare:

Ho scoperto che c'è un modo intelligente per usare dd per spostare la partizione in posto in questa domanda: Come spostare una partizione in GNU / Linux? Ma non so se lavorerà su una fetta di un settore, però. Non posso provarlo adesso ma farò quando ho un po 'di tempo.

Aggiornamento 2:

Così ho allineato correttamente la partizione usando il metodo sopra e ho modificato manualmente l'MBR su un editor esadecimale. Non appena ho ricollegato l'HDD, la partizione del boom è montata automaticamente! Non lo consiglio comunque, ci sono stati errori di I / O durante il process e avrei potuto perdere tutto, vedi commento sulla risposta di Rod. Per l'altra partizione non prendo dei rischi e utilizzerò un vecchio disco rigido e allineerò i pezzi alla volta copiando i dati e incollandolo in una posizione diversa.

Le questioni di size settoriali stanno diventando piuttosto complesse. Fino alla fine del 2009, la maggioranza dei dischi rigidi utilizzava settori di 512 byte e questo era il caso. Alla fine del 2009, i produttori di dischi hanno iniziato a introdurre i cosiddetti dischi Advanced Format (AF), che utilizzano settori di 4096 byte. Questi primi dischi AF (e, AFAIK, tutti i dischi AF oggi) presentano un'interface al computer che mostra each settore fisico di 4096 byte suddiviso in otto settori logici da 512 byte. Questa conversione consente agli strumenti più vecchi, inclusi molti BIOS, costruiti con assunzioni da 512 byte, per continuare a lavorare. Non so se il tuo disco utilizza l'AF o no, ma in entrambi i casi utilizza quasi certamente una dimensione del settore logico di 512 byte, il che significa che l'interface con il sistema operativo dovrebbe utilizzare settori di 512 byte.

Le complicazioni sono alcune custodie per dischi USB. Alcune di queste casse fanno il contrario di quanto fa l'AF: prendono otto settori di dischetto e fasciarli in un nuovo settore di 4096 byte. Non sono sicuro di quale ragione sia dietro questa mossa, ma un vantaggio pratico è che i dischi più grandi di 2TiB possono essere utilizzati con il vecchio sistema di partizionamento MBR. Uno degli svantaggi principali è che un disco partizionato in una di queste casse non può essere utilizzato direttamente o in un recinto che non faccia questo tipo di traduzione. Allo stesso modo, un disco preparato senza questa traduzione non può essere utilizzato quando viene trasferito in una tale custodia. Si noti che questo problema va ben oltre il MBR stesso; il disco potrebbe identificare la prima partizione iniziando dal settore (512 byte) 2048, ma se il sistema operativo wheresse cercare il settore (4096 byte) del settore 2048, non avrebbe trovato l'inizio di quella partizione! Hai affrontato questo problema. In quanto tale, il tuo pensiero iniziale che è il difetto dell'involucro USB è più vicino al marchio del tuo pensiero più recente che la tua scheda madre lo ha messo in su. Non ho mai sentito parlare di una scheda madre che traduce la dimensione del settore in questo modo. (Alcuni dispositivi hardware RAID lo fanno però.)

Non conosco un modo per forzare Linux per regolare l'idea della dimensione del settore, ma se si dispone di spazio su disco sufficiente, fare una copia di disco a basso livello su un altro disco può aiutare. Per esempio:

 dd if=/dev/sdb of=~/image.img 

Questo copierà il disco da /dev/sdb (il disco USB, regola come necessario) al file ~/image.img . È quindi ansible utilizzare il seguente script per montare le partizioni dell'image:

 #!/bin/bash gdisk -l $1 > /tmp/mount_image.tmp let StartSector=`egrep "^ $2|^ $2" /tmp/mount_image.tmp | fmt -u -s | sed -e 's/^[ \t]*//' | head -1 | cut -d " " -f 2` let StartByte=($StartSector*512) echo "Mounting partition $2, which begins at sector $StartSector" mount -o loop,offset=$StartByte $1 $3 rm /tmp/mount_image.tmp 

Salvare lo script come, ad esempio, mount_image e utilizzarlo come questo:

 ./mount_image ~/image.img 2 /mnt 

Questo monterà la partizione 2 di image.img a /mnt . Si noti che lo script si basa su gdisk fdisk ( gdisk ) , che la maggior parte delle distribuzioni include in un pacchetto denominato gptfdisk o gdisk .

A lungo andare, una soluzione migliore è trovare un modo per colbind il disco che non farà la traduzione a livello di settore. Una connessione diretta a una nuova scheda madre dovrebbe fare il trucco; o probabilmente troverai un recinto esterno che non fa la traduzione. Infatti, alcune coperture effettuano la traduzione su porte USB, ma non su porte eSATA, quindi se la tua custodia ha una port eSATA, puoi provare a utilizzarlo. Mi rendo conto che queste soluzioni sono probabilmente a costi di denaro, che dici che non hai, ma forse puoi scambiare il tuo recinto di traduzione per uno che non fa la traduzione.

Un'altra opzione che mi viene da fare è provare a utilizzare una macchina virtuale come VirtualBox. Un tale strumento potrebbe assumere una dimensione del settore di 512 byte quando si accede al dispositivo a dischi, eliminando effettivamente la traduzione; o potrebbe essere ansible copiare il contenuto del disco (come in dd if=/dev/sdc of=/dev/sdb ) all'interno della macchina virtuale, che potrebbe copiare il contenuto con la compressione, consentendo così l'image di adattarsi a less disco spazio rispetto all'originale consuma.

Questo script generalizzava la proposta di Rod Smith, quando si dispone di un raid o di un crypto. Nessuna garanzia. Sentitevi liberi di migliorare! (Aggiornato con le ultime notizie su mdadm)

 #!/bin/sh # # This script solve the following problem: # # 1. create a GPT partition on a large disk while attached directly via SATA # when the device present itself with 512 bytes of block size: # sd 3:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB) # # 2. try to use a SATA to USB adapter like ID 067b:2773 Prolific Technology, Inc. # this present the device with 4096 bytes of block size: # sd 19:0:0:0: [sdc] 732566646 4096-byte logical blocks: (3.00 TB/2.72 TiB) # # 3. The kernel is unable to read correctly the partition table with # the USB adaper. # # # With the current tools (kernel and gdisk) in debian wheezy is # possible to use losetup to remap the partitions to loop devices so # you can use them as usual with any filesystem, raid or crypto # # I still do not know if this issue is originated by the adapter or by # the disk and if there are any others workarounds. # # Known version of the software: # $ apt-show-versions linux-image-3.2.0-4-amd64 # linux-image-3.2.0-4-amd64/wheezy uptodate 3.2.54-2 # $ apt-show-versions gdisk # gdisk/wheezy uptodate 0.8.5-1 attach_device() { device="$1"; MYTMPDIR=`mktemp -d` trap "rm -rf $MYTMPDIR" EXIT # gdisk on the device use the 4096 sector size # but we need to force it to 512 # this is a knwon workaround from http://superuser.com/a/679800 # basically we make a copy of the gpt partition table on a file dd if="/dev/$device" bs=16384 count=1 of="$MYTMPDIR/gpt" 2> /dev/null # we extract the offset and the size of each partition # # FIXME: the "+ 1" seems strange, but it is needed to get the same # size value from: # # blockdev --getsize64 # # without the "+ 1" some funny things happens, for example # you will not be able to start a receachzed md device: # # md: loop1 does not have a valid v1.2 superblock, not importing! # md: md_import_device returned -22 # # even if # # mdadm --examine /dev/loop1 # # does not complaint gdisk -l \ "$MYTMPDIR/gpt" 2> /dev/null | \ awk '/^ *[0-9]/ {printf "%.0f %.0f\n", $2 * 512, ($3 - $2 + 1) * 512}' > $MYTMPDIR/offset-size # we create a loop device with the give offset and size while read line; do offset=$(printf "$line" | cut -d ' ' -f 1); size=$(printf "$line" | cut -d ' ' -f 2); losetup --verbose --offset "$offset" --sizelimit "$size" `losetup -f` /dev/$device; done < $MYTMPDIR/offset-size; } detach_device() { device="$1"; for loopdevice in `losetup -a | grep "$device" | cut -d : -f 1`; do losetup --verbose --detach "$loopdevice"; done; } usage() { cat <<EOF Usage: - $0 -h to print this help - $0 sda to attach the gpt partitions of sda - $0 -d sda to detach the gpt partitions of sda EOF } detach=0; while getopts hd action do case "$action" in d) detach=1;; h) usage;; esac done shift $(($OPTIND-1)) if [ $# -ne 1 ]; then usage; fi if [ "x$detach" = "x0" ]; then attach_device $1; else detach_device $1; fi 

Un altro modo piuttosto diretto per farlo è quello di utilizzare la function di salvataggio di parted. Ciò richiede di creare una nuova etichetta del disco, per cui comport rischi. Parted agisce direttamente sul disco in modo da effettuare i backup necessari prima di eseguire partizionati. Inizia quindi:

 parted /dev/sdb 

parted ti dirà qualcosa lungo queste righe quando si cerca di leggere un disco con dimensione di settore diversa da quella con cui è stata creata la tabella delle partizioni:

 Error: /dev/sdb: unreceachsed disk label 

Utilizza mklabel per creare un nuovo MBR o GPT in base a quanto precedentemente utilizzato

 (parted) mklabel New disk label type? mbr 

Quindi eseguire salvataggio per trovare la vecchia partizione

 (parted) rescue Start? 0 End? 4001GB Information: A ext4 primary partition was found at 1049kB -> 2000GB. Do you want to add it to the partition table? Yes/No/Cancel? y 

Ripetere il process di salvataggio se si dispone di più partizioni. Sei finito.

Ho avuto questo problema quando ho rimosso un disco da 4 TB da un recinto esterno WD My Book. Il problema è:

  1. la tabella di partizione MBR è distriggersta per un fattore di 8 e
  2. la tabella di partizione MBR non può gestire> 2TB quando la dimensione del settore è 512.

Soluzione: riscrivere la tabella delle partizioni in un GPT, convertendo i valori per utilizzare settori di 512 byte.

Nel mio caso la partizione ha iniziato su un offset di 1MB e terminato (~ 856kB) prima della fine del disco. Questo è buono perché poi ha consentito l'MBR + GPT (17408 byte) prima della partizione e del GPT di backup (16896 byte) alla fine del disco.

Ho fatto immagini di entrambe le regioni solo nel caso (utilizzando dd).

Ho notato l'output di fdisk -l /dev/sde .

Ho usato gdisk per eliminare la prima partizione. Se vuoi, puoi fare come ho fatto e cambiare il valore di allineamento a 8 (4096) per utilizzare il maggior spazio ansible. Poi ho creato una nuova partizione con l'inizio al 2048 e la fine alla fine del disco. Farò crescere il file system più tardi.

Fortunatamente, la modifica della dimensione del settore non influisce sul file system, LVM o LUKS.