
Ich habe ein Btrfs-Dateisystem mit zwei Platten, wobei sich die Daten und Metadaten beide in RAID1 befinden (über die Btrfs-Funktion, nicht über mdraid). Die Platten sind USB3-Laufwerke mit dm-crypt oben drauf. Eine der Platten ist defekt (sie hat mehrere tausend fehlerhafte Sektoren und beim Schreiben kommt es häufig zu Timeouts). Ich habe ein drittes USB-Laufwerk erhalten, um das defekte zu ersetzen. Wie kann ich es ersetzen?
Antwort1
Das hat sich als echte Plage herausgestellt. Zunächst ist es wichtig zu wissen, dass btrfs jetzt einen richtigen Ersetzungsbefehl hat, der viel besser ist als das fehlgeschlagene Hinzufügen und Entfernen von neuen Befehlen.
Partitionieren Sie zunächst die neue Festplatte und richten Sie dm-crypt darauf ein. Fahren Sie fort und entsperren Sie sie.
Wenn es bei Ihrer Festplatte keine Zeitüberschreitung beim Schreiben gibt (die anscheinend jeweils 360 Sekunden dauert!), können Sie Folgendes ganz einfach tun:
btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid \
/dev/mapper/luks-NEW-disk-uuid /mount/path
Dies führt jedoch dazu, dass auf die fehlerhafte Festplatte einigermaßen routinemäßige Schreibvorgänge ausgeführt werden, und wenn diese ein Timeout verursachen, werden Sie etwa 30 Sekunden schnelles Kopieren erleben, gefolgt von 6–12 Minuten Leerlauf, während Sie auf das Timeout warten.
Um Schreibzugriffe darauf zu vermeiden, ist es möglich, mit Device-Mapper einen Snapshot zu erstellen. Lesezugriffe werden auf das zugrunde liegende fehlerhafte Gerät gesendet (auf dem Lesezugriffe meistens kein Problem sind); Schreibzugriffe werden auf den COW-Speicher gesendet. Zunächst benötigen Sie ein ausreichend großes Blockgerät für den COW-Speicher. Ich habe dafür ein neues logisches Volume erstellt ( Watt-sdj1_dmsnap
). Jedes Blockgerät sollte funktionieren – sogar ein Loop-Gerät sollte in Ordnung sein. Ich persönlich schlage ein persistentes Gerät vor, nur für den Fall, dass etwas schiefgeht, aber wenn Sie gefährlich leben und über genügend RAM verfügen, würde auch eine RAM-Disk funktionieren.
Meins würde ~1,7 GB COW-Speicherplatz benötigen (um 2,24 TiB von einem 3-TB-Laufwerk zu verschieben). Ich würde empfehlen, mit dem COW-Speicherplatz großzügig umzugehen; wenn er ausgeht, wäre das wahrscheinlich nicht gut, und Sie können ihn ganz freigeben, wenn Sie fertig sind.
Als Nächstes müssen Sie das Btrfs-Dateisystem aushängen, falls es eingehängt war, und das dm-crypt-Gerät sperren (stoppen). Ich lege den Snapshot unter die Verschlüsselung, da ich nicht möchte, dass unverschlüsselte Daten auf die Festplatte geschrieben werden.
In meinem Fall ist die Partition /dev/sdj1
. Um Fehler zu vermeiden, legen Sie sie zunächst als schreibgeschützt fest:
blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj
(Sie können es später mit zurücksetzen --setrw
.) Nun richten Sie den Snapshot tatsächlich ein:
dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"
Um kurz zu erklären, was das bedeutet: Eine Device-Mapper-Tabelle hat das Format:Start-Sektor Anzahl der Sektoren Zieltyp Zielargumente. Der Startsektor ist 0; die Anzahl der Sektoren entspricht der Größe von sdj1 (wir wollen schließlich das Ganze machen); der Zieltyp ist Snapshot. Das Snapshot-Ziel nimmt mehrere Argumente an:Quelle-Entwickler Kuh-Entwickler Modus Blockgröße. Wir geben ein Quellgerät von an /dev/sdj1
; das COW-Gerät ist das logische Volume, das ich erstellt habe; der Modus PO bedeutetPersistent (Metadaten werden auf die Festplatte geschrieben, so dass sie nach einem Neustart wiederhergestellt werden können) undÖverflow (wenn wir zu viel in den Snapshot schreiben, ist eine Wiederherstellung möglich). Die Blockgröße gibt an, wie granular der Snapshot ist; wenn wir auch nur ein Byte schreiben, wird der gesamte Block um dieses Byte herum kopiert (und verbraucht Speicherplatz im Snapshot). 8 ist 4 KB, es wird also keine Ausrichtungsprobleme geben.
Entsperren Sie nun abschließend das Gerät erneut – aber verwenden Sie statt „unlocking“ „ /dev/sdj1
unlock“ /dev/mapper/sdj_divert
. Mounten Sie anschließend das btrfs-Dateisystem erneut.
Sie können die Snapshot-Nutzung mit prüfen dmsetup status sdj_divert
. Das Ergebnis sollte ungefähr so aussehen (aber mit einer viel niedrigeren Zahl vor dem Schrägstrich):
0 5860524928 snapshot 914216/545259520 3568
Die ersten drei Dinge sind der Startsektor, die Anzahl der Sektoren und der Zieltyp. Die nächste Zahl ist die Anzahl der verwendeten Sektoren (vor dem Schrägstrich) und dann die Anzahl der Sektoren insgesamt (nach dem Schrägstrich). Das ist also ein Bruchteil des verwendeten Speicherplatzes. Die letzte Zahl ist die Anzahl der für Metadaten verwendeten Sektoren, die bereits in der verwendeten Zahl enthalten ist.
Jetzt können Sie endlich den einfachen btrfs replace start
Befehl oben in der Antwort verwenden. Er gibt sofort etwas zurück. Beobachten Sie den Status, indem Sie ausführen btrfs replace status /mount/path
.
Wenn der Austausch abgeschlossen ist, bestätigen Sie, dass das fehlerhafte Gerät aus dem Dateisystem entfernt wurde (z. B. btrfs fi show /mount/path
). Anschließend können Sie das fehlerhafte Laufwerk sperren/schließen und den Snapshot entfernen ( dmsetup remove sdj_divert
). Anschließend können Sie den COW-Speicherplatz freigeben (nachdem Sie ihn gelöscht haben, wenn Sie paranoid sind).
Es gibt noch einen letzten, technisch optionalen Schritt: Mein Ersatzgerät ist größer, aber btrfs nutzt den zusätzlichen Speicherplatz noch nicht. Um ihn für btrfs verfügbar zu machen, suchen Sie in der btrfs fi show
Ausgabe nach dem devid und führen Sie dann aus:
btrfs fi resize DEVID:max /mount/path
das sollte nahezu augenblicklich passieren.