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 btrfs
einem 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 single
Modus 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
?
dconvert=single
nur ein Teil das tut, was ich befürchtet habe, wird die bekannte gute Kopie gelöscht. :(Antworten:
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/sda
denen eine fehlerhaft und eine andere/dev/sdc
bekanntermaßen fehlerfrei ist :/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.Nun, da Ihr Array nicht gemountet ist, führen Sie Folgendes aus:
echo 1 | sudo tee /sys/block/sda/device/delete
Ersetzen
sda
durch 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.
-o degraded
mode ein.sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint
. Dadurch werden die Speicherbereiche auf dem als funktionierend bekannten Laufwerk neu organisiert und insingle
(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.sudo btrfs device remove missing /mountpoint
das 'fehlende' fehlerhafte Gerät entfernen.sudo btrfs balance start -mconvert=dup /mountpoint
, um die Redundanz der Metadaten wiederherzustellen. Dies dauert auf meinem System einige Minuten.single
Modus, und alle Redundanzen sind entfernt.Fehlerbehebung
quelle
,soft
nacheinanderconvert=
, um Blöcke zu überspringen, die bereits das Zielprofil haben (das sollten alle sein).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:
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.
Welches gab mir einen Fehler.
Hier ist der Fehler von dmesg:
Das ist also das Finale, das funktioniert hat:
Hoffentlich hilft das jemand anderem.
quelle
btrfs replace
.devid=
-sconvert
System-Chunks konvertieren möchten.|
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)