18 votes

"Fichier NFS distant périmé" après le redémarrage"

Sur le nœud serveur, il est possible d'accéder à un dossier exporté. Cependant, après les redémarrages (à la fois du serveur et du client), le dossier n'est plus accessible depuis les clients.

Sur le serveur

# ls /data
Dossier1
Dossier2

et le fichier /etc/exports contient

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

Sur le client

# ls /data
ls: impossible d'accéder à /data: Poignée de fichier NFS obsolète

Je dois dire qu'il n'y avait aucun problème avec le dossier partagé du côté client cependant après les redémarrages (serveur et client), je vois ce message.

Y a-t-il un moyen de résoudre cela?

27voto

BillThor Points 27096

L'ordre des redémarrages est important. Redémarrer le serveur après les clients peut entraîner cette situation. Le handle NFS obsolète indique que le client a un fichier ouvert, mais que le serveur ne reconnaît plus le handle du fichier. Dans certains cas, NFS nettoiera ses structures de données après un délai. Dans d'autres cas, vous devrez nettoyer les structures de données NFS vous-même et redémarrer NFS par la suite. L'emplacement de ces structures dépend quelque peu du système d'exploitation.

Essayez d'abord de redémarrer NFS sur le serveur puis sur les clients. Cela peut effacer les handles de fichiers.

Le redémarrage des serveurs NFS avec des fichiers ouverts depuis d'autres serveurs n'est pas recommandé. Cela pose particulièrement problème si le fichier ouvert a été supprimé sur le serveur. Le serveur peut conserver le fichier ouvert jusqu'à son redémarrage, mais le redémarrage supprimera le handle de fichier en mémoire du côté du serveur. Ensuite, le client ne pourra plus ouvrir le fichier.

Déterminer quelles montages ont été utilisés à partir du serveur est difficile et peu fiable. L'option showmount -a peut montrer certains montages actifs, mais ne rapporte pas tous. Les fichiers verrouillés sont plus faciles à identifier, mais nécessitent que le verrouillage soit activé et reposent sur le logiciel client pour verrouiller les fichiers.

Vous pouvez utiliser lsof sur les clients pour identifier les processus qui ont des fichiers ouverts sur les montages.

J'utilise les options de montage hard et intr sur mes montages NFS. L'option hard fait en sorte que les E/S soient réessayées indéfiniment. L'option intr permet aux processus d'être tués s'ils attendent que les E/S NFS se terminent.

5voto

Birgit Ducarroz Points 51

Essayez ce script que j'ai écrit:

#!/bin/bash
# Purpose:
# Détecter une poignée de fichiers obsolètes et la supprimer
# Script créé le 29 juillet 2015 par Birgit Ducarroz
# Dernière modification: --

# Détecter une poignée obsolète de fichiers et écrire la sortie dans une variable puis dans un fichier
mounts=`df 2>&1 | grep 'Stale file handle' |awk '{print ""$2"" }' > NFS_stales.txt`
# Supprimer les caractères : ‘ et ’ de la sortie
sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt

# Non utilisé: remplacer l'espace par un saut de ligne
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# Lire le fichier de sortie NFS_stales.txt ligne par ligne, puis démonter obsolète par obsolète.
#    IFS='' (ou IFS=) empêche les espaces avant/après d'être supprimés.
#    -r empêche l'interprétation des échappements de barre oblique.
#    || [[ -n $line ]] empêche la dernière ligne d'être ignorée si elle ne se termine pas par un \n (puisque read renvoie un code d'erreur non nul lorsqu'il rencontre EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Démontage en raison d'une poignée de fichiers obsolètes NFS: $line"
    umount -fl $line
done < "NFS_stales.txt"
#EOF

En attendant, le script ci-dessus ne fonctionne pas avec tous les serveurs. Voici une mise à jour:

#!/bin/bash
# Purpose:
# Détecter une poignée de fichiers obsolètes et la supprimer
# Script créé le 29 juillet 2015 par Birgit Ducarroz
# Dernière modification: 23.12.2020  /bdu
#

MYMAIL="mon.mail@quelquechose.com"
THIS_HOST=`hostname`

# Détecter une poignée de fichiers obsolètes et écrire la sortie dans une variable puis dans un fichier
mounts=`df 2>&1 | grep 'Stale' |awk '{print ""$2"" }' > NFS_stales.txt`
sleep 8

# Supprimer les caractères spéciaux de la sortie

sed -r -i 's/://' NFS_stales.txt && sed -r -i 's/‘//' NFS_stales.txt && sed -r -i 's/’//' NFS_stales.txt && sed -r -i 's/`//' NFS_stales.txt  && sed -r -i "s/'//" NFS_stales.txt 

# Non utilisé: remplacer l'espace par un saut de ligne
# stales=`cat NFS_stales.txt && sed -r -i ':a;N;$!ba;s/ /\n /g' NFS_stales.txt`

# Lire le fichier de sortie NFS_stales.txt ligne par ligne, puis démonter obsolète par obsolète.
#    IFS='' (ou IFS=) empêche les espaces avant/après d'être supprimés.
#    -r empêche l'interprétation des échappements de barre oblique.
#    || [[ -n $line ]] empêche la dernière ligne d'être ignorée si elle ne se termine pas par un \n (puisque read renvoie un code d'erreur non nul lorsqu'il rencontre EOF).

while IFS='' read -r line || [[ -n "$line" ]]; do
    message=`echo "Démontage en raison d'une poignée de fichiers obsolètes NFS: $line"`
    echo echo | mail -s "$THIS_HOST: Poignée de fichiers NFS obsolète démontée" $MYMAIL <<< $message
    umount -f -l $line
done < "NFS_stales.txt"
mount -a

#EOF

3voto

agbb Points 601

Sur le serveur NFS, démontez et remontez à nouveau le système de fichiers :

exportfs -u nfs-serveur:/système_de_fichiers exportfs nfs-serveur:/système_de_fichiers

Sur le client, montez le système de fichiers

mount -t nfs nfs-serveur:/système_de_fichiers /point_de_montage

0voto

Yura Loginov Points 141

Vérifiez lsof du chemin spécifique et tuez le pid correspondant. Ensuite, démontez la partition et remontez-la.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X