Linux BTRFS - convertir a single con disco fallido

12

Una pequeña cantidad de historia de fondo:

Tengo un pequeño sistema de archivos multimedia, en el que almaceno varias películas y programas de televisión que se utilizan para la configuración de mi HTPC. Esto se configuró originalmente, usando btrfs, en un disco externo WD de 1TB.

Más tarde, decidí comprar otra unidad, para darle a este sistema de archivos capacidades de duplicación RAID1. Este disco es un Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILIA). Desafortunadamente, esta no fue una buena opción de manejo. La unidad comenzó a desarrollar grandes cantidades de errores de lectura en breve, aunque BTRFS pudo corregirlos.

Recientemente, la cantidad de errores de lectura de esta unidad se ha disparado, con su condición empeorando constantemente. BTRFS ahora está comenzando a fallar:

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

Me gustaría eliminar la unidad defectuosa de la matriz RAID1, volviendo a la no redundancia en una sola unidad. Desafortunadamente, parece haber una falta de documentación sobre cómo hacer esto.

Soy consciente de que se puede ejecutar lo siguiente:

sudo btrfs balance start -dconvert=single /media

para convertir el perfil de datos a singlemodo, pero no estoy seguro de dónde se colocarán los datos. Como una de las unidades está fallando, me gustaría poder asegurarme de que BTRFS no borre debidamente todos los datos en la unidad buena y coloque una sola copia en la unidad defectuosa; en cambio, me gustaría simplemente actuar como si la otra unidad nunca existiera (como en, convertir de nuevo a mi configuración anterior)

Esto no funciona:

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

¿Qué voy a hacer? La ayuda sería muy apreciada.

TL; DR: comenzó con 1 unidad en BTRFS single, agregó otra unidad, lo hizo RAID1, otra unidad ahora está fallando, ¿cómo regreso a una sola unidad (ESPECÍFICAMENTE la buena conocida) single?

eeeeeta
fuente
Actualización: probar eso dconvert=singlepor un fragmento solo hace lo que temía y elimina la buena copia conocida. :(
eeeeeta

Respuestas:

11

Muy bien, lo descubrí con la ayuda de este enlace de Trello . En caso de que alguien más quiera hacer esto, este es el procedimiento.

Procedimiento

De una matriz RAID1 de dos discos, uno /dev/sdadefectuoso y otro /dev/sdcconocido:

  1. Inhabilite el montaje automático de esta matriz /etc/fstab, reinicie . Básicamente, queremos que btrfs olvide que esta matriz existe, ya que hay un error en el que aún intentará usar una de las unidades si está desconectada.
  2. Ahora que su matriz está desmontada, ejecute:

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

    reemplazando sdacon el nombre del dispositivo defectuoso. Esto hace que el disco gire hacia abajo (debe verificar esto en dmesg) y se vuelve inaccesible para el núcleo.

    Alternativamente : ¡solo saca el disco de la computadora antes de arrancar! Elegí no optar por este método, ya que lo anterior funciona bien para mí.

  3. Monta tu matriz, con el -o degradedmodo.
  4. Comience una operación de reequilibrio con sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Esto reorganizará las extensiones en la unidad en buen estado, convirtiéndolas a single(no RAID). Esto tomará casi un día en completarse, dependiendo de la velocidad de su unidad y el tamaño de su matriz. (la mía tenía ~ 700 GiB, y se reequilibró a una velocidad de 1 fragmento de 1GiB por minuto) Afortunadamente, esta operación se puede pausar y mantendrá la matriz en línea mientras ocurre.
  5. Una vez hecho esto, puede emitir sudo btrfs device remove missing /mountpointpara eliminar el dispositivo defectuoso 'faltante'.
  6. Comience un segundo reequilibrio con sudo btrfs balance start -mconvert=dup /mountpointpara restaurar la redundancia de metadatos. Esto toma unos minutos en mi sistema.
  7. Ya terminaste! Su matriz ahora está en singlemodo, con toda la redundancia eliminada.
  8. Lleva tu unidad defectuosa afuera y golpéala con un martillo.

Solución de problemas

  • ¡Ayuda, btrfs trató de escribir en mi disco defectuoso, erró y lo forzó solo a leer!
    • ¿Seguiste el paso 1 y reinicias antes de continuar? Es probable que btrfs todavía piense que la unidad que desactivó está presente. El reinicio hará que btrfs olvide cualquier error y le permitirá continuar.
eeeeeta
fuente
2
Esto no funciona Estoy en Ubuntu 16.04 (Kernel 4.4). dmesg dice que "los dispositivos faltantes (1) exceden el límite (0), el montaje grabable no está permitido". Por lo tanto, estoy atrapado en el paso "montar -o degradado"
HelloSam
@HelloSam: Tal vez esto es un error. Ver bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Considere agregar ,softdespués de cada uno convert=para omitir los fragmentos que ya tienen el perfil de destino (que deberían ser todos).
Tom Hale
9

Gracias por tu publicación. Tuve la idea de que podría probar la incursión, sacar la unidad de mi compartimento hotswap, usar otra unidad y luego volver a introducirla. En retrospectiva, esta era una mala idea y ahora necesito mi compartimento hotswap.

Esto es lo que encontré. Como 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

Tenga en cuenta el devid enumerado para cada unidad. Man for brtrfs balance me llevó a la opción devid, tomé un par de intentos para descubrir cómo funcionaban los filtros (inicialmente probando devid = / dev / sdb1). Así que tu primer intento se verá así.

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

Lo que me dio un error.

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

Aquí está el error de dmesg:

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

Entonces esta es la final que funcionó:

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

Esperemos que esto ayude a alguien más.

PG
fuente
Si solo desea reemplazar una unidad con otra, puede hacerlo usando btrfs replace.
dma_k
Esto me funcionó hace un año más o menos, pero hoy no. No importa lo que escriba después devid=, los datos individuales resultantes se colocan en el dispositivo 1.
YtvwlD
También echa un vistazo -sconvertpara convertir fragmentos del sistema.
Tom Hale
Considere usar en |lugar de ,como dice la página del manual para el equilibrio:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale