Ich bin versehentlich auf diese Antwort gestoßen, aber falls jemand neugierig ist, hier eine Antwort, die durch Experimente gestützt wird.
Die kurze Version
Bonusfrage: Kann ich ein md(4)
RAID-Array aus Blockgeräten ungleicher Größe erstellen ? Ja, aber das RAID-Array hat die Größe des kleinsten Blockgeräts (zuzüglich einiger Overheads für die eigene Verwaltung). Wenn die Gerätegrößen nicht innerhalb von 1% voneinander liegen, erhalten Sie eine Warnung.
Frage 1: Kann ich einem vorhandenen md(4)
RAID-Array ein Gerät hinzufügen, das kleiner ist als das kleinste aktuelle Mitglied? Nein Entschuldigung. mdadm
wird sich weigern, dies zu tun, um Ihre Daten zu schützen.
Frage 2: Können Sie die Größe eines vorhandenen MD-Arrays ändern? Ja (lesen Sie die mdadm
Manpge!), Aber es kann die Mühe nicht wert sein. Sie müssen alles sichern, dann die Größe des Inhalts des RAID-Geräts und dann die Größe des Geräts selbst ändern - all dies ist sehr anfällig für Fehler, Fehleinschätzungen und andere Dinge, die Sie Ihre Daten kosten (schmerzhafte Erfahrung beim Sprechen). .
Es ist das Risiko und den Aufwand nicht wert. Wenn Sie einen neuen, leeren Datenträger haben, können Sie die Größe wie folgt ändern und auch zwischen einer und zwei Kopien aller Ihrer Daten jederzeit intakt halten (vorausgesetzt, Sie haben RAID1 mit zwei Datenträgern):
- Erstellen Sie ein neues
md(4)
Array (eine Festplatte fehlt).
- Erstellen Sie die Struktur des Array-Inhalts neu (Crypto, LVM, Partitionstabellen, beliebige Kombinationen davon, je nachdem, was auf Ihrem Boot schwimmt).
- Kopieren Sie die Daten von der vorhandenen Festplatte auf die neue.
- Starten Sie mit der neuen Festplatte neu.
- Löschen Sie die Partitionstabelle der alten Festplatte (oder setzen Sie den
md(4)
Superblock auf Null ). Erstellen Sie bei Bedarf die erforderlichen Partitionen, die dem Schema auf der neuen Festplatte entsprechen.
- Fügen Sie die alte Festplatte dem neuen Array hinzu.
- Warten Sie, bis die Array-Mitglieder synchronisiert sind. Kaffee trinken. Fliegen Sie nach Lateinamerika und pflücken Sie Ihre eigenen Kaffeebohnen. :) (Wenn Sie in Lateinamerika leben, fliegen Sie stattdessen nach Afrika).
Hinweis: Ja, dies ist die gleiche Technik, die 0xC0000022L in seiner Antwort beschrieben hat.
Frage 3. Was ist, wenn das Laufwerk 1 GB kurz ist? :) Mach dir keine Sorgen. Möglicherweise ist Ihr Ersatzlaufwerk größer. In der Tat lohnt es sich bei einer Strategie wie oben, bei jedem Ausfall billigere größere Laufwerke zu kaufen (oder ein billigeres Upgrade). Sie können ein progressives Upgrade erhalten.
Experimenteller Beweis
Versuchsaufbau
Lassen Sie uns zunächst einige Blockgeräte vortäuschen. Wir werden /tmp/sdx
und /tmp/sdy
(jeweils 100M) und /tmp/sdz
(99M) verwenden.
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
Dies stellt drei Dateien als drei Loopback - Block - Geräte: /dev/loop0
, /dev/loop1
und /dev/loop2
, Mapping sdx
, sdy
und sdz
jeweils. Lassen Sie uns die Größen überprüfen:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
Wie erwartet haben wir zwei Loop-Geräte mit genau 100 MB (102400 KiB = 100 MiB) und eines mit 99 MB (genau 99 × 1024 1K-Blöcke).
Erstellen eines RAID-Arrays aus Geräten mit identischer Größe
Hier geht:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
Überprüfen Sie die Größe:
sudo grep md100 /proc/partitions
9 100 102272 md100
Dies ist precicely , was wir erwarten: ein Blick auf die mdadm Handbuch erinnert uns , dass die Version 1.2 Metadaten 128K nehmen: 128 + 102272 = 102400. Nun wollen wir es in der Vorbereitung für den zweiten Versuch zu zerstören.
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
Erstellen eines RAID-Arrays aus ungleich großen Geräten
Dieses Mal werden wir das Small Block-Gerät verwenden.
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.
Nun, wir wurden gewarnt, aber das Array wurde gemacht. Lassen Sie uns die Größe überprüfen:
sudo grep md100 /proc/partitions
9 100 101248 md100
Was wir hier bekommen, sind 101.248 Blöcke. 101248 + 128 = 101376 = 99 × 1024. Der verwendbare Speicherplatz ist der des kleinsten Geräts (plus 128 KB RAID-Metadaten). Lassen Sie uns für unser letztes Experiment noch einmal alles zusammenfassen:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
Und schließlich: Hinzufügen eines kleineren Geräts zu einem laufenden Array
Lassen Sie uns zunächst ein RAID1-Array mit nur einer der 100M-Festplatten erstellen. Das Array wird herabgesetzt, aber das interessiert uns nicht wirklich. Wir wollen nur ein gestartetes Array. Das missing
Schlüsselwort ist ein Platzhalter mit der Aufschrift "Ich habe noch kein Gerät für Sie, starte das Array jetzt und füge es später hinzu".
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
Überprüfen wir noch einmal die Größe:
sudo grep md100 /proc/partitions
9 100 102272 md100
Sicher genug, es ist 128K kurz von 102400 Blöcken. Hinzufügen der kleineren Festplatte:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
Boom! Es lässt uns nicht, und der Fehler ist sehr klar.