Esta es una revisión de fallas real. El entorno es un disco duro SMR administrado por host Western Digital HC620, que utiliza zonas Btrfs, montado en /mnt/disk1, el sistema es Ubuntu 26.04 LTS y el kernel es:
|
|
La falla no fue una disminución normal de la velocidad del disco duro, sino que ocurrieron dos anomalías graves, una tras otra:
btrfs-cleanerybtrfs-transactioningresan al estado ininterrumpibleDy el sistema de archivos no se puede desmontar;- La transacción Btrfs se cancela con
-11y el kernel cambia activamente el sistema de archivos a solo lectura.
Ambas fallas ocurrieron cerca de eliminaciones de varios terabytes, replicaciones y recuperaciones de espacio zonificado. Al final, el sistema no se reinstaló y no se ejecutó btrfs check --repair. Este artículo conserva registros en el sitio, procesos de evaluación, comandos reales y partes no confirmadas tanto como sea posible para referencia de personas que encuentren problemas similares.
Nota: esto no demuestra que todas las instalaciones de Btrfs en un HC620 vayan a fallar, y una sola pila de llamadas no permite identificar un parche concreto del kernel. Las versiones del kernel y de los paquetes de Ubuntu reflejan el estado del sistema el 24 de julio de 2026. Consulte los repositorios actuales antes de seguir los pasos específicos de versión.
Entorno y proceso desencadenante
Este disco almacena principalmente copias de seguridad y datos fríos. Las operaciones antes del primer fallo son aproximadamente las siguientes:
|
|
El HC620 es un SMR administrado por host. Los discos se gestionan según zonas. Cada zona se muestra en el sitio como:
|
|
En estos dispositivos, las zonas escritas no se pueden sobrescribir arbitrariamente como en los discos duros CMR normales. Eliminar un archivo solo elimina la referencia al bloque de datos, y el espacio no válido que contiene debe esperar a que se recicle el grupo de bloques, se migren datos válidos y se restablezca la zona antes de poder reutilizarse. Btrfs mostrará esta parte del espacio como:
|
|
Entonces, “eliminar 3 TB y escribir 3 TB inmediatamente” no es solo una eliminación más una copia. Posiblemente sucediendo simultáneamente en segundo plano:
|
|
Esto se convierte en un trasfondo importante para el análisis posterior de la pila de llamadas.
Primer fallo: btrfs-cleaner bloqueado durante mucho tiempo
El registro inicial contiene:
|
|
La cadena de llamadas clave es:
|
|
Léelo de abajo hacia arriba, el proceso es:
|
|
El registro también indica que es probable que el mutex esté retenido por el mismo subproceso btrfs-cleaner. Combinado con la cadena de llamadas, el juicio en el sitio es que el hilo de limpieza ingresa a la espera de bloqueo cuando se superponen la eliminación del grupo de bloques, el final de la zona y la asignación de nuevos fragmentos. Posteriormente, también se bloquearon btrfs-transaction y kworker que esperaban el vaciado de Btrfs.
Esta es una explicación de la pila de llamadas en el sitio, lo que no significa que se haya encontrado el único error ascendente correspondiente. Lo que es seguro es:
- El bloqueo ocurre en la ruta de limpieza de fragmentos/grupos de bloques de la zona Btrfs;
- El hilo ha entrado en el estado
Den el estado del kernel; - El
kill -9ordinario no puede terminar el hilo del kernel; - Las operaciones continuas que dependen del compromiso de la transacción pueden quedar estancadas.
¿Qué comprobaciones se realizaron en primer lugar?
Primero detenga rsnapshot, rsync, contenedor Docker u otras tareas de escritura en disco, y luego verifique el proceso ininterrumpible:
|
|
Guarde el registro del kernel de este inicio:
|
|
Guarde la pila de subprocesos correspondiente:
|
|
Agregue un tiempo de espera al consultar el sistema de archivos para evitar que el comando de diagnóstico se bloquee permanentemente:
|
|
Luego intente una desinstalación normal:
|
|
apagar:
|
|
target is busy no es lo mismo que el bloqueo del kernel
target is busy normalmente significa que la siguiente referencia todavía está disponible:
- El directorio de trabajo actual del proceso se encuentra en
/mnt/disk1; - El archivo aún está abierto;
- El programa de copia de seguridad o copia todavía está en ejecución;
- Hay puntos de submontaje debajo de
/mnt/disk1; - El proceso de usuario ha entrado en el estado
Ddebido al bloqueo del sistema de archivos.
Primero asegúrese de que todos los terminales salgan del directorio de montaje:
|
|
Verifique los submontajes y los ocupantes:
|
|
Los procesos de usuario ordinarios se pueden finalizar normalmente antes de considerar la terminación forzada:
|
|
Si es rsnapshot o rsync:
|
|
Pero no intentes matar:
|
|
Son hilos del núcleo. La inspección in situ muestra que el bloqueador principal es el subproceso del kernel Btrfs, y continuar con kill, umount o sync global no puede resolver la causa raíz.
¿Por qué no se utiliza el desmontaje diferido o el desmontaje forzado?
No se implementó en ese momento:
|
|
umount -l simplemente elimina primero el punto de montaje del árbol de directorios, y la referencia real del sistema de archivos aún tiene que esperar hasta que ya no esté ocupada antes de poder limpiarse. Cuando una transacción Btrfs está bloqueada, es posible que solo oculte el punto de montaje y no significa que los datos se hayan confirmado o que el sistema de archivos se haya desmontado.
umount -f tampoco es un medio confiable para aliviar los bloqueos locales del kernel Btrfs. Se usa más comúnmente en partes de la red o en sistemas de archivos en modo de usuario.
Tampoco se ejecuta:
|
|
Estas operaciones pueden quedar esperando la transacción bloqueada o volver a entrar en la ruta problemática de recuperación de grupos de bloques.
Agregue noauto antes de reiniciar
Para evitar usar el mismo kernel para leer y escribir automáticamente este disco inmediatamente después de que se reinicie la máquina, primero verifique /etc/fstab:
|
|
Configuración de copia de seguridad:
|
|
Por ejemplo resultó ser:
|
|
Cambiado temporalmente a:
|
|
noauto significa sólo que no se montará automáticamente al arrancar, no que deshabilitará el sistema de archivos. Una vez iniciado el sistema, aún se puede montar manualmente como solo lectura o lectura-escritura.
Del reinicio normal al último recurso
Se realizó un reinicio normal en el sitio:
|
|
Esta vez se completó normalmente y el sistema de archivos se pudo volver a montar después de reiniciar. Si el reinicio normal se atasca debido a Btrfs, el nivel de aplicación se incrementará paso a paso según el riesgo:
|
|
El último recurso es:
|
|
Dos --force ya no detienen el servicio y desmontan el sistema de archivos normalmente, el efecto es cercano a un restablecimiento completo y es posible que se pierdan datos no confirmados. Solo se puede usar cuando el sistema no se puede finalizar normalmente y no se puede usar como un comando de reinicio normal.
Verificar después de reiniciar
Primero confirme el kernel y el disco arrancados reales:
|
|
Confirme que no hay montaje automático:
|
|
Montar solo lectura por primera vez:
|
|
En el entorno real, primero se debe usar UUID o /dev/disk/by-id/, y el dispositivo predeterminado no siempre debe ser /dev/sda.
Verifique el registro del kernel, el recuento de dispositivos Btrfs y el estado del espacio:
|
|
En vivo btrfs device stats todos 0:
|
|
Esto muestra que Btrfs no registra errores de lectura y escritura, descarga, verificación o generación del dispositivo, lo cual es una buena señal. Pero esto no prueba que se haya solucionado el bloqueo del kernel ni descarta el problema de los datos no leídos.
Qué hace scrub y qué no hace
Se programa una limpieza después de que el sistema esté estable:
|
|
Si desea que la recepción espere los resultados:
|
|
Cancelar tarea:
|
|
Scrub lee los datos y metadatos almacenados y verifica la suma de verificación guardada por Btrfs. Se utiliza para encontrar errores de lectura, errores de validación de datos o metadatos, no:
|
|
Si el resultado es:
|
|
Solo puede mostrar que no se encontró ninguna excepción en esta lectura y verificación, pero no puede probar que la ruta de limpieza por zonas de btrfs-cleaner no se bloqueará nuevamente en el futuro.
Guardar resultados:
|
|
No ejecute rsync, rsnapshot, balance ni realice eliminaciones masivas al mismo tiempo durante Scrub. Para este tipo de disco de respaldo, se puede realizar cada uno a tres meses según la intensidad de uso real.
Por qué no se ejecutó balance para «recuperar espacio»
Apareció en el lugar:
|
|
Este número solo representa el uso del grupo de bloques de datos asignado y no significa que solo quede el 1,33% de todo el disco. En ese momento, todavía quedaban varios TiB Device unallocated y no faltaba espacio para seguir asignando.
Entonces no hay ejecución:
|
|
Balance reubicará el grupo de bloques donde se encuentra la primera falla:
|
|
Ejecutar balance con el kernel afectado puede volver a entrar en rutas similares de eliminación de grupos de bloques y recuperación de zonas.
Cómo manejar eliminaciones y escrituras de varios terabytes
El ajuste del flujo de trabajo más eficaz es copiar y verificar datos nuevos antes de eliminar los datos antiguos cuando haya suficiente espacio.
|
|
Copiar:
|
|
Comparar capacidad:
|
|
Practica usar el método de verificación de contenido sin modificar el objetivo:
|
|
Cuando sea necesario eliminar primero, no elimine varios TB a la vez y luego escriba inmediatamente. Se puede dividir en lotes de 200~500GiB por fecha, subdirectorio o capacidad:
|
|
btrfs filesystem sync confirmará la transacción del sistema de archivos y activará el trabajo de limpieza relacionado, pero el retorno del comando no significa que se hayan completado todos los grupos de bloques y la recuperación de zonas.
Si está eliminando un subvolumen o una instantánea de Btrfs, también puede ejecutar:
|
|
Espera a que el subvolumen para el cual se envió la solicitud de eliminación complete la limpieza y no se aplica a las eliminaciones normales de rm -rf.
Verifique después de cada lote:
|
|
Cumple las siguientes condiciones antes de continuar:
btrfs filesystem syncregresa normalmente;- No hay subprocesos Btrfs en estado
D; - No hay nuevos errores bloqueados, colgados, abortados o Btrfs en el registro del kernel;
- La actividad del disco ha disminuido significativamente;
Device zone unusableno está creciendo rápidamente.
No es necesario reducir Device zone unusable a cero. Puede permanecer en unas decenas de GiB hasta alcanzar el siguiente umbral de recuperación; eso por sí solo no significa que el sistema de archivos siga ocupado o bloqueado.
Las escrituras también se pueden realizar por lotes, con prioridad y ancho de banda limitados:
|
|
--bwlimit=100M es sólo un punto de partida conservador. La limitación de velocidad no puede solucionar los errores del kernel, pero puede reducir la probabilidad de que el limpiador, la confirmación de transacciones, la reescritura y la activación de zonas estén bajo una carga alta al mismo tiempo. No ejecute varios rsyncs grandes al mismo tiempo.
Supervisar las métricas de recuperación zoned
Primero obtenga el UUID del sistema de archivos:
|
|
Consulta los indicadores de espacio y recuperación de datos, metadatos y sistema:
|
|
en:
bytes_pinned: espacio que normalmente no se puede liberar hasta que se confirme la transacción actual;bytes_zone_unusable: espacio zonificado que ha caducado pero que no se puede reutilizar directamente;reclaim_count: número acumulado de intentos de recuperación;reclaim_bytes: el número acumulado de bytes reciclados;reclaim_errors: número acumulado de errores de recuperación.
También puede ver las estadísticas de confirmación de transacciones:
|
|
Si max_commit_ms dura decenas o cientos de segundos, o el registro aparece nuevamente:
|
|
Debe detener la tarea de copia de seguridad y guardar el registro, no continuar ingresando datos y esperar a que se recupere por sí solo.
Deshabilitar la superposición de tareas de respaldo
Todos los ciclos de rsnapshot utilizan el mismo bloqueo:
|
|
weekly y monthly también utilizan:
|
|
Esto puede evitar que se realicen rsync diarios, semanales, mensuales y una gran cantidad al mismo tiempo. Las depuraciones, eliminaciones masivas y copias grandes también deben programarse para diferentes períodos de tiempo.
Segundo error: transacción abortada y forzada a solo lectura
Después del primer fallo y reinicio, el sistema de archivos se puede montar normalmente y no hay errores en las estadísticas del dispositivo. Pero al volver a escribir una gran cantidad de datos más tarde, se produjo un error de transacción más explícito:
|
|
El entorno operativo sigue siendo:
|
|
Esta vez no está “bloqueado temporalmente”, pero la transacción se canceló y el kernel cambia activamente a solo lectura para proteger el sistema de archivos. -11 corresponde a EAGAIN, pero el código específico que lo activa no se puede determinar basándose únicamente en errno.
Las estadísticas del dispositivo en ese momento todavía eran 0:
|
|
El estado del espacio no está lleno:
|
|
Este conjunto de evidencia favorece anomalías en la escritura interna, la asignación de fragmentos o la lógica de transacciones de Btrfs zonificados en lugar de errores de E/S de medios comunes o ENOSPC en todo el disco. Sin embargo, sin un análisis completo del primer error y el código fuente correspondiente, no se debe afirmar que la causa sea un parche determinado.
Manejo correcto después de solo lectura forzada
No lo intentes:
|
|
Primero detenga la tarea de escritura:
|
|
Guarde los registros completos antes y después de la falla. El primer error que realmente hace que la transacción se cancele puede aparecer docenas de líneas antes de forced readonly:
|
|
Confirmar opciones de montaje:
|
|
ro debería aparecer allí. Luego desinstale y reinicie normalmente:
|
|
Si indica ocupado:
|
|
Detenga los procesos de usuario normales enumerados antes de desinstalar.
Comprobar si la copia quedó incompleta
Parte de los datos que se escribieron antes de que se cancelara la transacción no pueden considerarse directamente como una copia de seguridad completa. Puede aparecer:
- El archivo aún no ha sido creado;
- La longitud del archivo está incompleta;
- Los datos se escriben, pero la entrada del directorio o la marca de tiempo no se confirman;
- Se revierten los cambios en la última transacción.
Por lo tanto, se debe conservar el disco de origen. Después de cambiar a un entorno estable y volver a leer y escribir el montaje, use el rsync original para completar:
|
|
Luego use el modo de verificación para verificar:
|
|
Sin resultados significa que rsync no ha encontrado nada que deba actualizarse.
Solución kernel: primero distinga entre pruebas y uso a largo plazo
Continuamente han aparecido la misma máquina, la misma 7.0.0-28-generic y la misma HC620:
btrfs-cleanerestá bloqueado con el hilo de transacción;error -11, transacción cancelada, solo lectura forzada.
Por lo tanto, ya no seguiremos usando este kernel para leer y escribir terabytes de datos en este disco. Se discutieron tres rutas:
| Direcciones | Propósito | Limitaciones |
|---|---|---|
| Ubuntu 26.04 + 7.1 Línea principal | Determinar si el nuevo kernel ascendente mitiga la falla | Kernel de soporte de producción que no es de Ubuntu, no se han confirmado correcciones específicas |
| Ubuntu 24.04 + 6.8 GA | Determine si 7.0 introduce regresión, el soporte a largo plazo es mejor | el código Btrfs zonificado es más antiguo |
| Ubuntu 24.04 + 6.17 | Comportamiento de recuperación de zona de prueba comparativa a corto plazo | El ciclo de soporte está llegando a su fin, no es adecuado para operaciones desatendidas a largo plazo |
Lo más importante aquí no es buscar el número de versión más grande, sino:
- Mantener un kernel antiguo que pueda iniciarse;
- Realice únicamente un arranque de GRUB por primera vez;
- Montar primero el modo de solo lectura;
- Prueba paso a paso de 100 a 200GiB;
- “Escribir 3 TB inmediatamente después de eliminar 3 TB” ya no se reproduce directamente.
Confirmado en Ubuntu 24.04 6.8 GA
No mezcle paquetes de Ubuntu 24.04 con Ubuntu 26.04 existente. Una forma más segura es instalar Ubuntu Server 24.04 en otro SSD y luego montar el disco de datos HC620 para realizar pruebas.
Instale y conserve el metapaquete 6.8 GA:
|
|
Confirmar sistema y kernel:
|
|
La clave es que uname -r comienza con 6.8. y no codifica una determinada versión del parche de forma permanente.
Consulta el repositorio actual en lugar de copiar la versión histórica de este artículo:
|
|
Si las pruebas apuntan a GA 6.8, no permita que linux-generic-hwe-24.04 lleve el sistema a otra línea principal de HWE.
Prueba a corto plazo en Ubuntu 24.04 6.17
Primero compruebe si los repositorios actuales todavía ofrecen y mantienen el paquete:
|
|
Después de confirmar que el paquete aún está disponible, instálelo explícitamente:
|
|
Documento de confirmación:
|
|
Comience solo una vez por primera vez. La versión completa a continuación debe reemplazarse con la versión realmente instalada en su máquina:
|
|
Verifique después de reiniciar:
|
|
El repositorio Noble 24.04 no debe agregarse a Ubuntu 26.04 para forzar la instalación de este kernel; de lo contrario, puede introducir firmware, DKMS, initramfs y problemas posteriores de mantenimiento de apt.
Límites al probar 7.1 Mainline
El paquete Mainline es adecuado para verificar “si el nuevo kernel ascendente cambia el comportamiento de falla” y no es equivalente al kernel de producción oficial de Ubuntu. Debe comprobar antes de la instalación:
|
|
El riesgo de las pruebas aumenta significativamente si el arranque seguro está habilitado, hay módulos DKMS críticos presentes o el servidor no tiene una consola fuera de banda. La versión específica, el nombre del archivo y el valor de verificación deben volver a obtenerse del [Ubuntu Mainline Kernel Archive] actual (https://kernel.ubuntu.com/mainline/), y las direcciones de descarga caducadas no deben copiarse.
Mantenga el kernel de arranque actual e inicie el nuevo kernel de una vez a través de GRUB. Verificar después del inicio:
|
|
Primer montaje y prueba del nuevo kernel
Ya sea que pruebe 6.8, 6.17 o actualice el kernel, primero mantenga noauto en /etc/fstab y móntelo como solo lectura después del inicio:
|
|
Después de que no haya nuevos errores:
|
|
Prueba paso a paso:
|
|
El hecho de que pase un lote pequeño no significa inmediatamente que esté “arreglado” con terabytes de presión. Como mínimo, se requieren múltiples rondas, grandes cantidades de datos y tiempos de ejecución prolongados para mejorar la confianza.
Si se debe reformatear Btrfs
Reformatear puede dar como resultado un sistema de archivos limpio, pero no puede solucionar por sí solo los problemas de rutas de zonas del kernel. Ambas excepciones ocurrieron en el grupo de bloques, la zona y la ruta de transacción en tiempo de ejecución, y las estadísticas del dispositivo no tuvieron errores de medios.
Reconstruir el sistema de archivos sólo tiene sentido cuando:
btrfs check --readonlySe encontró un error estructural explícito;- Scrub sigue presentando errores de verificación irreparables;
- No se puede montar normalmente o se siguen produciendo errores de generación;
- Se ha decidido ajustar el perfil de datos/metadatos;
- Prepárese para reemplazar el sistema de archivos.
Incluso si desea reconstruir, primero complete otra copia de seguridad verificable en lugar de tratar el formateo como un comando de prueba y error.
Cómo elegir entre Btrfs y F2FS
F2FS puede omitir la ruta de llamada específica de Btrfs que aparece esta vez:
|
|
Pero no es una solución “libre de problemas”. F2FS también tiene riesgos en GC, migración de segmentos, restablecimiento de zonas, recuperación de fallas de energía y reparación del sistema de archivos. Aún pueden producirse retrasos prolongados en la GC en primer plano con escrituras grandes inmediatamente después de eliminaciones grandes.
Las principales compensaciones entre los dos son:
| Proyectos | Btrfs zonificados | F2FS |
|---|---|---|
| Suma de comprobación de datos de archivo | Sí | Por lo general, no hay una suma de verificación de datos equivalente de un extremo a otro |
| scrub | sí | no dispone de un scrub equivalente al de Btrfs |
| Instantáneas | Sí | Sin instantáneas al estilo Btrfs |
| Esta ruta de falla | en realidad se ha activado dos veces | Se pueden evitar las rutas específicas de Btrfs |
| Recuperación de espacio de fondo | recuperación de grupo/zona de bloques | reinicio de GC/zona de segmento |
Si el HC620 es solo uno de varios respaldos, F2FS más paridad externa es aceptable. Ni el uso de Btrfs ni F2FS de disco único es lo suficientemente seguro si es la única copia.
Puede guardar la lista SHA256 en otro disco cuando utilice F2FS:
|
|
Verificar más tarde:
|
|
El propio ECC de la unidad, la reasignación de sectores defectuosos y el SATA CRC seguirán funcionando, pero no cubren el vínculo completo de extremo a extremo entre aplicaciones, memoria, sistemas de archivos, controladores y discos. La suma de comprobación de Btrfs y el ECC del disco duro son funciones complementarias, no duplicadas.
Principio de procesamiento final
Esta solución de problemas dio como resultado las siguientes reglas prácticas:
- Ya no utilice
7.0.0-28-genericpara realizar lecturas y escrituras a gran escala de este HC620; - Conservar los datos fuente y al menos una copia independiente;
- Copie y verifique primero, luego elimine en lotes;
- Divida varias operaciones de TB en lotes de 200 ~ 500 GiB;
- rsync, rsnapshot, Scrub, eliminación masiva y equilibrio no se superponen;
- Deje de escribir inmediatamente después de que aparezca el estado
Do el registro de tareas colgadas; - No fuerce el reinicio, rw después de forzar solo lectura;
- No utilice
btrfs check --repairpara realizar intentos a ciegas; - El núcleo de prueba debe conservar los elementos de reversión y comenzar con un montaje de solo lectura;
- La confiabilidad a largo plazo proviene primero de las copias múltiples y, en segundo lugar, de la selección del sistema de archivos.
Toda la cadena de fallas se puede resumir como:
|
|
Este conjunto de resultados es suficiente para mostrar que la combinación actual “HC620 + Btrfs zonificado + 7.0.0-28 + CLOS” no es adecuada para continuar con tareas desatendidas a gran escala, pero no es suficiente para demostrar que todos los HC620, todos los Btrfs zonificados o todos los núcleos 7.0 tienen el mismo problema.