Ist es möglich, das Ext4-Dateisystem und das zugrunde liegende RAID-5-Array auf sichere Weise zu verkleinern?
Ich möchte mein 15 TB/6-Laufwerk-RAID-Array verkleinern, das ein ext4-Dateisystem enthält.
Bevor ich das auf einem Live-System mache, habe ich beschlossen, es in einer Testumgebung auszuprobieren. Ich habe ein Skript geschrieben, das den Lebenszyklus von RAID+Dateisystem simuliert (Assemble, MKFS, Resize2FS, Shrink, ...), aber in einigen Fällen beschädigt es das Dateisystem. Das Skript wurde auf zwei verschiedenen Distributionen ausgeführt (eine davon war Centos-8).
Ich habe versucht, die Fehler zu verstehen und sofern ich nichts übersehen habe, weiß mdadm während des RAID-Verkleinerungsprozesses (mdadm --grow) nichts über das Ext4-Dateisystem und es scheint nicht möglich zu sein, diesem Tool dabei zu helfen, sich ordnungsgemäß zu verhalten.
In meinem Szenario ein Skript zum Simulieren eines Prozesses:
- wählt eine ZufallszahlAnzahl_Geräte(zwischen 5 und 10) wird gewählt - das bestimmt die Anzahl der Geräte in unserem Testarray
- wählt eine ZufallszahlGerätegröße(zwischen 300 und 350) - Größe (in MiB) eines einzelnen Geräts
- kreiert und montiert/dev/md0- ein RAID 5-Array (in meinem Fall waren es 0,90 Metadaten) - Größe eines Arrays istArraygröße = ($Anzahl_Geräte-1)*$Gerätegröße
- erstellt ext4-Dateisystem auf/dev/md0und montiert es an/Min.
- kopiert eine Referenzdatei (in meinem Fall war es eines der Kernel-Images aus /boot)$Anzahl_Gerätemal zu/Min.(um Daten zur Überprüfung der Integrität des Dateisystems zu haben) - das Dateisystem hat etwa 80 % freien Speicherplatz zur Verfügung
Das Dateisystem wird ausgehängt, mit fsck (
e2fsck -f
) überprüft, dann verkleinert (entwederresize2fs -M
auf die Mindestgröße oderreisze2fs /dev/md0 {calculated_size}
) und erneut mit fsckDas Skript wartet, bis der Mdadm-Neuaufbauvorgang abgeschlossen ist (indem es /proc/mdstat betrachtet).
- Die neue Arraygröße wird berechnet:neue_Array_Größe=($Anzahl_Geräte-2)*$Gerätegröße
- Der Festplattenausfall wird simuliert
mdadm --manage /dev/md0 --fail /dev/loop3
durchmdadm --manage /dev/md0 --remove /dev/loop3
- wartet, bis der Umformungsprozess abgeschlossen ist
Sobald der Umformungsprozess abgeschlossen ist, wird /dev/loop3 als entfernt und ein anderes Loop-Gerät (z. B. /dev/loop2) als Ersatz markiert.
- Der Prozess ermittelt das Ersatzteil und fügt es erneut einem Array hinzu (
mdadm --manage /dev/md0 --remove /dev/loop2
gefolgt vonmdadm --manage /dev/md0 --add /dev/loop2
) - Skript wartet, bis der RAID-Neuaufbau abgeschlossen ist (beobachtet /proc/mdstat)
In diesem Moment geschieht das Verderben:
- Das Dateisystem wird erneut unter /mnt gemountet.
- Der MD5-Prüfsummenvergleich zwischen Referenzdatei und Kopien auf einem verkleinerten Dateisystem ist für 1-2 Dateien entweder erfolgreich oder schlägt fehl
- Das Dateisystem wird ausgehängt, einem fsck-Vorgang unterzogen (
e2fsck -f
), auf das Maximum vergrößert (resize2fs) und erneut einem fsck-Vorgang unterzogen. - Korruption ist immer noch vorhanden
Mache ich etwas falsch oder wird der RAID-5-Verkleinerungsprozess wirklich nicht unterstützt? Oder liegen die Metadaten der Version 0.90 der Grund?