Yeniden başlatmanın ardından “Eski NFS dosya tanıtıcısı”


16

Sunucu düğümünde dışa aktarılan bir klasöre erişmek mümkündür. Ancak, yeniden başlatıldıktan sonra (hem sunucu hem de istemci), klasöre artık istemcilerden erişilemez.

Sunucuda

# ls /data
Folder1
Forlder2

ve / etc / export dosyası şunları içerir:

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

İstemcide

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

İstemci tarafından paylaşılan klasörde bir sorun olmadığını söylemek zorundayım, ancak yeniden başlatıldıktan sonra (sunucu ve istemci), bu mesajı görüyorum.

Bunu düzeltmenin bir yolu var mý?

Yanıtlar:


22

Yeniden başlatma sırası önemlidir. İstemcilerden sonra sunucuyu yeniden başlatmak bu duruma neden olabilir. Eski NFS tanıtıcısı, istemcinin açık bir dosyaya sahip olduğunu, ancak sunucunun artık dosya tanıtıcısını tanımadığını gösterir. Bazı durumlarda, NFS zaman aşımından sonra veri yapılarını temizler. Diğer durumlarda, NFS veri yapılarını kendiniz temizlemeniz ve daha sonra NFS'yi yeniden başlatmanız gerekir. Bu yapıların bulunduğu yerler bir şekilde O / S'ye bağımlıdır.

NFS'yi önce sunucuda, sonra istemcilerde yeniden başlatmayı deneyin. Bu, dosya tanıtıcılarını temizleyebilir.

NFS sunucularının başka sunuculardan açılan dosyalarla yeniden başlatılması önerilmez. Bu, özellikle açık dosya sunucuda silinmişse sorunludur. Sunucu yeniden başlatılıncaya kadar dosyayı açık tutabilir, ancak yeniden başlatma sunucu tarafındaki bellek içi dosya tanıtıcısını kaldıracaktır. Böylece istemci artık dosyayı açamaz.

Sunucudan hangi bağların kullanıldığını belirlemek zor ve güvenilir değildir. showmount -aSeçenek bazı etkin bağlar gösterebilir, ancak bunların tümünün rapor olmayabilir. Kilitli dosyaların tanımlanması daha kolaydır, ancak kilitlemenin etkinleştirilmesini gerektirir ve dosyaları kilitlemek için istemci yazılımına güvenir.

lsofBağlarda açık dosyaları olan işlemleri tanımlamak için istemcilerde kullanabilirsiniz .

NFS bağlarımda hardve intrbağlama seçeneklerini kullanıyorum . Bu hardseçenek ES'nin süresiz olarak yeniden denenmesine neden olur. Bu intrseçenek, NFS G / Ç'nin tamamlanmasını beklerse işlemlerin öldürülmesine izin verir.


Kullanmak hard, intriyi bir tavsiye. Ancak, NFS'nin her denemede zaman aşımını iki katına çıkardığını unutmayın. Böylece en iyi set timeo=1ve retrans=5benzeri. Bunun , NFS yeniden başlatıldıktan sonra NFS sunucunuza büyük yük getireceğini unutmayın . NFS hizmetinizi çok sık yeniden başlatmamaya çalışın;)
bjanssen

Cevabınız doğru. Ayrıca başka bir basit çözüm buldum. Eski NFS işleyicisi yazan düğümde, klasörü yeniden takmanız ve yeniden takmanız yeterlidir.
mahmood

4

Yazdığım bu komut dosyasını deneyin:

#!/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

NFS sunucusunda dosya sistemini BM dışa aktarın ve yeniden dışa aktarın:

exportfs -u nfs-sunucu: / dosya_sistem exportfs nu-sunucu: / dosya_sistem

İstemcide dosya sistemini bağlayın

mount -t nfs nfs-server: / dosya sistemi / mount_point


0

belirli bir yolun kontrol ve ilgili pid öldürmek. Ardından bölümü çıkarın ve geri takın.


bu, soruda belirtilen sorunun çözümünden daha çok bir çözüm gibidir.
asdmin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.