Cómo reparar un sistema de ficheros XFS

Aquellos que estéis acostumbrados a trabajar con filesystems ext, estarán acostumbrados a utilizar el clásico fsck para reparar o analizar el estado del sistema de ficheros. En el caso de xfs, el comando a utilizar es xfs_repair.

xfs_repair es una utilidad disponible en cualquier sistema que utilice xfs y que permite analizar y reparar estos sistemas de ficheros. La gran diferencia respecto a fsck es que esta utilidad no se tiene que utilizar durante el arranque del sistema, incluso si el sistema de ficheros no se ha desmontado de forma correcta previamente.

¿Cómo lo hace? Todo sistema de ficheros xfs cuenta con un area dentro del FS dedicada a log, donde se almacenan los metadatos y cambios del FS mientras está montado. Estos cambios se escriben de forma secuencial y únicamente se leen durante el arranque. En caso de necesitar reparación, lo que ocurre es que antes de montar el FS se recurre a este log para leer las operaciones pendientes que se estuvieran ejecutando durante el fallo.

El único problema grave que podríamos encontrar es que este log esté corrupto. Para hacer un «reset» del log, basta con montar y desmontar el sistema de ficheros. En el caso de que tampoco funcione, la opción -L forzaría la escritura completa de ceros en el log del dispositivo. Siempre, teniendo en cuenta que esto es susceptible de pérdida de datos:

# xfs_repair -L  /dev/mapper/foo-fs

El siguiente ejemplo muestra la salida de ejecución de xfs_repair con el parámetro -n que indica al comando que no se debe reparar el FS, únicamente analizarlo en busca de errores:

# xfs_repair -n /dev/mapper/foo-fs
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - scan filesystem freespace and inode maps...
        - found root inode chunk
Phase 3 - for each AG...
        - scan (but don't clear) agi unlinked lists...
        - process known inodes and perform inode discovery...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
        - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
        - setting up duplicate extent list...
        - check for inodes claiming duplicate blocks...
        - agno = 0
        - agno = 1
        - agno = 2
        - agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.

Un ejemplo de análisis y reparación en modo verbose:

# xfs_repair -v /dev/mapper/foo-fs

Para más información, echad un vistazo a la página man de xfs_repair.