見出し画像

アップルさんのSMBついての覚え書き

アップルさんは書き込みの性能向上のために、SMBに独自の機能拡張をしています。関連する事柄について私も記憶が曖昧になっているので、再度まとめてみました。

アップルさんの独自のSMBの機能拡張とは?

以前はアップルの macOS は Apple File Share Protocol というネットワーク上のファイルの共有の仕組みがありました。近年になって、NFSやSMBも使えるようになっています。一方で、macOS がSMBでネットワーク上のストレージや他のサーバーと通信をする際、書き込みの性能向上を目指した機能拡張としてSMB2 CREATEコマンドの機能拡張をされています。以前はマイクロソフトさんのプロトコルの文書のようなものがネット上に公開されていたように記憶しますが、この記事を書いている本日現在、見つけることができません。もしかしたら、あまり使われていないのかもしれません。

見わけるには?

最初にご紹介するのは 、SNIAにある、 SMB2 の AAPLコンテキストの拡張についてDELL EMC さんの発表された時の資料です。2016年のものでありますが、パケットや流れもかかれており、わかりやすいと思います。

https://www.snia.org/sites/default/files/SDC/2016/presentations/smb/RafalSzczesniak-SumaithriMukkamalla_Apple_OSX_Extensions_SMB2_Wide_Final_Revision.pdf

SMB2 CREATE のリクエストが流れるときに、様々な情報を付加して「こう言うアクセスをしたい」とサーバー側に伝えます。この情報の一部に、「コンテキスト」と呼ばれる情報があります。
アップルさんの独自拡張であると言うことを見わける一つの目安は、Wireshark等でパケットを見ると、クライアント側からのリクエストに、AAPL言う文字列を見て取ることができるというものです。

Windowsとの通信

以下の例は、通常のWindowsとの通信です。SMB2のリクエストの一部に、ExtraInfoとあります。ここには、リース(SMB2で追加されたキャッシングの仕組み)などの情報が流れてきます。(参考文献2)

SMB2 (Server Message Block Protocol version 2)
    SMB2 Header
        ProtocolId: 0xfe534d42
(中略)
    Create Request (0x05)
        StructureSize: 0x0039
            0000 0000 0011 100. = Fixed Part Length: 28
            .... .... .... ...1 = Dynamic Part: True
        Oplock: No oplock (0x00)
(中略)
        Blob Length: 48
        ExtraInfo SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST SMB2_CREATE_QUERY_ON_DISK_ID
            Chain Element: SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST "MxAc"
                Chain Offset: 0x00000018
                Tag: MxAc
                    Blob Offset: 0x00000010
                    Blob Length: 4
                Blob Offset: 0x00000018
                Blob Length: 0
                Data: NO DATA
            Chain Element: SMB2_CREATE_QUERY_ON_DISK_ID "QFid"
                Chain Offset: 0x00000000
                Tag: QFid
                    Blob Offset: 0x00000010
                    Blob Length: 4
                Blob Offset: 0x00000018
                Blob Length: 0
                Data: NO DATA

macOSとの通信

勝手にパケットを覗いてみました。残念ながら、私の環境ではAAPLのコンテキストを見ることはできませんでした。OSのバージョン他依存する条件があるものと思われます。

代わりに、コンテキストと私が言っている場所を示します。
例えば、この記事に添付したファイルでは、フレーム 63 で、ExtraInfoにコンテキストが含まれているのが分かります。例では、"MxAC" とはいっていますが、Chain Elementの要素として、AAPLが入ってきます。

$ tshark -tad -r aapl.pcap -2 -Y 'frame.number == 63' -V
Frame 63414 bytes on wire (3312 bits), 414 bytes captured (3312 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Apr  42022 16:06:33.519060000 JST
(..........)
SMB2 (Server Message Block Protocol version 2)
    SMB2 Header
(..........)
        Blob Offset: 0x00000080
        Blob Length: 24
        ExtraInfo SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST
            Chain Element: SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST "MxAc"
                Chain Offset: 0x00000000
                Tag: MxAc
                    Blob Offset: 0x00000010
                    Blob Length: 4
                Blob Offset: 0x00000000
                Blob Length: 0
                Data: NO DATA

アップルさんの公式の文書

アップルさんの公式の文書で、執筆時点で参照できるものは以下のものです。「ソースコードを見れば自明でしょ」と言うことなのかもしれませんが、もう少し情報があっても良い気がします。(私自身はアップルのデベロッパー登録をしていないので、もしかすると有償であればきちんとした情報があるのかもしれません)

公式文書

Documentation ArchiveをSMBのキーワードで検索、2016年にかかれた、TimeMachineをSMB経由で使うための文書が出てきます。この記事にもAAPLが出てきます。

これ以外はリリースノートのみです。

ソースコード

オープンソースにあたるところはアップルさんも公開していらっしゃいます。ただし、利用にあたってはどんな条件が必要かはきちんとご確認ください。

その他細々したもの

機能拡張が目指したもの

機能拡張が目指したのは、macOS側でのディレクトリキャッシュの性能のようです。フォルダー内に万単位でファイルがあるときの性能向上が期待されました。

Solarisが対応しなかった理由

勤め先の製品の Solaris という OS でも機能拡張については対応を検討していました。その当時の結論は「古いOSでは性能向上が見られるが、より新しい macOS で試験したところ、(予定した)実装範囲では性能の向上があまり認められず、他の機能拡張を優先する」というものでした。(この頃はまだ MacOS Merverickでした)
なお外部から見ることはできませんが、機能拡張の番号は 21920320 です。

Linuxの対応

このあたり明るくありませんが、vfs_fruit というVFS 層での互換性確保の取り組みがあるようです。AFP の頃の古い取り組みにも見えますが、オープンソースはよく別のプロジェクトに引き継がれていたり、ちょっと見ただけでは分からないことも多いので、私の勘違いかもしれません。

dtraceがあるよ

アップルさんのサイトに行くと、SMBクライアント用の dtrace スクリプトが公開されています。アップルさんが解析の時に使った物でしょうから、鍵となる関数名を探すのには良いのではないでしょうか? dtraceでは各関数の入り口と出口で時間を記録して所要時間を計ったり、間数毎の所要時間を集計すればどこで時間がかかっているかを見ることができます。

Congestion controlのロジックが異なる

性能劣化の際に、他の理由として、macOS のデフォルトの congestion control の扱い方が関係することがあります。SMBではなく下のレイヤーの問題を疑うのであれば、TCPのシーケンス番号などを見るのも一つの方法です。Wiresharkさんに良い記事があったので、添付しておきます。

最後に

「情報古い!」とか「ここにも書いてあるよ!」というツッコミは大歓迎です。よろしくお願いします!

参考文献

  1. Sailing in Uncharted Waters A story of implementing Apple extensions for SMB2 in EMC Isilon clustered storage, Storage Developer Conference, SNIA, 2016 
    https://www.snia.org/sites/default/files/SDC/2016/presentations/smb/RafalSzczesniak-SumaithriMukkamalla_Apple_OSX_Extensions_SMB2_Wide_Final_Revision.pdf

  2. Microsoft Open Specification - 2.2.13.2 SMB2_CREATE_CONTEXT Request Values
    https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/75364667-3a93-4e2c-b771-592d8d5e876d

  3. Wireshark.org macOS SMB uploads to Windows Server share hang for dozen of seconds
    https://ask.wireshark.org/question/22062/macos-smb-uploads-to-windows-server-share-hang-for-dozen-of-seconds/

  4. Apple, Inc., Documentation Archive - Time Machine over SMB Specification
    https://developer.apple.com/library/archive/releasenotes/NetworkingInternetWeb/Time_Machine_SMB_Spec/index.html#//apple_ref/doc/uid/TP40017496

  5. Apple Inc., Source Browser (SMB)
    https://opensource.apple.com/source/smb/

  6. Apple OSS Distribution - dtrace
    https://github.com/apple-oss-distributions/SMBClient/tree/SMBClient-286.40.9/dtrace_scripts

  7. samba.org vfs_fruit
    http://www.samba.gr.jp/project/translation/4.2/htmldocs/manpages/vfs_fruit.8.html

試験結果のパケットファイル

以下のパケットファイルは、アップルさんの機能拡張を用いたパケットを収集する目的で、テスト環境で Windows 2019 と macOS 12.2.1 (Montrey) の間での通信を収集したものです。
何も秘密にすることは含まれていませんので、自由にダウンロードして眺めてみてください。

この記事はここまでです。 最後まで読んでいただいてありがとうございます。 気に入っていただいたなら、スキを押していただいたり、 共有していただけるとうれしいです。 コメントや感想大歓迎です!