BTRFS Linux: converti in singolo con unità guasta


12

Una piccola quantità di retroscena:

Ho un piccolo filesystem multimediale, su cui immagazzino vari film e programmi TV che vengono utilizzati per la mia configurazione HTPC. Questo è stato originariamente impostato, utilizzando btrfs, su un'unità esterna WD da 1 TB.

Successivamente, ho deciso di acquistare un'altra unità, per dare a questo filesystem le capacità di mirroring RAID1. Questa unità è una Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILY). Sfortunatamente, questa non è stata una buona scelta di guida. L'unità ha iniziato a sviluppare grandi quantità di errori di lettura a breve, sebbene BTRFS sia stato in grado di correggerli.

Recentemente, la quantità di errori di lettura da questa unità è aumentata, con le sue condizioni in costante peggioramento. BTRFS ora sta iniziando a bloccarsi:

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

Vorrei rimuovere l'unità guasta dall'array RAID1, senza ridondanza su una singola unità. Sfortunatamente, sembra che manchi la documentazione su come farlo.

Sono consapevole che si può eseguire quanto segue:

sudo btrfs balance start -dconvert=single /media

per convertire il profilo dati in singlemodalità, ma non sono sicuro su DOVE verranno posizionati i dati. Poiché una delle unità non funziona, mi piacerebbe essere in grado di garantire che BTRFS non cancelli debitamente tutti i dati sull'unità valida e inserisca una singola copia sull'unità danneggiata, invece, vorrei semplicemente agire come se l'altra unità non fosse mai esistita (come in, riconvertire alla mia vecchia configurazione)

Questo non funziona:

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

Cosa devo fare? L'aiuto sarebbe molto apprezzato.

TL; DR: iniziato con 1 unità in BTRFS single, aggiunta un'altra unità, ce l'ha fatta RAID1, l'altra unità ora si sta guastando, come posso tornare a una sola unità (SPECIFICAMENTE quella conosciuta) con single?


Aggiornamento: provare che dconvert=singleper un pezzo fa solo quello che temevo ed elimina la buona copia conosciuta. :(
eeeeeta,

Risposte:


11

Bene, l'ho capito con l'aiuto di questo link Trello . Nel caso in cui qualcun altro lo voglia fare, ecco la procedura.

Procedura

Da un array RAID1 di due dischi, uno /dev/sdadifettoso e un altro /dev/sdcnoto:

  1. Disabilita il montaggio automatico di questo array in /etc/fstab, riavvia . Fondamentalmente, vogliamo che btrfs dimentichi l'esistenza di questo array, poiché esiste un bug in cui tenterà comunque di utilizzare una delle unità se è scollegata.
  2. Ora che l'array è smontato, eseguire:

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

    sostituendo sdacon il nome del dispositivo difettoso. Questo fa girare il disco (dovresti verificarlo in dmesg) e diventare inaccessibile al kernel.

    In alternativa : basta estrarre l'unità dal computer prima di avviare! Ho scelto di non optare per questo metodo, poiché quanto sopra funziona bene per me.

  3. Montare l'array, con la -o degradedmodalità.
  4. Inizia un'operazione di ribilanciamento con sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Ciò riorganizzerà le estensioni sull'unità di buona qualità, convertendole in single(non RAID). Il completamento del processo richiederà quasi un giorno, a seconda della velocità dell'unità e delle dimensioni dell'array. (il mio aveva ~ 700 GiB e ribilanciato al ritmo di 1 pezzo da 1GiB al minuto) Fortunatamente, questa operazione può essere messa in pausa e manterrà l'array online mentre si verifica.
  5. Fatto ciò, è possibile emettere sudo btrfs device remove missing /mountpointper rimuovere il dispositivo difettoso "mancante".
  6. Inizia un secondo riequilibrio sudo btrfs balance start -mconvert=dup /mountpointper ripristinare la ridondanza dei metadati. Questo richiede alcuni minuti sul mio sistema.
  7. Hai finito! L'array è ora in singlemodalità, con tutta la ridondanza rimossa.
  8. Porta fuori il tuo disco difettoso e battilo con un martello.

Risoluzione dei problemi

  • Aiuto, btrfs ha provato a scrivere sul mio disco difettoso, ha sbagliato e lo ha forzato di sola lettura!
    • Hai seguito il passaggio 1 e riavviato prima di continuare? È probabile che btrfs continui a pensare che sia presente l'unità che hai avviato. Il riavvio farà dimenticare a btrfs eventuali errori e ti consentirà di continuare.

2
Questo non funziona Sono su Ubuntu 16.04 (Kernel 4.4). dmesg dice "i dispositivi mancanti (1) superano il limite (0), non è consentito il montaggio scrivibile". Quindi sono bloccato al passaggio "mount -o degraded"
HelloSam

@HelloSam: forse questo è un bug. Vedi bbs.archlinux.org/viewtopic.php?id=210541
jaltek,

Prendi in considerazione l'aggiunta ,softdopo ciascuna convert=per saltare pezzi che hanno già il profilo di destinazione (che dovrebbe essere tutti loro).
Tom Hale,

9

Grazie per il tuo post. Ho avuto l'idea che avrei potuto testare il raid, estrarre l'unità dal mio hotswap bay, utilizzare un'altra unità e quindi inserire nuovamente l'unità del raid. In retrospettiva, questa era una cattiva idea e ora ho bisogno del mio hotswap bay.

Ecco cosa ho trovato. Come 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

Nota il devid elencato per ogni unità. Man for brtrfs balance mi ha portato all'opzione devid, ha fatto un paio di tentativi per capire come funzionavano i filtri (inizialmente provando devid = / dev / sdb1). Quindi il tuo primo tentativo sarà simile a questo.

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

Il che mi ha dato un errore.

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

Ecco l'errore di dmesg:

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

Quindi questa è la finale che ha funzionato:

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

Spero che questo aiuti qualcun altro.


Se volessi semplicemente sostituire un'unità con un'altra, puoi farlo usando btrfs replace.
dma_k,

Questo ha funzionato per me circa un anno fa, ma oggi no. Non importa quello che devid=
scrivo

Controlla anche -sconvertper convertire i blocchi di sistema.
Tom Hale,

Prendi in considerazione l'uso |invece di ,come dice la pagina man per il bilancio:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.