Migrare l'immagine del disco grezzo su LAN


8

Ecco la mia situazione:

  • Due server dedicati nello stesso datacenter con Gigabit Ethernet tra di loro.
  • Entrambi i server dedicati sono stati avviati in un ambiente di salvataggio basato su Debian Squeeze con l'aggiunta di strumenti e utilità aggiuntivi. Inoltre un sacco di spazio tmp (32 GB di RAM su entrambe le scatole) per scaricare software, installare pacchetti e / o compilare secondo necessità.
  • Entrambi i server dedicati hanno circa 3 TB di spazio utilizzabile.
  • Il server "sorgente" ha 4 dischi da 1,5 TB in Hardware RAID-10 con un controller Adaptec a 4 porte.
  • Il server "destinazione" ha 2 dischi da 3 TB in RAID-1 hardware con un controller di porta Adaptec 2 - stessa generazione dell'altro, ma un numero diverso di porte.
  • Il numero di blocchi utilizzabili /dev/sdadifferisce di meno di 10 MB, ma l'array del server di destinazione è per qualche motivo più piccolo di alcuni mega.
  • Entrambi gli array RAID sono configurati per utilizzare l'intera superficie del disco di tutti i dischi costituenti per creare un unico volume RAID.
  • Il sistema operativo si avvia in modalità MBR; non viene utilizzato l'avvio UEFI.

Cosa voglio fare:

  • Copia, a livello di blocco, l'intera immagine del sistema operativo (questa è costituita solo dal bootloader GRUB2 nella tabella delle partizioni GPT, / partizione di avvio e / partizione) dal server "sorgente" al server "destinazione".
  • Se possibile , la copia dovrebbe avvenire "live": ciò significa che non ho spazio sufficiente per memorizzare un file corretto dell'immagine del disco sul lato di destinazione, a meno che non stia scompattando l'immagine del disco sul disco rigido come copia sta avvenendo . La connessione Ethernet Gigabit tra i server è abbastanza affidabile che mi sento a mio agio con questo, e ovviamente funzionerò fscksu entrambe le estremità (sorgente e destinazione) per verificare che il filesystem sia OK prima e dopo il trasferimento.
  • Se possibile , non trasferire blocchi sulla rete, che non sono utilizzati dai filesystem costituenti in ciascuna partizione (tutte le partizioni sono formattate come ext4). Questo perché oltre il 50% del disco "sorgente" è spazio libero nella /partizione.
  • Regola le dimensioni della /partizione in modo che, quando viene copiata, venga ridimensionata per adattarsi alle dimensioni appena più piccole del disco di destinazione.
  • Una volta che la copia ha esito positivo, montare ciascun volume e correggere i riferimenti agli IP statici per riflettere gli IP del nuovo server. (Può farlo bene anche senza ulteriore aiuto)

Le mie domande:

  • Dovrei prima calcolare la differenza (in byte) tra le dimensioni di /dev/sdasu ciascun server e quindi utilizzare e2resizeper ridurre in modo non distruttivo la dimensione della /partizione sul lato di origine in modo che si adatti allo spazio del lato di destinazione?
  • Dovrei eseguire ddsul dispositivo a blocchi non elaborati, /dev/sdadall'origine alla destinazione (sopra ssh), o devo creare un layout di partizione equivalente sulla destinazione ed eseguire ddsu ogni partizione ? Si noti che la gestione di una partizione alla volta mi lascia il problema del bootloader, ma se non lo faccio una partizione alla volta, è ddnecessario sapere di interrompere il trasferimento dei dati una volta che ha scritto quanti byte quanti la destinazione può contenere (che si spera che "chiuda" la fine della /partizione sull'ultimo blocco, che è logicamente "alla destra di" tutte le altre partizioni nel layout della partizione del sorgente).

Qualche misc. specifiche:

  • Il sistema operativo host sulla casella dei sorgenti è Ubuntu Server 12.04 con diversi guest OpenVZ
  • Poiché entrambe le caselle vengono avviate in soccorso, l'accesso diretto al disco è possibile senza aspettarsi alcuna modifica ai dati sottostanti dal sistema operativo in esecuzione.

Hai esattamente bisogno di copiare i blocchi usati dai dispositivi o solo dai filesystem OS?
Andrew,

Risposte:


6

Questo è disordinato, ma fattibile.

Presumo che /sia acceso /dev/sda3e /bootacceso /dev/sda1.

  1. Riduci il filesystem sul vecchio server alla dimensione minima possibile.

    oldserver # resize2fs -M /dev/sda3
    
  2. Partiziona il disco del nuovo server con dimensioni identiche /boot, spazio di swap e nuova /partizione (e qualsiasi altra cosa di cui hai bisogno).

    newserver # parted /dev/sda
    
  3. Copia il file system /e /boot.

    oldserver # dd if=/dev/sda1 | ssh root@newserver "dd of=/dev/sda1"
    oldserver # dd if=/dev/sda3 | ssh root@newserver "dd of=/dev/sda3"
    

    Poiché la partizione sul nuovo server sarà leggermente più piccola di quella sul vecchio server, No space left on devicealla fine riceverai un messaggio spurio . Tuttavia, poiché hai ridotto il filesystem al passaggio 1, questo non ha importanza.

  4. Ridimensiona il filesystem sul nuovo server in base alle dimensioni della partizione.

    newserver # resize2fs /dev/sda3
    
  5. Installa GRUB sul nuovo disco.

    newserver # mount /dev/sda3 /mnt
    newserver # mount /dev/sda1 /mnt/boot
    newserver # mount -o bind /dev /mnt/dev
    newserver # mount -o proc proc /mnt/proc
    newserver # chroot /mnt /bin/bash
    
    newserver(chroot) # grub-install /dev/sda
    newserver(chroot) # exit
    
  6. Termina il resto delle tue correzioni (indirizzo IP, ecc.).

Probabilmente puoi trovare un modo per evitare di copiare lo spazio libero della partizione, ma probabilmente ci vorrà più tempo per la ricerca che per copiare tutto ...


Eccezionale! Sto bene copiando lo spazio libero della partizione perché queste istruzioni soddisfano tutti i miei altri criteri. Anche se, non sarebbe solo il ridimensionamento del file system e la stessa partizione sul oldservereliminare la necessità di copiare tutto lo spazio libero? Non mi interessa /bootperché è così piccolo, ma /almeno potrei farlo, giusto? Basta impostare il settore di fine della partizione in modo che sia uguale a quale settore resize2fsimposta la fine del settore FS. Bene, settore, blocco ... probabilmente blocco . Ma grazie per questo! Questo è fantastico!
allquixotic,

Sì, se riduci anche le dimensioni della partizione, eviteresti un sacco di copie. Ciò potrebbe farti risparmiare un paio d'ore ... Lascerei un po 'di gioco, nel caso in cui la mia matematica fosse leggermente off.
Michael Hampton,

Ciò eliminerebbe anche lo spurio / spaventoso "Nessuno spazio lasciato sul dispositivo", poiché ridimensionerà /dev/sda3fino a circa 1,3 TB e lo copierà in una partizione sulla destinazione che prevede di contenere circa 2,9 TB.
allquixotic,

Ci vorrà un po ' . Realizzato che ho una porta gigabit con un'allocazione di 100 Mbit / s. Una schifezza.
allquixotic,

5

Avrei mkfsnuovi filesystem sul nuovo server, quindirsync li dal vecchio server. È riavviabile, coerente e ogni file è facilmente verificabile individualmente. Dove stai scartando sezioni inutilizzate del filesystem (non una copia forense), non vedo alcun motivo per non usare questo metodo. Dovresti rieseguire GRUB, ma non dovrebbe essere una sfida.

Spiegare una copia non elaborata che è a conoscenza del file system mi richiederebbe un po 'di tempo, quindi a meno che tu non commenti il ​​motivo per cui la mia soluzione rsync non funziona mi risparmierò la digitazione.


Penso che partimagepossa fare copie grezze che sono consapevoli del filesystem, ma non supporta ext4. Quindi esiste un'opzione ... rsyncsembra più bella come opzione, purché preservi tutti i controlli di accesso discrezionali (a la chmod) e possa copiare in modo pulito su
collegamenti

Secondo la risposta di Jeff. È possibile trasferire il layout della partizione con sfdisk -d / dev / sda | destinazione ssh "sfdisk / dev / sdb". Crea i tuoi filesystem e trasferiscili con 'rsync -a -e "ssh -c arcfour" / mnt / root @ destination: / mnt /'. Successivamente seguire il passaggio 5 della risposta di Michael Hampton per rendere avviabile la destinazione.
Tim Haegele,

1

Se vuoi davvero trasferire i dati a livello di dispositivo a blocchi, posso pensare a un trucco piuttosto utile che stavo usando per migrare i server con tempi di inattività minimi.

Il fatto è che è possibile creare un mirror degradato sul server di origine con la partizione dati che è l'unica metà attiva del mirror, quindi esportare la partizione di destinazione dal secondo server tramite AOE (suppongo che entrambi i server si trovino nello stesso dominio di trasmissione). Al server di origine, quindi, connetti il ​​dispositivo di blocco di rete al tuo mirror degradato in modo da iniziare la ricostruzione. Attendi il completamento della ricostruzione, ferma il mirror, rimuovi il dispositivo esportato AOE e sei a posto.

Seguiranno altri dettagli (cercherò di mantenerlo breve).

componenti:

  • mdadmcon la sua modalità build (mirror ad hoc senza metadati);
  • vblade per esportare il dispositivo a blocchi come dispositivo di rete AOE;
  • aoe-tools per l'importazione del dispositivo di blocco della rete AOE.

Devi creare una tabella delle partizioni sul tuo server di destinazione, quindi ridurre la partizione di origine in modo che si adatti alla destinazione. Puoi facilmente installare GRUB sul tuo nuovo MBR; la sincronizzazione di sole partizioni sulla tabella delle partizioni appena creata è un po 'meno soggetta a errori.

Sul lato ricevente devi esportare la tua partizione con lo vbladestrumento, sul server di origine puoi vedere i dispositivi esportati dopo l'installazione aoe-tools(esegui aoe-discoverquindi cerca i /dev/ether/dispositivi).

Quindi dovresti creare il dispositivo raid1 sul server di origine con l' unità di origine :

mdadm --build /dev/md0 -n2 -l1 --force /dev/sda

Dopodiché puoi esaminare il mirror di nuova costruzione:

mdadm --detail /dev/md0
cat /proc/mdstat

A questo punto è possibile collegare in modo sicuro la partizione di destinazione esportata a questo mirror:

mdadm /dev/md0 --add /dev/ether/eX.Y

Quindi controlla i progressi della sincronizzazione:

watch -n5 cat /proc/mdstat

Al termine della sincronizzazione, basta arrestare il mirror: mdadm --stop /dev/md0sul server di origine, terminare il vbladeprocesso sul server di destinazione, installare GRUB sul secondo server, modificare gli indirizzi IP, ecc.

In realtà, con questo trucco è possibile spostare il server tra le scatole quasi dal vivo, con tempi di inattività solo per riavviare le scatole sincronizzate.


Per motivi di prestazioni, ti suggerisco anche di aumentare l'MTU del tuo link (o impostare una VLAN separata con jumbo frame abilitato, se possibile).

Nota, puoi anche usare qualcosa come nbd-server/ nbd-client(o anche iSCSI, se lo desideri in modo approssimativo) come alternativa ad AOE, ma AOE ( vblade+ aoe-tools) ha un'interfaccia molto semplice e una prestazione eccezionale (nessun sovraccarico TCP / IP),


Aggiungo anche che la sincronizzazione a livello di dispositivo a blocchi a volte può essere MOLTO più veloce di passare file su file con rsync, specialmente quando si hanno milioni (letteralmente) file relativamente piccoli sul filesystem.
artyom,

mdadm? Sto usando l'hardware RAID. E non ho idea di cosa sia AOE e non ho mai usato iSCSI. Non penso che i miei server si trovino nello stesso dominio di trasmissione, solo nello stesso centro dati. Ci sono almeno uno o due switch tra i server.
allquixotic,

Penso che sia un'ottima idea! Ma come gestisce le diverse dimensioni dei dischi?
Tim Haegele,

@allquixotic, tuttavia, puoi provare il seguente schema che sostituisce AOE con nbd (dispositivo di blocco di rete, fornito da nbd-servere nbd-clientpacchetti). mdadmviene utilizzato solo per sincronizzare due dispositivi a blocchi, nessun metadata viene scritto in buildmodalità, quindi è possibile utilizzarlo sopra qualsiasi dispositivo a blocchi (deve essere prima smontato). Il fatto è che di solito installo un nuovo sistema su un degradato raid mdadm1 anche se ho un raid hardware sottostante, in questo modo posso applicare la tecnica descritta senza dover smontare le partizioni, riducendo i tempi di inattività della migrazione al singolo tempo di riavvio.
artty
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.