"Identificador de archivo NFS obsoleto" después de reiniciar


16

En el nodo del servidor, es posible acceder a una carpeta exportada. Sin embargo, después de reiniciar (tanto el servidor como el cliente), los clientes ya no pueden acceder a la carpeta.

En el servidor

# ls /data
Folder1
Forlder2

y el archivo / etc / exports contiene

/data 192.168.1.0/24(rw,no_subtree_check,async,no_root_squash)

En el cliente

# ls /data
ls: cannot access /data: Stale NFS file handle

Tengo que decir que no hubo ningún problema con la carpeta compartida desde el lado del cliente, sin embargo, después de reiniciar (servidor y cliente), veo este mensaje.

¿Alguna manera de arreglar eso?

Respuestas:


22

El orden de los reinicios es importante. Reiniciar el servidor después de que los clientes pueden dar lugar a esta situación. El identificador de NFS obsoleto indica que el cliente tiene un archivo abierto, pero el servidor ya no reconoce el identificador de archivo. En algunos casos, NFS limpiará sus estructuras de datos después de un tiempo de espera. En otros casos, deberá limpiar las estructuras de datos NFS usted mismo y reiniciar NFS después. Donde se ubican estas estructuras son algo dependientes de O / S

Intente reiniciar NFS primero en el servidor y luego en los clientes. Esto puede borrar los identificadores de archivo.

No se recomienda reiniciar los servidores NFS con archivos abiertos desde otros servidores. Esto es especialmente problemático si el archivo abierto se ha eliminado en el servidor. El servidor puede mantener el archivo abierto hasta que se reinicie, pero el reinicio eliminará el identificador de archivo en memoria en el lado del servidor. Entonces el cliente ya no podrá abrir el archivo.

Determinar qué montajes se han utilizado desde el servidor es difícil y poco confiable. La showmount -aopción puede mostrar algunas monturas activas, pero puede no informarlas todas. Los archivos bloqueados son más fáciles de identificar, pero requieren que el bloqueo esté habilitado y se basa en el software del cliente para bloquear los archivos.

Puede usar lsofen los clientes para identificar los procesos que tienen archivos abiertos en los montajes.

Uso las opciones de montaje hardy intren mis montajes NFS. La hardopción hace que IO sea reintentado indefinidamente. La intropción permite que se eliminen los procesos si están esperando que se complete NFS IO.


Usar hard, intres un buen consejo. Sin embargo, tenga en cuenta que NFS duplica los tiempos de espera con cada intento. Así que es mejor configurarlo timeo=1y más retrans=5o menos. Tenga en cuenta que esto ejercerá una gran presión sobre su servidor NFS después de reiniciar NFS. Intente no reiniciar su servicio NFS tan a menudo;)
bjanssen

Tu respuesta es correcta. También encontré otra solución simple. En el nodo que dice controlador NFS obsoleto, simplemente desmonte y vuelva a montar la carpeta.
mahmood

4

Prueba este script que escribí:

#!/bin/bash
# Purpose:
# Detect Stale File handle and remove it
# Script created: July 29, 2015 by Birgit Ducarroz
# Last modification: --
#

# Detect Stale file handle and write output into a variable and then into a file
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Remove : ‘ and ’ characters from the output
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Not used: replace space by a new line
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# read NFS_stales.txt output file line by line then unmount stale by stale.
#    IFS='' (or IFS=) prevents leading/trailing whitespace from being trimmed.
#    -r prevents backslash escapes from being interpreted.
#    || [[ -n $line ]] prevents the last line from being ignored if it doesn't end with a \n (since read returns a non-zero exit code when it encounters EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Unmounting due to NFS Stale file handle: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF

2

En el servidor NFS, UN-export y vuelva a exportar el sistema de archivos:

exportfs -u nfs-server: / file_system exportfs nfs-server: / file_system

En el cliente, monte el sistema de archivos

mount -t nfs nfs-server: / filesystem / mount_point


0

verifique lsof de la ruta específica y elimine el pid respectivo. Luego desmonte la partición y vuelva a montarla.


Esto se parece más a una solución alternativa que a una solución para el problema planteado en la pregunta.
asdmin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.