'dd' può essere usato per clonare su un HDD più piccolo, sapendo che le partizioni dovranno essere modificate?


14

Ho usato ddper clonare dischi in questo modo:

 dd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc,noerror,sync

Ed ha sempre funzionato bene. Tutti i documenti su "dd" fanno fatica a ricordare che il disco di destinazione deve avere le stesse dimensioni o più grande della fonte. Deve assolutamente essere vero?

Ora capisco perfettamente che se clonerò su un disco più piccolo non posso aspettarmi che qualsiasi partizione che sia anche parzialmente "fuori limite" sulla destinazione sia intatta.

Tuttavia, sapendo benissimo che avrei bisogno di modificare le mie partizioni sul bersaglio in seguito, eliminando quelle "fuori limite", potrei ancora usare "dd" per fare una copia della forza bruta della sorgente fino ai limiti del dimensione fisica del bersaglio? O "ridurrebbe" l'obiettivo a una catasta di rottami fumanti quando raggiungesse il limite delle sue dimensioni ;-)

A proposito, alla ricerca di questo, ho visto i valori raccomandati per bs=tutto, bs=1024fino a bs=32M, cosa è veramente meglio?


Nota, se è utile usare il dd calcolo della dimensione ottimale del blocco
Wilf

Risposte:


7

L'unità fisica non dovrebbe iniziare a fumare, almeno, ma è molto probabile che il tuo filesystem non funzioni più (intendo, il filesystem di destinazione; se hai appena copiato e non hai toccato nulla nella fonte, la fonte stessa dovrebbe andare bene ). I dati all'interno di una partizione non sono necessariamente allocati in ordine crescente. Alcuni potrebbero essere alla fine della partizione anche se la partizione non è piena (in realtà, penso che ciò accada in modo deterministico con alcuni filesystem, ma non ne so abbastanza per entrare nei dettagli). I dati potrebbero essere essenziali per l'integrità del filesystem. Quindi ti consiglio vivamente di non fare affidamento su tale copia.

Se vuoi fare questa copia, devi prima restringere la partizione con qualche strumento che sia consapevole della sua struttura interna ed è in grado di rimappare tutto in ordine in una partizione più piccola. Quindi puoi fare la copia. gpartedè una buona interfaccia GUI per fare questo tipo di cose.

Per il bsvalore, di solito l'idea migliore è quella di avere un paio di test prima di iniziare la copia reale. Ci sono alcuni strumenti che ti aiutano ad automatizzare questo controllo, ma non ricordo il nome. Nella mia esperienza, la gamma migliore è di solito tra 4M e 16M. Più in alto di quello non guadagni più molto. Ma dipende da molte cose, inclusi i dischi stessi. Ad esempio, raramente ho lavorato con dischi di fascia alta reali, che potrebbero essere adatti a valori più alti a causa della maggiore velocità e dimensione della cache.

MODIFICA Se una partizione è interamente copiata, è possibile utilizzarla senza problemi. Tuttavia, come altri hanno sottolineato, devi anche essere sicuro che la tabella delle partizioni sia intatta (almeno, le voci pertinenti). Con le quattro partizioni primarie di MBR non ci sono problemi, poiché sono descritti nei primi 512 byte del disco. Le partizioni logiche sono descritte in tutta la partizione estesa, quindi le voci potrebbero andare perse (ma descriverebbero le partizioni che andrebbero comunque perse). Con GPT c'è una copia della tabella delle partizioni sia all'inizio che alla fine del disco. Perdi il secondo, ma puoi ricostruirlo dal primo. Naturalmente è consigliabile farlo al più presto; altre risposte erano più precise al riguardo.


Si prega di consultare la domanda modificata :)
Ray Andrews,

1
@rayandrews Non so quale aggiornamento ti aspetti, ma sostanzialmente ddcopia i byte. Inizierà dal byte 0 e continuerà a copiare fino a quando qualcosa (nel tuo caso, fine dei media sulla destinazione) lo interromperà. Questo ti lascerà con una tabella delle partizioni che specifica un'unità più grande della realtà e delle partizioni esterne all'unità ... ma se lo risolvi, dovrebbe andare bene. Anche se probabilmente sarebbe più semplice usare dd per partizione per copiare i dati. [Ti lascerà anche con tutti i normali problemi di dd, come UUID duplicati]
derobert

Quello che mi piace è che crea ed etichetta le partizioni e i file system mentre procede, risparmiando molto tempo. Proprio per quanto riguarda gli UUID.
Ray Andrews,

1
come si ripristina la seconda tabella gpt?
user230910

2

Sebbene all'inizio la "sfida" proposta possa sembrare difficile, non fattibile o sembrare ingenua come alcuni hanno commentato, non lo è. L'idea principale alla base dell'utilizzo di dd per migrare da un disco più grande a uno più piccolo è perfettamente soddisfacente e offre vantaggi per la migrazione dei dati. Naturalmente, è necessario disporre di spazio libero sufficiente affinché i dati occupati si inseriscano nel disco di destinazione.

L'idea è quella di pensare nel trovare ogni partizione individualmente e non l'intero disco contemporaneamente come inizialmente proposto. È possibile ottenere ancora di più: le partizioni che verrebbero troncate possono anche essere migrate in sicurezza con un piccolo aiuto degli strumenti di ridimensionamento del filesystem. In effetti, questo tipo di migrazione è interessante per preservare i matadata del file system e gli attributi di file estesi che non possono essere facilmente copiati con strumenti come cp, rsync, pax, che operano nel livello del file system e non bloccano il livello del dispositivo. L'uso di dd elimina la necessità di reinstallare il sistema operativo o di dover rietichettare l'FS per evitare problemi con SELinux.

Di seguito è quello che faccio di solito per svolgere attività simili:

1) Innanzitutto è necessario ridurre i file system all'interno delle partizioni interessate che verrebbero troncate. Per questo, usa lo strumento resize2fs (supponendo che stiamo parlando di un ext2 / ext3 / ext4 fs - anche altri FS moderni hanno strumenti di ridimensionamento per lo stesso scopo). Nota che sebbene - per ovvi motivi - un filesystem non possa essere più grande della partizione in cui risiede, può tranquillamente essere più piccolo. Il trucco di sicurezza qui è quello di ridurre "più del necessario". Ad esempio: immagina di avere un filesystem da 1 TB che desideri migrare su un'unità da 500 Gig. In questo caso, suggerisco di ridurre la fs, diciamo, a 450 Gig (devi avere abbastanza spazio libero per questo, ovviamente, cioè lo spazio attualmente occupato in questo filesystem non può superare i 450 Gig). Lo spreco apparente di 50 Gig di spazio verrà corretto dopo la migrazione dei dati.

2) Partizionare il disco di destinazione con la geometria appropriata considerando i suoi vincoli di spazio;

3) dd i dati usando il / i dispositivo / i di partizione e non il dispositivo disco (ovvero, utilizzare dd if=/dev/sda# of=/dev/sdb#per ogni partizione anziché utilizzare if=/dev/sda of=/dev/sdb). NOTA: sda e sdb qui sono solo esempi; NOTA IMPORTANTE: quando si passa da un dispositivo di partizione più grande a uno più piccolo, dd si lamenterà del tentativo di scrivere post alla fine del dispositivo a blocchi, va bene poiché i dati del filesystem sarebbero stati copiati completamente prima di raggiungere quel punto. Per evitare tale messaggio di errore, è possibile specificare la dimensione della copia utilizzando bs=e i count=parametri in modo che corrispondano alla dimensione del filesystem ridotta, ma ciò richiederà alcuni (semplici) calcoli, ma se fatto in modo errato può rischiare i dati.

4) Dopo aver inserito i dati, ridimensionare nuovamente i rispettivi filesystem all'interno delle partizioni di destinazione usando resize2fs. Questa volta non specificare la nuova dimensione del filesystem. Se eseguito senza una specifica di dimensione, resize2fs espande il filesystem in modo che occupi la dimensione massima consentita, quindi, in questo caso, il filesystem da 450 Gig crescerà di nuovo per occupare l'intera partizione da 500 Gig e nessun byte verrà sprecato. (L'approccio "Riduci più del necessario" ti evita di specificare erroneamente dimensioni errate e di rischiare i tuoi dati. Nota che le unità GB vs GiB possono essere complicate).

Nota per operazioni più complesse: se si dispone di un boot manager che si intende copiare, il che è molto probabile che sia il caso, è possibile utilizzare i primi KB del disco utilizzando il dispositivo del disco anziché i dispositivi di partizione (come dd if=/dev/sda of=/dev/sdb bs=4096 count=5), quindi riconfigurare la geometria in / dev / sdb (che conterrà temporaneamente una geometria non valida per la nuova unità ma un gestore di avvio intatto e valido). Procedere infine utilizzando i dispositivi di partizione come descritto sopra per eseguire il dd di una partizione alla volta. Ho fatto operazioni come questa molte volte. Molto recentemente, ho eseguito con successo una migrazione complessa durante l'aggiornamento da un HDD contenente una combinazione di installazioni MacOSX e Linux a un SDD più piccolo nel mio MacMini6,2. In questo caso, ho dovuto avviare Linux da un disco esterno, ho creato il bootmanager, ho eseguito gdisk per riparare il GPT nel nuovo disco e infine ho scaricato ogni partizione contenente i filesystes appena ridotti. (Si noti che lo schema di partizione GPT mantiene due copie della tabella delle partizioni, una all'inizio e un'altra alla fine del disco. gdisk si lamenta molto perché non riesce a trovare la seconda copia del PT e perché le partizioni superano le dimensioni del disco, ma risolve correttamente il problema della copia del PT dopo aver ridefinito la geometria del disco). Questo è stato un caso molto più complesso, ma vale la pena menzionarlo perché illustra che questo tipo di operazione è anche perfettamente fattibile.

In bocca al lupo! ... e, soprattutto, ricordare di eseguire il backup di tutti i dati importanti prima di questo tipo di operazione. Un errore e puoi sicuramente danneggiare i tuoi dati in modo irrecuperabile.

E nel caso non avessi enfatizzato abbastanza: eseguire il backup dei dati prima della migrazione! :)


Ottima spiegazione, grazie!
nirvana-msu,

1

Se vuoi montare un'auto in un passaggio più stretto di 20 cm rispetto all'auto e tagli i 20 cm di sinistra dell'auto, l'auto funzionerà comunque? Probabilmente no.

Se si copia l'inizio di un disco su un altro disco e si abbrevia la copia perché il disco di destinazione è più piccolo, il risultato non funzionerà. Anche se ci fosse abbastanza spazio per adattare tutti i file sul disco di destinazione, tagliare dopo N byte dall'inizio del disco non ti darà un filesystem funzionante.

Se il disco è diviso in partizioni in stile PC (GPT o MBR), funzioneranno tutte le partizioni che si adattano interamente alla destinazione. C'è un'eccezione: con le partizioni MBR, se le partizioni logiche non sono numerate nell'ordine del disco, non appena la catena lascia l'area di destinazione, le partizioni non saranno più elencate. (Se non lo capisci, questo è un motivo in più per non fare una copia parziale del disco.) Avrebbe molto più senso copiare le partizioni che vuoi mantenere, invece di copiare dall'inizio e finire con qualsiasi cosa si adatti . La partizione parzialmente copiata alla fine non sarà utilizzabile.

Se il disco o una partizione parziale è un volume fisico LVM e si crea una copia parziale di quel volume fisico, non si può essere sicuri di ottenere dati utili dal risultato.

Se si desidera copiare solo alcuni dei dati da un disco di grandi dimensioni su un disco più piccolo, creare partizioni sul disco più piccolo. Se vuoi copiare una partizione in una partizione della stessa dimensione, puoi farlo con cat. Se vuoi copiare una partizione in una partizione più piccola, crea un filesystem sulla partizione di destinazione ed esegui una copia a livello di file con qualcosa come cp -ao pax -rw -pe -t.

Puoi usare ddinvece che catse sei un masochista. ddha una strana sintassi ed è generalmente più lenta rispetto acat meno che non trovi la giusta dimensione del buffer. Non esiste un singolo valore ottimale per la dimensione del buffer, dipende dalle caratteristiche dell'hardware. Se la dimensione è troppo piccola, ddperderai tempo a fare molti piccoli trasferimenti. Se la dimensione è troppo grande, ddperderai tempo a leggere completamente un buffer prima di iniziare a scrivere quello successivo. La dimensione ottimale per un trasferimento da disco a disco è in genere di pochi megabyte (1024 byte è ridicolmente piccolo). catsceglierà una taglia decente senza alcuno sforzo da parte tua.


Sì, sto bene perdendo le ultime partizioni. Su tutti i miei dischi, tutte le cose importanti rientrano sempre nelle dimensioni anche del più piccolo dei miei dischi. Le partizioni oltre a ciò sono sempre non essenziali. La cosa con 'cat' è che non creerà partizioni o un MBR (a meno che non mi sbagli)
Ray Andrews,

@rayandrews Se esegui catl'intero disco, creerà le stesse partizioni (con un avvertimento per le partizioni MBR, vedi la mia modifica). Lo stesso vale per l' dduso, ddè solo un modo complicato di fare cat. Se si esegue catsu una partizione, ovviamente non creerà partizioni; usa fdisk / gdisk / parted / ... per questo.
Gilles 'SO- smetti di essere malvagio' il

Molto interessante. OK, mostrami un comando di esempio, quindi lo proverò e se va bene questa è la soluzione migliore.
Ray Andrews,

@rayandrews Un comando di esempio per fare cosa?
Gilles 'SO- smetti di essere cattivo'

Solo un comando di esempio che usa 'cat' per clonare un disco. Rendi una nuova risposta in modo che io possa accettarla.
Ray Andrews,

0

Vorrei condividere la mia esperienza con questo argomento, se questo dovesse rivelarsi utile per un altro lettore. Recentemente ho usato DDRESCUE per recuperare il primo 1/3 di una partizione NTFS da un disco rigido non funzionante e ho ricostruito con successo il segmento ripristinato della partizione su un disco rigido più piccolo, salvando così i file catturati (e perdendo il resto). Di seguito sono riportati i passaggi che ho fatto in tal modo (sicuramente un approccio HACKSAW !!) ...

Il disco rigido di origine consisteva di 750 GB formattati in NTFS con un file MBR. L'avevo usato solo poche volte per eseguire il backup dei file, quindi la maggior parte dei file era all'inizio del disco, circa 160 GB di valore. Un membro della famiglia ha gettato il disco rigido (montato esternamente) sul pavimento - dopo non ha mai funzionato correttamente! Usando ddrescue (scrupolosamente) sono stato in grado di recuperare gran parte dell'inizio dell'unità. A causa del danno fisico, si è spento molto spesso durante tutto il processo ...

Avevo un piccolo disco rigido per laptop disponibile da 150 GB (montato esternamente), sul quale ho estratto i dati di ddrescue direttamente. In alternativa, avrei potuto estrarre i dati in un file di immagine e successivamente montare il file, tuttavia ho pensato che scrivere i dati direttamente su un disco rigido fosse più semplice.

Il trucco chiave per il salvataggio è stato modificare manualmente sia i dati del settore di avvio MBR sia quelli NTFS sul disco rigido di ripristino. Senza farlo, il disco rigido non viene riconosciuto da alcun sistema operativo. Non sono stato in grado di trovare un programma adatto in Linux per farlo, quindi mi sono rivolto a Windows. Esiste un pratico pacchetto chiamato Strumenti di supporto di Windows, non più gestito ma comunque utile (vedi link sotto)! Lo strumento che ho usato per modificare la partizione è Disk Probe. Assicurati di conoscere il valore del settore finale del tuo disco rigido (ho usato fdisk -l in Ubuntu)

https://en.wikipedia.org/wiki/Windows_Support_Tools

Usando una buona calcolatrice e un po 'di creatività, ho caricato e montato il disco rigido su Disk Probe in Windows e modificato i valori del settore finale. Nel MBR è stato necessario modificare due serie di valori, ovvero a) il settore finale della partizione del disco rigido eb) il settore finale della partizione NTFS. Nel settore di avvio NTFS è stato necessario modificare il valore dei settori totali della partizione. In ogni caso il valore numerico è stato diminuito per corrispondere alla "dimensione" ridotta del disco rigido più piccolo (i settori finali sono passati da 750 GB a 150 GB). Fai clic sulla scheda Visualizza per modificare questi valori.

Ecco un'immagine di Disk Probe in azione che modifica i dati del settore di avvio NTFS Strumenti di supporto di Windows - Sonda disco

Dopo aver modificato i campi di cui sopra, Windows ha riconosciuto la partizione come una partizione valida anche se danneggiata. Ho inserito il prompt dei comandi ed ho eseguito il programma Windows Chkdsk sul disco rigido danneggiato (chdsk D :). È stato emozionante vedere la partizione tornare alla vita, file per file! Il programma ha ricostruito la tabella delle partizioni e ha rimappato con successo tutti i file che erano stati copiati dal disco rigido danneggiato. I file che erano fuori portata (non copiati) non sono stati trovati e quindi eliminati.

La parte successiva non capisco il motivo, poiché Windows ha ricostruito con successo il disco rigido da 150 GB con file inclusi. Tuttavia Windows nativamente non è stato in grado di aprire la partizione del disco rigido per la visualizzazione dei file (si è verificato un errore). Tuttavia Ubuntu in soccorso! Ho riavviato Ubuntu, ho montato il disco rigido esterno e senza problemi sono comparsi tutti i file recuperati!

Spero che questo metodo di seghetto a mano per recuperare file da un disco rigido di grandi dimensioni su un disco rigido più piccolo si rivelerà utile a qualche altra anima povera oltre a me stesso. Saluti!


1
Hai chiaramente pensato molto a questa risposta. Sfortunatamente, non risponde davvero alla domanda. " ddrescuenon è un derivato di dd, né è ddin alcun modo correlato , tranne per il fatto che entrambi possono essere utilizzati per copiare dati da un dispositivo all'altro. La differenza è che ddrescue utilizza un sofisticato algoritmo per copiare i dati da unità guaste causandole danno possibile ". - Wikipedia. Inoltre, la tua risposta sembra focalizzata principalmente su un ambiente operativo Windows, che non è una configurazione tipica qui
Fox,

1
Come l'interrogante originale, trovo ancora l'esperienza di Dan più utile, è bello sapere cosa si può fare in una situazione disperata, anche se ovviamente è periferico a questo thread esatto, ma non essere troppo severo.
Ray Andrews,

0

Devi prima restringere le partizioni sul sorgente (o eliminare quei fuori campo).
Di conseguenza dd, probabilmente dovrai riparare la tabella delle partizioni usando gdisk /dev/sd<target>
e la sequenza di tasti per riparare la tabella è v r d w
che ti suggerisco di ridimensionare le partizioni un po 'più piccole del necessario e di espanderle nuovamente alla dimensione completa del disco di destinazione.
(Questa risposta si basa sulla mia esperienza personale durante la clonazione del mio HDD su un SSD più piccolo)


+1. Questo metodo funziona anche per me: la clonazione funziona quando tutte le partizioni si adattano all'unità di destinazione :-) Un solo commento: è necessario riparare la tabella delle partizioni di backup di una tabella delle partiiton GUID (GPT), ma se è presente un MSDOS vecchio stile tabella delle partizioni, non esiste una tabella delle partizioni di backup da riparare.
sudodus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.