一つの旅
旅の経緯
その頃私はSamba(オープンソースのSMBサーバー)の開発にいそしんでいた。世界中に散らばった我々十数名のメンバーは、仕事や勉強、家族との時間を削ってSMBのネットワークトレースを分析し、コードを書いていた。暗中模索の非常にハードな作業だった。当時手に入った唯一の文献はすでに数年遅れのもので、当時の最新の仕様書ですら、それより数年前にリリースされたものだった。限られたリソースと日々蓄積されていくストレスの中、それでもこれらのドキュメントを全て理解しなければならなかった。あの頃の我々は、まるで悪の帝国に立ち向かう、反逆児のようだった。
このSambaの開発もかなりクレイジーだったが、これを今度はJavaでやろうなどという更にクレイジーなプロジェクトを思いついたのは、ちょうどこの頃だった。
20世紀の終わりの慌ただしい時代、Javaはまだ新しく、光り輝いていて、ダイエットコークのように華やかに宣伝されていた。Javaはウェブページへの組み込みが可能で、デスクトップやサーバー上でも動く。Javaが実装された小型のシングルボードコンピュータを、マニア向けに製造する会社も5、6社出てきていた。そのようなJavaのデバイスは、SMBエンジンにとって画期的なプラットホームだった。
私はプロジェクトのホームページを立ち上げ、Javaの本を初めて購入し、コードを書いて公開した。私はそのプロジェクトを「jCIFS」と名付けた。当時、SMBプロトコルがCIFSと呼ばれていたからだ。その話についてはまた後で話すとしよう。
しばらくして、jCIFSは、好奇心旺盛な一部の人たちに注目されるようになり、その支持者が徐々に広がって、やがて何人かのスポンサーまでつくようになった。中には私のつたないJavaプログラミングの批判をする者もいた。不愉快だったが、彼の意見はごもっともだったので、当然のごとく彼がリーダーとしてこのプロジェクトを引き継ぐことになった。私はSMBのノウハウの提供と、すでにSMBの知識が蓄積されたSambaチームとのパイプ役に転じた。このクレイジーなアイデアが、実際に動き始めた。
この展開は、私にとっては都合が良かった。当時プロトコル関係の文章を書き始めていて、人々がSMBの動作について尋ねてくるようになっていた。私は最初はメールで回答していたが、それがブログへの投稿となり、雑誌への記事の掲載という形になった。その後SNIA (Storage Network Industry Association) という団体のSMBテクニカル・リファレンスを書くことを頼まれ、最終的にSMB/CIFSに関する本をプロデュースすることになった。
jCIFSの軌跡
我々がこのjCIFSプロジェクトを開始した時、どこへ向かっているかなど全くわからなかった。誰が、どのように、何のために使うのかも知らなかった。しかしあの頃は、それを作ることが我々の使命だと感じていた。jCIFSが形になってくると、スーパーコンピューターやメディアプレイヤー、その他変わった用途でjCIFSを使っているユーザー達からフィードバックをもらうようになった。その中には組込みシステム開発者もいて、jCIFSはすぐにSMBソリューションを求めるエンジニアの頼りになるツールキットとなった。我々のメーリングリストは、サービス・ディスカバリや共有一覧、アクセスコントロールリストなど、SMBについての質問で溢れていた。小さなプロジェクトだが、我々は非常に満足していた。
毎年、SMBコミュニティ向けにいくつかのカンファレンスやワークショップが開かれているが、当時はまだjCIFSと協業をしたいと思うスポンサーはおらず、あいにくそこには地理的な問題もあった。一方Sambaの認知度は比較的高く、外部からのサポートも手厚かった。私は両方のチームに属していたため、イベントでは必然的にjCIFSを代表することになった。これらのイベントでは、オープンソースや商用の多種多様な実装向けに接続テストをする機会を得ることができ、またjCIFSをより多くの人に知ってもらうことができた。
そのおかげだろうか、jCIFSがAndroidアプリ開発者の目にとまった。偶然ネットで見つけただけかもしれないが、いずれにせよ、jCIFSがAndroid開発者に認知してもらえたのだ。Android開発者がjCIFS(Java版CIFS/SMB実装)の必要性に気づき、jCIFSがそこにあったというわけだ。
しかし、jCIFSとAndroidの関係性は、その時はまだそれほど明確ではなかった。その関係性について私が本当に理解したのは、興味本位と昔からの癖で、自分の携帯にファイルブラウジングのアプリをダウンロードして、家のSambaサーバーに接続した時だった。パケットキャプチャーを見ていると、コネクションリクエストで、携帯のjCIFSが「自分はjCIFSである」とSambaサーバーに名乗っていた。調べてみると、jCFISをSMBクライアントのエンジンとして使っているアプリがいくつか存在していることが分かった。
AndroidとjCFISの関係は今日では強固なものだが、新たな問題がある。
jCIFSは、1980年代初期に登場した最初のSMB/CIFS (現在のSMB1)の実装で、SMB1は現在では撤廃され、SMB2とSMB3に置き換わっているので、最近のWindowsバージョンではデフォルトで利用ができない。
SMBはでこぼこ道をゆく
ここで「CIFS」の名前の由来について話そう。複雑な話になるが、なんとか簡潔に話してみたい。
SMBは1980年代初期にIBM向けに作られたプロトコルで、開発者のイニシャルを取り、当初はBAFという名で呼ばれていた。しかし、IBMはなぜか「Sever Message Block」という名前を気に入り、今のSMBとなった。SMBはPC DOSとMS-DOS向けに開発され、後にOS/2に移植、最終的にはWindows NTとWindows 9xシリーズに実装された。
1990年代中期、Microsoftはそのプロトコル名を「CIFS」(Common Internet File Systems)に変更した。当時のマーケティングのバズワードであった「Internet」というキーワードを含んでいたからだが、その実態は大して変わらなかった。
当初はもちろん、Microsoftはこの新名称でSMBの新バージョンや新機能を提供するつもりだったが、それには時間を要した。その後の数年間を、主要国政府から起こされた独占禁止法訴訟対応に追われていたからだ。よってこの時期のCIFSが意味するものは、実際はWindows NT4やそれ以前のWindowsバージョンに搭載されていたSMBであり、奇妙な逆転現象がおきていた。
Windows 2000で計画されていたSMBプロトコルのアップグレードが行われたのは、最終的にはWindows Vistaだった。しかし、Vistaでサプライズ・リリースされたものは、CIFSではなく、SMB2と呼ばれるものだった。このSMB2は、CIFS(SMB)と比べてコードがクリーンで、パフォーマンスに優れたものだった。その数年後、更なるパフォーマンスと信頼性の向上および拡張性が追加されたSMB3がリリースされた。しかしながら、SMB3は、CIFS(SMB)からSMB2にアップグレードされた時ほどの大変革ではなかった。SMB2と比べて、SMB3ではより多くの機能が実装されている。旧来のSMB/CIFSは、今日ではSMB1と呼ばれていて、先述の通り、Windowsでは公式に無効化されている。
jCIFSを開発していた頃は、SMB/CIFSスタックのコーディングは、まるで不揃いの部品で、説明書もない状態の中、車のトランスミッションを作り上げるようなもので、その作業のほとんどは、点滅するライトとぼんやりとしたマッチの灯りのもとで行うしかなかった。
その後、SMBを取り巻く環境は大きく変わった。SMB2、SMB3がリリースされ、多くの新しいドキュメントがMicrosoftからリリースされた。これにより、外部ソフトウェアがWindowsとの互換性を保つことが非常に容易になった。
その頃、jCIFSはすでに完成されていたので、チームの開発者たちはより新しく、プライオリティの高いプロジェクトへと移っていった。つまり、jCIFSはSMB2やSMB3をサポートするというチャレンジをしなかった。jCIFSのウェブサイトは今でも健在で、コードも入手可能だが、実際ここ数年は何のアップデートもされていない。
新たな希望
ネットを調べてみると、jCIFSのコードが新規プロジェクトの中で今でも生きていることが分かる。具体的には、jCIFS-NGと呼ばれるもので、これはSMB2、SMB3を部分的にサポートしている。jCIFSはまた、Visuality SystemsのjNQ製品にもインスピレーションを与えた。
オープンソースの世界では、Sambaが(私がこのプロジェクトに初めて参加して以来なので)すでに20年以上も業界スタンダードとして、その地位を築いている。しかし、Sambaについて語る人は現在ではほとんどいなくなり、スポットライトは別のプロジェクトに当たっている。だからといって、私にやることがなくなったわけではない。直近では「Zambezi」という、私がjCIFSのプロジェクトを立ち上げた時に抱いていたような、少しクレイジーでわずかに常軌を逸した考えのもとにスタートしたプロジェクトだ。「Zambezi」はJavaではなくむしろC言語で書かれていて、汎用DPU(Data Processing Unit)やSmart NICsを強化することを目的としている。
Smart NICsはオンボードプロセッサーをもつ、ハイエンドのネットワークカードである。Smart NICsは、本来コンピュータ自身が行うべきアップフロント・プロトコルのパケット処理を、数多くこなす。SMBプロトコルの処理をSmart NICsに移すことでリソースを解放し、結果としてパフォーマンスが向上する。Smart NICsは暗号化や圧縮、エラー対応や複数トランスポート(TCP、RDMA、QUIC等) のサポートといった処理の負荷を削減できる。
進むべき道
ミッケルソン・トレイルの旅は、私にとってチャレンジだった。チャレンジは、私の楽しみでもある。
SMBの実装もまた、チャレンジングだが価値ある旅だ。SMBは非常にトリッキーで、中止や失敗に終わったプロジェクトの話しをよく聞く。だから出発する前に、この旅にはどんな困難が待っているかを知っておかなくてはならない。私は、チームを牽引し、数年で仕事を完遂できる、経験豊富なSMB開発者を知っている。あなたの旅にも、ガイドをつけてみてはどうだろうか。
SMBをもっと知りたいなら…
- Implementing CIFS – SMB/CIFSおよび関連プロトコルについてのオンラインブック。
- jCIFS – jCIFSプロジェクトのウェブサイト。
- jCIFS-NG – jCIFSコードベースを使った新プロジェクト。現在も開発中。
- The Deprecation of SMB1 – 2015年のMicrosoft Jose Barretoのブログ記事。
- The Zambezi – SMB3/Smart NIC プロジェクトのウェブサイト。「コメントはコードより大切」が、私のモットー。