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 single
modo, 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
?
dconvert=single
por un fragmento solo hace lo que temía y elimina la buena copia conocida. :(Respuestas:
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/sda
defectuoso y otro/dev/sdc
conocido:/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.Ahora que su matriz está desmontada, ejecute:
echo 1 | sudo tee /sys/block/sda/device/delete
reemplazando
sda
con 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í.
-o degraded
modo.sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint
. Esto reorganizará las extensiones en la unidad en buen estado, convirtiéndolas asingle
(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.sudo btrfs device remove missing /mountpoint
para eliminar el dispositivo defectuoso 'faltante'.sudo btrfs balance start -mconvert=dup /mountpoint
para restaurar la redundancia de metadatos. Esto toma unos minutos en mi sistema.single
modo, con toda la redundancia eliminada.Solución de problemas
fuente
,soft
después de cada unoconvert=
para omitir los fragmentos que ya tienen el perfil de destino (que deberían ser todos).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:
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í.
Lo que me dio un error.
Aquí está el error de dmesg:
Entonces esta es la final que funcionó:
Esperemos que esto ayude a alguien más.
fuente
btrfs replace
.devid=
, los datos individuales resultantes se colocan en el dispositivo 1.-sconvert
para convertir fragmentos del sistema.|
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)