Wie kann ich eine vorhandene Root-Partition raid-spiegeln?

7

Ich möchte meine vorhandene Root-Partition (und einzige Partition auf einer SSD) auf eine andere Festplatte spiegeln. Es sollte eine Art RAID-1 sein, nur asymmetrisch * . Ich weiß, dass es die Option gibt mdadm --write-behind, die es tun sollte.

Ich habe jedoch keine Ahnung, ob es möglich ist, den Kontext der vorhandenen Partition beizubehalten. Ich stelle es mir vor

  • Erstellen Sie die "Slave" -Partition
  • Richten Sie das RAID so ein, dass die Slave-Partition nicht initialisiert wird
  • Lassen Sie es initialisieren, indem Sie die Master-Partition klonen

aber ich bin wahrscheinlich zu optimistisch, nicht wahr?


* Alle Lesevorgänge sollten auf die erste Festplatte zugreifen, und Schreibvorgänge sollten beim Schreiben der ersten Festplatte als abgeschlossen betrachtet werden.

Maaartinus
quelle
1
Ein Freund meines Freundes hat kürzlich alle seine Daten durch Laufen zerstört, mdadm --createwährend er versucht hat, dasselbe zu erreichen. Ich weiß nicht, wie ich es richtig machen soll, aber das ist nicht der Weg.
Stribika
@stribika: Sie können mdadm --createauf einer vorhandenen Festplatte ausgeführt werden, solange Sie eine Superblock-Version auswählen, die bis zum Ende der Festplatte reicht, und das Dateisystem entsprechend verkleinern.
Gilles 'SO - hör auf böse zu sein'
@ Gilles: Ich denke, er hat den verschlechterten Trick nicht gemacht, sondern nur beide Festplatten zum Array hinzugefügt und gehofft, dass es richtig synchronisiert wird.
Stribika

Antworten:

7

Sie können ein mdraid RAID-1-Array erstellen, das mit einer vorhandenen Partition beginnt. Zunächst müssen Sie Platz für den Superblock mdadm schaffen, was bedeutet, dass Sie Ihr Dateisystem ein wenig verkleinern müssen.

Im Moment ist das normale Superblock-Format 0,9 . Der Speicherort liegt zwischen 128 KB und 60 KB vom Ende der Partition entfernt, ist 4 KB lang und beginnt mit einer Adresse, die ein Multible von 64 KB ist. Verkleinern Sie Ihr Dateisystem also um 128 KB oder genauer auf ((device_size mod 64kB) - 1) * 64kB.

Wenn Sie mehr als 2 TB pro Streifen möchten, benötigen Sie das Superblock-Format 1.0 , das noch nicht von allen Distributionen standardmäßig unterstützt wird. Der 1.0-Superblock befindet sich am Ende des Geräts. Ich verstehe, dass Sie Ihr Dateisystem nur um 8 KB verkleinern müssen.

Nachdem Sie das Dateisystem verkleinert haben, können Sie das Array erstellen. Erstellen Sie zunächst ein verschlechtertes Array mit nur den vorhandenen Daten. Stellen Sie sicher, dass das Dateisystem zu diesem Zeitpunkt noch nicht bereitgestellt ist. Für Ihren Anwendungsfall muss sich die Bitmap mit Schreibabsicht auf einer separaten Partition befinden. Verwenden Sie -e 1.0diese Option , um das neuere Superblock-Format der Version 1 zu verwenden.

mdadm --create /dev/md0 -e 0.9 -l 1 -n 2 \
      --write-behind=256 --bitmap=/path/to/bitmap /dev/sda1 missing

Jetzt können Sie das Dateisystem in mounten /dev/md0. Fügen Sie nach Belieben die zweite Festplatte hinzu. Die Daten werden im Hintergrund auf das neue Laufwerk kopiert.

mdadm --add /dev/md0 --write-mostly /dev/sdb1

Ich habe ein gespiegeltes Array wie dieses erstellt, jedoch ohne Rückschreibemodus. Ich glaube nicht, dass der Write-Behind-Modus die Prozedur ungültig machen würde.

Gilles 'SO - hör auf böse zu sein'
quelle
Großartig. Dies würde die Hälfte der Zeit in Anspruch nehmen, die meine Methode benötigt.
Stribika
Kann ich die Schreibabsicht später entfernen?
Lionel
@ Lionel: Ich habe das noch nie selbst versucht, aber die mdadm-Manpage dokumentiert Folgendes: * unter "Für Verwaltungsmodus", das man zurücksetzen kann - meistens mit mdadm --readwrite --re-add /dev/sdb1* unter --bitmap, das man verwenden kann --grow /dev/md0 --bitmap=none. Übrigens scheint das 1.0-Format mittlerweile eher "standardisiert" zu sein.
Blaisorblade
2

Ich habe eine Idee. Ich habe dies mit kleinen Dateisystemen auf Loop-Geräten getestet. Ich empfehle Ihnen, dasselbe zu tun, bevor Sie es selbst ausprobieren. In dieser Antwort ist / dev / sda Ihre Festplatte mit den wichtigen Daten und / dev / sdb ist die neue leere Festplatte.

export DATA_DISK='/dev/sda'
export EMPTY_DISK='/dev/sdb'
  1. Erstellen Sie ein verschlechtertes RAID1-Array von der leeren Festplatte . Das ist wichtig!

    mdadm --create /dev/md0 --level=1 --raid-devices=2 "${EMPTY_DISK}" missing
    
  2. Verkleinern Sie dann das Dateisystem auf der Festplatte, die Sie spiegeln möchten. (Hoffentlich wird es unterstützt.) Dies ist erforderlich, da die RAID-Arrays einen Header haben und das vollständige Dateisystem nicht auf das Array passt.

  3. Kopieren Sie die Daten in das neue verschlechterte Array .

    dd if="${DATA_DISK}" of=/dev/md0 bs=4k
    
  4. Fügen Sie die ursprüngliche Festplatte zum Array hinzu.

    mdadm --manage /dev/md0 --add "${DATA_DISK}"
    
  5. Sie können den Synchronisierungsfortschritt verfolgen.

    watch 'cat /proc/mdstat'
    
Stribika
quelle
Dieses Verfahren kann auf verschiedene Arten optimiert werden (rsync anstelle von Rohkopie, Einstellungen zur Auswahl der Synchronisierungsbandbreite usw.). Eine Seite, die solche Techniken beschreibt, die gut aussehen , ist wiki.archlinux.org/index.php/… , obwohl ich das selbst nicht ausprobiert habe.
Blaisorblade