Alternativa segura de recuperar el sistema de archivos xfs en Linux

Para entender. ¿Cómo trabaja xfs?

El sistema de ficheros xfs almacena metadatos y cambios del FS mientras está montado, tiene un área dentro del FS que está dedicada estos log. Los 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.
xfs_repair es el comando que nos va a permitir reparar y analizar los ficheros del tipo xfs. Es una opción que ofrece buen rendimiento, según redhat y algunos benchmark, sin embargo, existe mayor riesgo de que después de alguna desconexión o una falla eléctrica, exista corrupción.

Es muy importante que antes de comenzar a reparar este sistema de archivos, debemos hacer un backup de los metadatos!!

PRIMERA PARTE

Primer Método para reparar

Voy a dar un ejemplo de lo que nos sucedió en un servidor CentOS 7 con tipo de fichero xfs:

Al intentar montar la partición, recibí el siguiente log al intentar montar:

mount: mount / dev / mapper / raíz-centos en / mnt / centos-root falló: Estructura necesita limpieza

Por desgracia, si forzamos la reparación (lo cual se puede hacer), podría causar la destrucción del log antes de intentar su reparación.
Cuando se utiliza este método, existe el potencial de terminar con datos más corruptos de los inicialmente previstos; sin embargo, podemos usar las herramientas xfs apropiadas para ver qué tipo de daño puede ser causado antes de realizar cambios permanentes

Backup de los metadatos

Una perdida total de tus metadatos, podría originar que no se pueda recuperar más tu máquina. Te recomendamos no saltar este paso.

 xfs_metadump /dev/mapper/centos-root /mnt/usb/centos-root.metadump 

(ver como montar un usb)

Restaurar metadatos en una imagen

Para que podamos realizar una reparación segura y ver el daño que se produjo.

xfs_mdrestre /mnt/usb/centos-root.metadump /mnt/usb/centos-root.img 

Lamentablemente, el modo de rescate de centos, que es el que estamos usando para este ejemplo (no live cd), xfs_mdrestre no está disponible. Habría que hacerlo con un live cd.

Reparación de la imagen

Una vez que tengamos a salvo los metadatos, podemos realizar la reparación en la imagen:

xfs_repair -L /mnt/usb/centos-root.img 

Cuando la hayamos reparado, podremos ver realmente la magnitud del problema y daño, y si nos conviene reparar nuestra partición.

Como no hay más alternativa, ya que en nuestro caso es un servidor de producción, procedemos a desmontar la partición dañada para luego reparar.

Desmontar partición xfs

umount /tu-particion-problematica
umount: /mount_path: target is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

En éste caso, no nos permitió desmontar.
Sin embargo, podemos utilizar algunos métodos para hacerlo.

# fuser -muv /mount_point
                     USER        PID ACCESS COMMAND
/mount_path:               root     kernel mount (root)/mount_point

O también, si está disponible:

Fuser es un comando poco conocido pero muy útil cuando necesitamos identificar qué procesos usan un fichero, carpetas determinadas o un socket.

En nuestro caso, buscamos las carpetas que están usando ficheros (xfs en nuestro caso),

fuser .
/mount_point: 2394c

La otra alternativa es:

# lsof | grep '/mount_point'

y podemos matar el proceso:

fuser -k -9 /mount_point

Reparar la partición dañada xfs

Finalmente, podemos hacer el repair

xfs_repair   /dev/mapper/centos-root

Si esto no funciona, no queda más alternativa que forzar, a menos que pruebes con un live cd.

Forzar reparación de la partición xfs

 xfs_repair -L /dev/mapper/centos-root 

Si no pudiste desmontar tu partición, también puedes forzarla.

Forzar desmontar partición xfs

umount -l /mount_point

Cuando tu partición se comience a reparar, verás un mensaje como este:

# 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.

Segundo método para reparar xfs

… Continúa