再起動せずにNFSクライアントを再初期化する


10

私は自分のサーバーで作業しており、そこからNFSを使用して1つのディレクトリをエクスポートします。もちろん、1週間ほどサーバーを再起動umountすると、ワークステーションのエクスポートファイルシステム(/etc/fstab起動時にマウントされる)を何度も忘れてしまいました。その間に私はumount事実の後と再マウントすることができました(私は使用していませんautofs):

umount -fl /data0
mount /data0

しかし、これはもはや機能しません。

私がすることはできません別のディレクトリ(ハングマウント)上のサーバからエクスポートされたディレクトリをマウントしますが、私はすることができ、NFSは私のワークステーション上で実行中の仮想マシン上でそのエクスポートされたディレクトリをマウントします。

私が試したのはrmmodnfsnfsv3モジュールを削除()することです(これは機能しません:)Resource temporarily unavailablelsofハングアップします。mount経由でマウントされたものは表示されませんnfs。これはおそらく 'umount -l'を複数回使用した結果ですが、最初の2回は問題なく機能しました。

私はその間にサーバーを再起動しましたが、それなしではマウントできず、違いはありません。私も使用しましたservice nfs-kernel-server restart。クライアントワークステーションを再起動すると、すべてが正常に戻ると思います。

これから回復し、再起動せずにワークステーションでNFSクライアント側を再初期化する方法はありますか?
再起動せずにこれを修正できない場合、使用を開始してもこれは再発しませんautofsか?

lsof -b 最後の行でハングアップします:

lsof: avoiding readlink(/run/user/1001/gvfs): -b was specified.
lsof: avoiding stat(/run/user/1001/gvfs): -b was specified.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1001/gvfs
      Output information may be incomplete.

その前の行にははありません/data0

のエントリ/etc/fstab

192.168.0.2:/data0 /data0  nfs  defaults,auto,nolock,user 0 2

「しかし、最初の2回は問題なく動作しました」...ロシアのルーレットを思い出させます。lsof -bハングアップしますか?
muru

@muruはい、ハングします。Qを出力で更新しました。ところで、私は誰もロシアのルーレットで負けることについて不平を言うのを聞いたことがないので、それは双方に有利なゲームでなければなりません。私は通常、X回のカウントではなく、決して、一度、または常に、正常に機能することを期待しますが、おそらく状況は異なっていました。
Anthon

どのディストリビューションを使用していますか?プロセスは大きく異なります。
Graeme

@GraemeこれはLinix Mint 17.1(Rebecca)です
Anthon

それがUbuntuでどのように機能するかはわかりませんupstart。おそらく、nfs-commonパッケージ内のすべてのサービスを再起動する必要があります。いくつかあるようです。順序も問題になる可能性が高いので、依存関係の順序で停止してから開始してください。おそらくrpcbind、最後のストップ/最初のスタートとしても実行したいでしょう。私はこれを以前にDebianで行ったことがありますが、素晴らしいnfs-commonサービスが1つだけあります。
Graeme

回答:


5

@PaperMonkeyがコメントで示唆しているように、永久に再試行することを含むデフォルトのマウントオプションを使用したため、混乱する可能性があります。

intr以前は、壊れたNFSマウントへのI / Oでスタックしていたものを簡単に中断できる方法でしたが、現在は何もできません。 SIGKILL少なくとも、NFSでスタックしているプロセスに割り込むことができますnfs(5)。マウントオプションについては、そのマニュアルページを参照してください。

NFSが永久に再試行しないようにする場合softは、デフォルトの代わりに使用しhardます。

オートマウンターの使用もお勧めします。必要に応じて、/ net / host / foo / barへのシンボリックリンクを作成します。

多くの場合、リブートするだけの方が簡単ですが、理論的には、NFSでスタックしているプロセスをすべてkill -9(つまりkill -KILL)できるはずです。次に、umount -fが機能する可能性があります。タブの補完によりNFSマウントでスタックするプロセスが増えないように注意してください。


理論的には、lsofがハングしたときにこれらのプロセスを見つけるのは困難です。
kmarsh

@kmarsh:Dps / topの状態(Disk-sleep)のプロセスは、おそらくNFSでスタックしています。
Peter Cordes

1
「ハード」ではなく「ソフト」を使用すると、NFSサーバーが一時的に利用できなくなるたびにデータが失われる可能性があることに注意してください。
Marki555

4

以下は、RPMベースのディストリビューションでこの問題を修正するために実行するコマンドのリストです。

service rpcbind stop
service nfslock stop
rm -rf /var/lib/nfs/statd/sm/*
rm -rf /var/lib/nfs/statd/sm.bak/*

その後:

umount -f /share

1

を使用autofsすると、今後この問題を回避できます。最大の利点autofsは、使用しようとするまでディレクトリをマウントしようとしないことです。これは、マウントポイントの破損を回避し、無期限にマウントしようとしないことを意味します。アンマウントのタイムアウト期間を設定できます(通常はショート)。このpretimout期間中に自動マウントが再試行するかどうかはわかりませんが、通常、自動マウントのタイムアウトを数秒に設定します。

再起動せずに問題を解決するには、(/ etc / fstabに記載されているすべてをマウント解除する)(/ etc / fstabにすべてマウントする)で問題が解決する可能性がありますが、失われたディレクトリにホームディレクトリが含まれていない限り、他の場所に作業を保存して再起動することをお勧めします。umount -amount -a


0

lsofコマンドの結果を使用して、古いファイルシステムへの参照を保持しているクライアント上のプロセスを見つけ、それらのプロセスを強制終了します。

umount -f / data0

サーバーにpingしてからドライブを再マウントできることを確認してください。必要なプロセスを再起動します。

クラスター

クラスタサーバーのセットアップを実行すると、サーバーがフェールオーバーする必要があるたびに、古いnfsファイルハンドルが取得されます。これを回避するには、fsidオプションを使用してファイルシステムをエクスポートする必要があります。fsidの数は、2つのサーバーのそれぞれのファイルシステムで同じでなければなりません。ファイルの複製が確実に行われるようにするのはユーザーの責任です。以下のmanページのスニペットをご覧ください。

fsid = num | root | uuid NFSは、エクスポートする各ファイルシステムを識別できる必要があります。通常は、ファイルシステムのUUID(ファイルシステムにそのようなものがある場合)またはファイルシステムを保持しているデバイスのデバイス番号(ファイルシステムがデバイスに格納されている場合)を使用します。すべてのファイルシステムがデバイスに保存されているわけではなく、すべてのファイルシステムがUUIDを持っているわけではないため、ファイルシステムを識別する方法をNFSに明示的に指示する必要がある場合があります。これは、fsid =オプションで行われます。

NFSv4の場合、エクスポートされたすべてのファイルシステムのルートである識別可能なファイルシステムがあります。これはfsid = rootまたはfsid = 0で指定され、どちらもまったく同じことを意味します。

他のファイルシステムは、小さな整数、または32桁の16進数と任意の句読点を含むUUIDで識別できます。

Linuxカーネルバージョン2.6.20以前はUUID設定を認識しないため、そのようなカーネルにfsidオプションを設定する必要がある場合は、短整数を使用する必要があります。小さい数とUUIDの両方の設定がサポートされているため、古いカーネルと新しいカーネルの両方で同じ構成を機能させることができます。


彼はすでにlsofがハングすることを言った。
kmarsh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.