ファイル共有プロトコル NFS と CIFS/SMB の歴史と特徴
NAS (Network Attached Storage) とは、IP ネットワーク越しにファイル格納場所にアクセスする方式のストレージ全般を指します。
NAS と似た言葉に SAN (Storage Area Network) ストレージがありますが、NAS と SAN ストレージの違いについては以下をご参照ください。
上の記事にもある通り、NAS は自分のディスクの中でファイルシステムを構築し、NAS の OS 自体がファイルシステムを認識し、リモートの OS からは NFS や CIFS/SMB といったファイル共有プロトコルを介してファイル単位でアクセスされます。
NFS は主に UNIX/Linux 系の OS で発展したファイル共有プロトコルです。1984年にサン・マイクロシステムズにより規格が発表されて以来、発展を続け、現在の最新バージョンは 4.2 です。
一方、CIFS/SMB は Windows OS で発展したファイル共有プロトコルです。IBM が前身を作り、その後に Microsoft や Intel, 3COM 等とともに規格化されたプロトコルです。
初期は CIFS (読み方: しふす、Common Internet File Systems) という名称でしたが、SMB (読み方: えすえむびー、Server Message Block) バージョン 2 が登場して以来、『SMB1.0 = 拡張された CIFS』というのが MS の公式見解です。
The extended CIFS Protocol is known as the Server Message Block (SMB) Version 1.0 Protocol.
なので基本的には CIFS は古い呼び方で、SSL/TLS の SSL に当たるような存在でしょう。
SMB の最新バージョンは 3.1.1 です。
どちらも NAS としてよく使われるものですが、どのように異なるのでしょうか。
NFS と CIFS/SMB の特徴と違い
結論としては、NFSv3 までは「UNIX/Linux のマシン同士を手軽に共有する」という「マシンベース」の考え方でしたが、NFSv4 では CIFS/SMB と同様、「ユーザがファイルへアクセスする」という「ユーザベース」のコンセプトになり、だいぶ似てきました。
比較表を以下に示します。
CIFS/SMB | NFSv4 | NFSv3 | |
---|---|---|---|
仕様 | MS にて公開 CIFS / SMB | RFC にて公開 v4.2=RFC7862 v4.1=RFC7530 v4=RFC3530 | RFC にて公開 RFC1813 |
プロトコルポート | TCP/445 | TCP/2049 | TCP&UDP/2049+動的 |
認証モデル | ユーザベース | ユーザベース | マシンベース |
認証方式 | NTLM Kerberos v5 | AUTH_SYS (UNIX 認証) RPCSEC_GSS (Kerberos v5) | AUTH_SYS (UNIX 認証) |
メッセージ認証 (通信改ざん検知) | オプション (SMB暗号化) AES128-GCM/CCMにより メッセージ認証+通信暗号化 | オプション (krb5i, krb5p) krb5i=メッセージ認証のみ、 krb5p=メッセージ認証+通信暗号化 | なし |
通信暗号化 | なし | ||
ファイルロック | Nativeにサポート | Nativeにサポート | lockd, statdにて実現 (別機構) |
※アクセス制御に関してはあくまでプロトコルでの制御の話であり、実際にはこれに加えてサーバ内ファイルシステム (NTFS, XFS, ext4 等) のアクセス権にも制御されます。
Windows と Linux の実装状況
Windows と Linux のクライアント、サーバで NFS と SMB の両方に対応しています。つまり混在環境は実現できます。ただし、Windows クライアントでは NFS は v3 まで、Windows サーバでは NFS v4.1 までしか対応しておらず、Windows 系はやはり SMB が強いです。
混在環境でのファイルサーバを作るなら SMB のほうがお勧めです。
2020年12月現在の Windows, CentOS (Linux) での各プロトコルのバージョン対応状況を下表に示します。
CentOS8.2 に関しては SMB クライアントは cifs-utils (読み方: しふすゆーてぃるず) 6.8-3.el8、SMB サーバは samba (読み方: さんば) 4.11.2-13.el8 で確認しました。
OS | SMB | NFS | ||
---|---|---|---|---|
クライ アント | サーバ | クライ アント | サーバ | |
Windows10 | v3.1.1 | v3.1.1 | v3 | - (非対応) |
Windows Server 2019 | v3.1.1 | v3.1.1 | v3 | v4.1 |
CentOS 8.2.2004 | v3.1.1 | v3.1.1 | v4.2 | v4.2 |
速度
じゃあ速度はどうなのよ?ということで検証してみました。
結論としてはほぼ変わらない、という結果でした。(やや smb が速いか)
以下の条件で検証してみました。
- Windows Server 2019 で CIFS/SMB サーバとNFS サーバを設定
- Windows 10 と CentOS8.2 を CIFS/SMB クライアント, NFS クライアントとして設定
- クライアントからサーバへマウントし、ファイルをアップロード/ダウンロードしたときに掛かった秒数を計測
- ファイルは [ 500MiB を 1 ファイル] [1MiB を 500 ファイル] の 2 パターン
- 5回計測し、平均値を算出
- CentOS8.2 での NFS クライアントの挙動としてキャッシュを使う動きが見られたため、ダウンロード実施後に echo 3 > /proc/sys/vm/drop_caches でキャッシュをクリアしました。
結果は以下の通りです。Win 10 は NFS v3 までしか対応していないため、パフォーマンスは悪いです。プロトコルとしての比較なら CentOS での結果を比較を見るのがよいでしょう。
クライ アント | サーバ | Protocol | Up/Down | Data | 秒数 (5回平均) |
---|---|---|---|---|---|
win10 | win2019 | smb v3.1.1 | Upload | 500MiB*1ファイル | 1.494 |
1MiB*500ファイル | 4.666 | ||||
Download | 500MiB*1ファイル | 1.642 | |||
1MiB*500ファイル | 4.380 | ||||
nfs v3 | Upload | 500MiB*1ファイル | 5.444 | ||
1MiB*500ファイル | 13.158 | ||||
Download | 500MiB*1ファイル | 4.858 | |||
1MiB*500ファイル | 13.826 | ||||
cent8.2 | smb v3.1.1 | Upload | 500MiB*1ファイル | 3.394 | |
1MiB*500ファイル | 5.62 | ||||
Download | 500MiB*1ファイル | 2.002 | |||
1MiB*500ファイル | 2.772 | ||||
nfs v4.1 | Upload | 500MiB*1ファイル | 3.712 | ||
1MiB*500ファイル | 5.864 | ||||
Download | 500MiB*1ファイル | 1.996 | |||
1MiB*500ファイル | 3.154 |
同様に、サーバを CentOS8.2 にして計測した結果を示します。
クライ アント | サーバ | Protocol | Up/Down | Data | 秒数 (5回平均) |
---|---|---|---|---|---|
win10 | cent8.2 | smb v3.1.1 | Upload | 500MiB*1ファイル | 2.512 |
1MiB*500ファイル | 5.354 | ||||
Download | 500MiB*1ファイル | 1.554 | |||
1MiB*500ファイル | 4.036 | ||||
nfs v3 | Upload | 500MiB*1ファイル | 2.908 | ||
1MiB*500ファイル | 24.266 | ||||
Download | 500MiB*1ファイル | 2.176 | |||
1MiB*500ファイル | 2.862 | ||||
cent8.2 | smb v3.1.1 | Upload | 500MiB*1ファイル | 4.540 | |
1MiB*500ファイル | 6.130 | ||||
Download | 500MiB*1ファイル | 1.958 | |||
1MiB*500ファイル | 2.868 | ||||
nfs v4.2 | Upload | 500MiB*1ファイル | 4.624 | ||
1MiB*500ファイル | 6.166 | ||||
Download | 500MiB*1ファイル | 1.566 | |||
1MiB*500ファイル | 2.182 |
なお、検証環境は以下の通りです。
[ Virtual BOX を動作させるホスト PC ]
- CPU: Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz 2.59 GHz
- Mem: 32 GB
- SSD: INTEL SSDPEKNW010T9
- OS: Windows 10 Home (20H2)
- VirtualBOX: 6.1.14 r140239 (Qt5.6.2)
[ VM のリソース (クライアント/サーバ共通) ]
- CPU: 2 core
- Mem: 4 GB
- Disk: Windows = 50 GB, CentOS = 8 GB
今回の構成ではこのような結果になりましたが、ネットワーク遅延 (RTT) のある環境、アクセス制御をおこなった環境などでは異なるかもしれませんのでごめんあそばせ。
コメント