次の方法で共有


サーバー メッセージ ブロック (SMB) の高度なトラブルシューティング

仮想オペレーターを試す - SMB に関する一般的な問題をすばやく特定、解決するのに役立ちます。

サーバー メッセージ ブロック (SMB) は、クライアントがサーバー上のリソースにアクセスできるようにするためのファイル システム操作のネットワーク トランスポート プロトコルです。 SMB プロトコルの主な目的は、TCP/IP 経由で 2 つのシステム間のリモート ファイル システム アクセスを有効にすることです。

SMB のトラブルシューティングは非常に複雑な場合があります。 この記事は、包括的なトラブルシューティング ガイドではなく、SMB の効果的なトラブルシューティング方法の基本を理解するための簡単な入門書です。

ツールとデータ収集

品質 SMB のトラブルシューティングの重要な側面の 1 つは、正しい用語を伝えることです。 そのため、この記事では、データ収集と分析の精度を確保するための基本的な SMB 用語について説明します。

SMB サーバー (SRV) は、ファイル システム (ファイル サーバーとも呼ばれます) をホストしているシステムを指します。 SMB クライアント (CLI) は、OS のバージョンやエディションに関係なく、ファイル システムにアクセスしようとしているシステムを指します。

たとえば、Windows Server 2016 を使用して Windows 10 でホストされている SMB 共有に到達する場合、Windows Server 2016 は SMB クライアント、Windows 10 は SMB サーバーです。

データの収集

SMB の問題をトラブルシューティングする前に、まずクライアント側とサーバー側の両方でネットワーク トレースを収集することをお勧めします。 次のガイドラインが適用されます。

  • Windows システムでは、netshell (netsh)、Network Monitor、Message Analyzer、 Wireshark を使用してネットワーク トレースを収集できます。

  • サード パーティ製デバイスには通常、tcpdump (Linux/FreeBSD/Unix)、pktt (NetApp) などのインボックス パケット キャプチャ ツールがあります。 たとえば、SMB クライアントまたは SMB サーバーが Unix ホストである場合は、次のコマンドを実行してデータを収集できます。

    # tcpdump -s0 -n -i any -w /tmp/$(hostname)-smbtrace.pcap
    

    キーボードから Ctrl + C キーを押してデータの収集を停止します。

問題の原因を検出するには、両側のトレース (CLI、SRV、またはその間のどこか) を確認します。

netshell を使用してデータを収集する

このセクションでは、netshell を使用してネットワーク トレースを収集する手順について説明します。

重要

Microsoft Message Analyzer ツール は廃止されたためWireshark で ETL ファイルを分析することをお勧めします。 以前にツールをダウンロードし、詳細を探しているユーザーについては、「 Message Analyzer のインストールとアップグレード」を参照してください。

Netsh トレースによって ETL ファイルが作成されます。 ETL ファイルは、Message Analyzer (MA)、ネットワーク モニター 3.4 (Windows > ネットワーク モニター パーサーにパーサーを設定)、 Wireshark で開くことができます。

  1. SMB サーバーと SMB クライアントの両方で、ドライブ CTemp フォルダーを作成します。次に、次のコマンドを実行します。

    netsh trace start capture=yes report=yes scenario=NetConnection level=5 maxsize=1024 tracefile=c:\Temp\netTrace.etl
    

    PowerShell を使用している場合は、次のコマンドレットを実行します。

    New-NetEventSession -Name trace -LocalFilePath "C:\Temp\netTrace.etl" -MaxFileSize 1024
    
    Add-NetEventPacketCaptureProvider -SessionName trace -TruncationLength 1500
    
    Start-NetEventSession trace
    
  2. 問題を再現します。

  3. 次のコマンドを実行してトレースを停止します。

    netsh trace stop
    

    PowerShell を使用している場合は、次のコマンドレットを実行します。

    Stop-NetEventSession trace  
    Remove-NetEventSession trace
    

転送されるデータの最小量のみをトレースする必要があります。 パフォーマンスの問題の場合は、状況が許すならば、常に良い場合のトレースと悪い場合のトレースの両方を取得します。

トラフィックを分析する

SMB は、ネットワーク トランスポート プロトコルとして TCP/IP を使用するアプリケーション レベルのプロトコルです。 そのため、SMB の問題は、TCP/IP の問題によっても発生する可能性があります。

TCP/IP で次のいずれかの問題が発生するかどうかを確認します。

  1. TCP 3段階ハンドシェイクが完了しません。 これは通常、ファイアウォール ブロックがあるか、サーバー サービスが実行されていないことを示します。

  2. 再送信が行われている。 これにより、TCP 輻輳調整が複合的に行われるため、ファイル転送が遅くなる可能性があります。

  3. TCP リセットが続く 5 回の再送信は、システム間の接続が失われたか、SMB サービスの 1 つがクラッシュまたは応答を停止したことを意味する可能性があります。

  4. TCP 受信ウィンドウが減少しています。 これは、ストレージの速度が低下したり、補助関数ドライバー (AFD) Winsock バッファーからデータが取得されないなどの問題が原因で発生する可能性があります。

顕著な TCP/IP の問題がない場合は、SMB エラーを探します。 この手順を実行するには、以下のステップに従ってください。

  1. MS-SMB2 プロトコルの仕様に対して SMB エラーを常に確認してください。 SMB エラーの多くは無害です (有害ではありません)。 エラーが次のいずれかの問題に関連していると結論付ける前に、SMB がエラーを返した理由を確認するには、次の情報を参照してください。

    • MS-SMB2 メッセージ構文に関する記事では、各 SMB コマンドとそのオプションについて詳しく説明しています。

    • MS-SMB2 クライアント処理に関する記事では、SMB クライアントが要求を作成し、サーバー メッセージに応答する方法について詳しく説明します。

    • MS-SMB2 サーバー処理に関する記事では、SMB サーバーが要求を作成し、クライアント要求に応答する方法について詳しく説明します。

  2. FSCTL_VALIDATE_NEGOTIATE_INFO (validate negotiate) コマンドの直後に TCP リセット コマンドが送信されるかどうかを確認します。 その場合は、次の情報を参照してください。

    • クライアントまたはサーバーでネゴシエートの検証プロセスが失敗した場合、SMB セッションを終了 (TCP リセット) する必要があります。

    • WAN オプティマイザーが SMB ネゴシエート パケットを変更しているため、このプロセスが失敗する可能性があります。

    • 接続が途中で終了した場合は、クライアントとサーバー間の最後の交換通信を特定します。

プロトコルを分析する

ネットワーク トレースの実際の SMB プロトコルの詳細を調べ、使用されている正確なコマンドとオプションを理解します。

  • SMB は、実行するように言われたことのみを行うことに注意してください。

  • SMB コマンドを調べることで、アプリケーションが何をしようとしているかについて多くのことを学ぶことができます。

コマンドと操作をプロトコル仕様と比較して、すべてが正しく動作していることを確認します。 そうでない場合は、根本原因に関する詳細情報を調べるために、より近いデータまたは下位レベルのデータを収集します。 この手順を実行するには、以下のステップに従ってください。

  1. 標準パケット キャプチャを収集します。

  2. netsh コマンドを実行して、ネットワーク スタックに問題があるか、Windows フィルタリング プラットフォーム (WFP) アプリケーション (ファイアウォールやウイルス対策プログラムなど) にドロップしたかに関する詳細をトレースして収集します。

  3. 他のすべてのオプションが失敗した場合は、SMB 自体で問題が発生したと思われる場合、または根本原因を特定するのに十分なデータがない場合は、t.cmdを収集します。

例えば次が挙げられます。

  • 1 つのファイル サーバーへのファイル転送が遅くなります。

  • 両側トレースは、SRV が READ 要求にゆっくりと応答することを示しています。

  • ウイルス対策プログラムを削除すると、遅いファイル転送が解決されます。

  • この問題を解決するには、ウイルス対策プログラムのマニュファクターに問い合わせてください。

必要に応じて、トラブルシューティング中にウイルス対策プログラムを一時的にアンインストール することもできます

イベント ログ

次のスクリーンショットに示すように、SMB クライアントと SMB サーバーの両方に詳細なイベント ログ構造があります。 問題の根本原因を見つけるのに役立つイベント ログを収集します。

イベント ログ

このセクションでは、SMB 関連のシステム ファイルの一覧を示します。 システム ファイルを更新したままにするには、最新の 更新プログラムのロールアップ がインストールされていることを確認します。

%windir%\system32\Drivers の下に示される SMB クライアントのバイナリ:

  • RDBSS.sys

  • MRXSMB.sys

  • MRXSMB10.sys

  • MRXSMB20.sys

  • MUP.sys

  • SMBdirect.sys

%windir%\system32\Drivers の下に示される SMB サーバーのバイナリ:

  • SRVNET.sys

  • SRV.sys

  • SRV2.sys

  • SMBdirect.sys

  • %windir%\system32 の下

  • srvsvc.dll

SMB コンポーネント

修正候補を更新する

SMB の問題をトラブルシューティングする前に、次のコンポーネントを更新することをお勧めします。

  • ファイル サーバーにはファイル ストレージが必要です。 ストレージに iSCSI コンポーネントがある場合は、それらのコンポーネントを更新します。

  • ネットワーク コンポーネントを更新します。

  • パフォーマンスと安定性を向上させるには、Windows Core を更新します。

リファレンス

Microsoft SMB プロトコル パケット交換シナリオ