Tengo un disco que falla en un RAID1 btrfs, de modo que las escrituras son dudosas, pero las lecturas funcionan en su mayoría. ¿Cómo reemplazarlo?

Tengo un disco que falla en un RAID1 btrfs, de modo que las escrituras son dudosas, pero las lecturas funcionan en su mayoría. ¿Cómo reemplazarlo?

Tengo un sistema de archivos btrfs de dos discos, con los datos y los metadatos en RAID1 (a través de la función btrfs, no mdraid). Los discos son unidades USB3, con dm-crypt en la parte superior. Uno de los discos está fallando (tiene varios miles de sectores defectuosos y, a menudo, se agota el tiempo de escritura). Obtuve una tercera unidad USB para reemplazar la que falla, ¿cómo puedo reemplazarla?

Respuesta1

Esto resultó ser un PITA real. Primero, es importante tener en cuenta que btrfs ahora tiene un comando de reemplazo adecuado, que es mucho mejor que agregar nuevo y eliminar si falla.

Primero, comience particionando el nuevo disco y configurando dm-crypt en él. Continúe y desbloquéelo.

Si su disco no tenía tiempo de espera de escritura (¡que aparentemente toma 360 segundos cada uno!), podría hacer lo siguiente:

btrfs replace start -r /dev/mapper/luks-BAD-disk-uuid              \
                       /dev/mapper/luks-NEW-disk-uuid /mount/path

Sin embargo, eso terminará realizando escrituras algo rutinarias en el disco defectuoso y, si eso causa un tiempo de espera, verá alrededor de 30 segundos de copia rápida, seguidos de 6 a 12 minutos de inactividad, esperando el tiempo de espera.

Para evitar escrituras en él, es posible configurar una instantánea usando device-mapper. Las lecturas irán al dispositivo defectuoso subyacente (que en su mayoría está bien con las lecturas); Las escrituras irán al almacenamiento de copia en escritura (COW). Primero, necesita un dispositivo de bloque suficientemente grande para el almacenamiento COW. Creé un nuevo volumen lógico para ello ( Watt-sdj1_dmsnap). Cualquier dispositivo de bloque debería funcionar, incluso un dispositivo de bucle debería funcionar bien. Personalmente sugiero uno persistente, en caso de que algo salga mal, pero si vives peligrosamente y tienes suficiente RAM, un disco RAM funcionaría.

El mío requeriría ~1,7 GB de espacio COW (para mover 2,24 TiB de una unidad de 3 TB). Recomiendo ser generoso con el espacio para las VACAS; Que se acabe probablemente sería algo malo, y podrás liberarlo todo una vez que hayas terminado.

A continuación, debe desmontar el sistema de archivos btrfs, si estaba montado, y bloquear (detener) el dispositivo dm-crypt. Estoy poniendo la instantánea debajo del cifrado porque no quiero que se escriban datos no cifrados en el disco.

En mi caso la partición es /dev/sdj1. Primero, para evitar errores, configúrelo como de solo lectura:

blockdev --setro /dev/sdj1
blockdev --setro /dev/sdj

(Más tarde podrás volver a configurarlo con --setrw). Ahora, configure la instantánea:

dmsetup create sdj_divert --table "0 $(blockdev --getsz /dev/sdj1) snapshot /dev/sdj1 /dev/mapper/Watt-sdj1_dmsnap PO 8"

Para explicar rápidamente lo que eso significa, una tabla de mapeador de dispositivos tiene el formato:sector de inicio número de sectores tipo de objetivo argumentos-objetivo. El sector de inicio es 0; el número de sectores es el mismo que el tamaño de sdj1 (después de todo, queremos hacer todo); el tipo de destino es instantánea. El objetivo de la instantánea toma varios argumentos:fuente-dev desarrollador de vacas modo tamaño de porción. Estamos dando un dispositivo fuente de /dev/sdj1; el dispositivo COW es ese volumen lógico que creé; el modo PO significapagersistente (los metadatos se escriben en el disco, por lo que se pueden volver a configurar después de reiniciar) yohverflow (si escribimos demasiado en la instantánea, la recuperación es posible). El tamaño del fragmento es cuán granular es la instantánea; si escribimos aunque sea un byte, se copiará todo el fragmento alrededor de ese byte (y consumirá espacio en la instantánea). 8 es 4K, por lo que no habrá problemas de alineación.

Ahora, finalmente, desbloquea el dispositivo nuevamente, pero en lugar de desbloquearlo /dev/sdj1, desbloquéalo /dev/mapper/sdj_divert. Luego continúa y vuelve a montar el sistema de archivos btrfs.

Puede comprobar el uso de la instantánea con dmsetup status sdj_divert; eso debería dar algo como (pero con un número mucho menor antes de la barra):

0 5860524928 snapshot 914216/545259520 3568

Las primeras tres cosas son el sector de inicio, el número de sectores y el tipo de destino. El siguiente número es el número de sectores utilizados (antes de la barra) y luego el número de sectores totales (después de la barra). Entonces esa es una fracción del espacio utilizado. El número final es el número de sectores utilizados para los metadatos, que ya está incluido en el número utilizado.

Ahora, finalmente, puedes usar ese simple btrfs replace startcomando en la parte superior de la respuesta. Eso volverá inmediatamente; observe el estado ejecutando btrfs replace status /mount/path.

Cuando finalice el reemplazo, confirme que el dispositivo defectuoso se haya eliminado del sistema de archivos (por ejemplo, btrfs fi show /mount/path) y luego podrá bloquear/cerrar la unidad defectuosa y luego eliminar la instantánea ( dmsetup remove sdj_divert). Luego puedes liberar el espacio de la VACA (después de limpiarlo, si estás paranoico).

Hay un paso final, técnicamente opcional: mi dispositivo de reemplazo es más grande, pero btrfs aún no está usando el espacio adicional. Para que esté disponible para btrfs, busque el devid en la btrfs fi showsalida y luego ejecute

btrfs fi resize DEVID:max /mount/path

eso debería ser casi instantáneo.

información relacionada