Linux BTRFS - Konvertierung in Single mit ausgefallenem Laufwerk


12

Ein kleiner Teil der Hintergrundgeschichte:

Ich habe ein kleines Mediendateisystem, auf dem ich verschiedene Filme und Fernsehsendungen speichere, die für mein HTPC-Setup verwendet werden. Dies wurde ursprünglich mit btrfseinem externen 1-TB-WD-Laufwerk eingerichtet.

Später habe ich beschlossen, ein anderes Laufwerk zu kaufen, um diesem Dateisystem RAID1-Spiegelungsfunktionen zu verleihen. Dieses Laufwerk ist ein Seagate Barracuda (2 TB, BARRACUDA 7200.14 FAMILY). Leider war dies keine gute Wahl für die Fahrt. Das Laufwerk entwickelte in Kürze große Mengen an Lesefehlern, obwohl BTRFS diese korrigieren konnte.

In letzter Zeit hat die Anzahl der Lesefehler von diesem Laufwerk zugenommen, und sein Zustand hat sich stetig verschlechtert. BTRFS stürzt jetzt ab:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

Ich möchte das fehlerhafte Laufwerk aus dem RAID1-Array entfernen und auf keine Redundanz auf einem einzelnen Laufwerk zurückgreifen. Leider scheint es an der Dokumentation zu fehlen, wie dies getan werden kann.

Mir ist bekannt, dass man folgendes ausführen kann:

sudo btrfs balance start -dconvert=single /media

das Datenprofil in den singleModus zu konvertieren , aber ich bin nicht sicher, wo die Daten platziert werden. Da eines der Laufwerke ausfällt, möchte ich sicherstellen, dass BTRFS nicht alle Daten auf dem guten Laufwerk pflichtgemäß löscht, und eine einzelne Kopie auf dem schlechten Laufwerk ablegen - stattdessen möchte ich einfach tun, als ob das andere Laufwerk nie existiert hätte (wie in, konvertiere zurück zu meinem alten Setup)

Das geht nicht:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

Was soll ich tun? Hilfe wäre sehr dankbar.

TL; DR: hat mit 1 Laufwerk in BTRFS begonnen single, ein weiteres Laufwerk hinzugefügt, es erstellt RAID1, ein anderes Laufwerk ist jetzt fehlerhaft. Wie kann ich mit nur einem Laufwerk (INSBESONDERE dem als gut bekannten) zurückkehren single?


Update: Wenn Sie versuchen, dass dconvert=singlenur ein Teil das tut, was ich befürchtet habe, wird die bekannte gute Kopie gelöscht. :(
eeeeeta

Antworten:


11

Okay, ich habe es mit Hilfe dieses Trello-Links herausgefunden . Für den Fall, dass jemand anderes dies tun möchte, ist hier das Verfahren.

Verfahren

Von einem RAID1-Array mit zwei Festplatten, von /dev/sdadenen eine fehlerhaft und eine andere /dev/sdcbekanntermaßen fehlerfrei ist :

  1. Deaktivieren Sie die automatische Bereitstellung dieses Arrays in /etc/fstab, und starten Sie den Computer neu . Grundsätzlich möchten wir, dass btrfs vergisst, dass dieses Array existiert, da es einen Fehler gibt, bei dem versucht wird, eines der Laufwerke zu verwenden, wenn es nicht angeschlossen ist.
  2. Nun, da Ihr Array nicht gemountet ist, führen Sie Folgendes aus:

    echo 1 | sudo tee /sys/block/sda/device/delete

    Ersetzen sdadurch den fehlerhaften Gerätenamen. Dadurch wird die Festplatte heruntergefahren (dies sollte in dmesg überprüft werden) und der Kernel kann nicht mehr auf sie zugreifen.

    Alternativ : Nehmen Sie das Laufwerk einfach vor dem Booten aus dem Computer! Ich habe mich nicht für diese Methode entschieden, da das oben Genannte für mich gut funktioniert.

  3. Hängen Sie Ihr Array mit -o degradedmode ein.
  4. Starten Sie eine Auswuchtoperation mit sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Dadurch werden die Speicherbereiche auf dem als funktionierend bekannten Laufwerk neu organisiert und in single(Nicht-RAID) konvertiert . Dies dauert fast einen Tag, abhängig von der Geschwindigkeit Ihres Laufwerks und der Größe Ihres Arrays. (Meins hatte ~ 700 GiB und wurde mit einer Rate von 1 1GiB Chunk pro Minute neu ausbalanciert.) Glücklicherweise kann dieser Vorgang angehalten werden und das Array bleibt online, während er auftritt.
  5. Sobald dies erledigt ist, können Sie sudo btrfs device remove missing /mountpointdas 'fehlende' fehlerhafte Gerät entfernen.
  6. Beginnen Sie eine zweite Neuverteilung mit sudo btrfs balance start -mconvert=dup /mountpoint, um die Redundanz der Metadaten wiederherzustellen. Dies dauert auf meinem System einige Minuten.
  7. Sie sind fertig! Ihr Array ist jetzt im singleModus, und alle Redundanzen sind entfernt.
  8. Nehmen Sie Ihr fehlerhaftes Laufwerk nach draußen und schlagen Sie es mit einem Hammer.

Fehlerbehebung

  • Hilfe, btrfs hat versucht, auf meine fehlerhafte Festplatte zu schreiben, ist fehlerhaft ausgefallen und hat sie nur zum Lesen gezwungen!
    • Haben Sie Schritt 1 befolgt und einen Neustart durchgeführt, bevor Sie fortfahren? Wahrscheinlich denkt btrfs immer noch, dass das Laufwerk, das Sie heruntergefahren haben, vorhanden ist. Durch einen Neustart vergisst btrfs alle Fehler und lässt Sie fortfahren.

2
Das geht nicht. Ich bin auf Ubuntu 16.04 (Kernel 4.4). dmesg sagt "fehlende Geräte (1) überschreiten das Limit (0), beschreibbare Mount ist nicht erlaubt". So bin ich beim "mount -o
degraded

@HelloSam: Vielleicht ist das ein Fehler. Siehe bbs.archlinux.org/viewtopic.php?id=210541
jaltek

Erwägen Sie das Hinzufügen ,softnacheinander convert=, um Blöcke zu überspringen, die bereits das Zielprofil haben (das sollten alle sein).
Tom Hale

9

Danke für deinen Beitrag. Ich hatte die Idee, dass ich den RAID-Test durchführen, das Laufwerk aus meinem Hotswap-Schacht herausnehmen, ein anderes Laufwerk verwenden und dann das RAID-Laufwerk wieder hineinstecken könnte. Rückblickend war dies eine schlechte Idee, und jetzt brauche ich meinen Hotswap-Schacht.

Folgendes habe ich gefunden. Als root:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

Notieren Sie sich die für jedes Laufwerk aufgelistete Devid. Man for Brtrfs Balance führte mich zu der Devid-Option, nahm ein paar Versuche, um herauszufinden, wie die Filter funktionierten (zunächst versuchen, devid = / dev / sdb1). Ihr erster Versuch sieht also so aus.

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Welches gab mir einen Fehler.

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

Hier ist der Fehler von dmesg:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

Das ist also das Finale, das funktioniert hat:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Hoffentlich hilft das jemand anderem.


Wenn Sie nur ein Laufwerk durch ein anderes ersetzen möchten, können Sie dies mit tun btrfs replace.
dma_k

Das hat vor ungefähr einem Jahr bei mir funktioniert, aber heute nicht. Es ist egal, wonach ich devid=
tippe

Überprüfen Sie auch, ob Sie -sconvertSystem-Chunks konvertieren möchten.
Tom Hale

Verwenden Sie |statt, ,wie in der Manpage für Balance angegeben:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.