Ho trovato questa risposta per errore, ma nel caso qualcuno fosse curioso, ecco una risposta supportata da esperimenti.
La versione breve
Domanda bonus: posso creare un md(4)
array RAID da dispositivi a blocchi di dimensioni diverse? Sì, ma l'array RAID avrà le dimensioni del dispositivo a blocchi più piccolo (oltre ad alcune spese generali per le proprie pulizie). Se le dimensioni del dispositivo non sono entro l'1% l'una dall'altra, viene visualizzato un avviso.
Domanda 1: posso aggiungere a un md(4)
array RAID esistente un dispositivo più piccolo del membro corrente più piccolo? No scusa. mdadm
rifiuterà di farlo per proteggere i tuoi dati.
Domanda 2: puoi ridimensionare un array md esistente? Sì (leggi la mdadm
manpge!), Ma potrebbe non valere la pena. Dovrai eseguire il backup di tutto, quindi ridimensionare i contenuti del dispositivo RAID, quindi ridimensionare il dispositivo stesso: tutto ciò è piuttosto soggetto a errori, calcoli errati e altre cose che ti costeranno i tuoi dati (esperienza dolorosa nel parlare) .
Non vale il rischio e lo sforzo. Se si dispone di un nuovo disco vuoto, ecco come ridimensionarlo e mantenere sempre intatte tra una e due copie di tutti i dati (supponendo che si disponga di un RAID1 a 2 dischi):
- Crea un nuovo
md(4)
array su di esso (con un disco mancante).
- Ricrea la struttura del contenuto dell'array (Crypto, LVM, tabelle delle partizioni, qualsiasi combinazione degli stessi, qualunque sia il galleggiante della tua barca).
- Copia i dati dal disco esistente in quello nuovo.
- Riavvia, utilizzando il nuovo disco.
- Cancella la tabella delle partizioni del vecchio disco (o azzera il
md(4)
superblocco). Se necessario, creare le partizioni richieste in modo che corrispondano allo schema sul nuovo disco.
- Aggiungi il vecchio disco al nuovo array.
- Attendere la sincronizzazione dei membri dell'array. Bevi un caffè. Vola in America Latina e scegli i tuoi chicchi di caffè, del resto. :) (Se vivi in America Latina, vola invece in Africa).
Nota: sì, questa è la stessa tecnica 0xC0000022L descritta nella sua risposta.
Domanda 3. Cosa succede se il disco è corto 1G? :) Non preoccuparti. È probabile che l'unità sostitutiva sarà più grande. In effetti, con una strategia come sopra, paga per ottenere unità più grandi più economiche ogni volta che si guasta (o per un aggiornamento più economico). È possibile ottenere un aggiornamento progressivo.
Prova sperimentale
Setup sperimentale
Innanzitutto, falsifichiamo alcuni dispositivi a blocchi. Useremo /tmp/sdx
e /tmp/sdy
(ogni 100 /tmp/sdz
M) e (99 M).
cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99 # Here's a smaller one!
sudo losetup -f sdz
Tale articolo stabilisce tre file come tre dispositivi a blocchi di loopback: /dev/loop0
, /dev/loop1
e /dev/loop2
, per la mappatura sdx
, sdy
e sdz
rispettivamente. Controlliamo le dimensioni:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Come previsto, abbiamo due dispositivi loop di esattamente 100M (102400 KiB = 100 MiB) e uno di 99M (esattamente 99 × 1024 blocchi da 1K).
Creazione di un array RAID da dispositivi di dimensioni identiche
Ecco qui:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Controlla le dimensioni:
sudo grep md100 /proc/partitions
9 100 102272 md100
Questo è esattamente ciò che ci aspettiamo: uno sguardo al manuale di mdadm ci ricorda che i metadati della versione 1.2 occupano 128 KB: 128 + 102272 = 102400. Ora distruggiamolo in preparazione per il secondo esperimento.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Creazione di un array RAID da dispositivi di dimensioni diverse
Questa volta useremo il dispositivo a blocchi piccoli.
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.
Bene, siamo stati avvertiti, ma l'array è stato realizzato. Controlliamo le dimensioni:
sudo grep md100 /proc/partitions
9 100 101248 md100
Quello che arriviamo qui è 101.248 blocchi. 101248 + 128 = 101376 = 99 × 1024. Lo spazio utilizzabile è quello del dispositivo più piccolo (più i metadati RAID 128K). Abbassiamo di nuovo tutto per il nostro ultimo esperimento:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
E infine: aggiungere un dispositivo più piccolo a un array in esecuzione
Innanzitutto, creiamo un array RAID1 con solo uno dei dischi da 100M. L'array verrà degradato, ma non ci interessa davvero. Vogliamo solo un array avviato . Le missing
parole chiave sono un segnaposto che dice "Non ho ancora un dispositivo per te, avvia subito l'array e ne aggiungerò uno più tardi".
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Ancora una volta, controlliamo le dimensioni:
sudo grep md100 /proc/partitions
9 100 102272 md100
Abbastanza sicuro, è 128K corto di 102400 blocchi. Aggiunta del disco più piccolo:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Boom! Non ci permetterà, e l'errore è molto chiaro.