はじめての自作NFSサーバ

社長:「はじめての自作◎◎」って悪くないタイトルですよね。

開発:まあ、一般にあまり自作する事のないものだと違和感はあります。

経理:ベストセラーにはなりにくそうですね。

基盤:はじめての自作宇宙船とか。スペースXって結局、国鉄の民営化みたいのとは違うんですかね?

* * *

開発:ああそれで、NFSサーバが固まっちゃう問題は再現しました。

社長:なるほど、自分自身につなごうとしてタイムアウトを繰り返していると。

開発:unfsdを単一プロセスにしていたのでわかりやすかったです。要は、自身がマウントしているディレクトリの下に、自身のマウントポイントが見えているので、再帰しちゃってるんですね。

社長:多段のループだと検出は難しいですが、自分自身なら検出しても良いのにね。

開発:それはそうと、こうなった場合のmountテーブルのクリア方法がわかりません。umount は効かない。diskutil umount force も効かない。

社長:ひょっとして、unfsdを殺しちゃってるからじゃないですか?誰も応答しないから、後片付けができないとか。

開発:あ… そうかもです。unfsd を起動して、umount … ああ、昨日見たこれがぽっと出ました。

開発:でもって Disconnect All。おー、mountがクリアされました。

社長:メデタシ。

開発:「昨日見たFUSEみたいの」なんて、失礼な事を書いちゃいました。とんだ濡れ衣でしたね。

社長:要は、私は eject しちゃいましたもうここにはいません、みたいなメッセージをクライアントに返してから死ねばよいのでしょうかね。

開発:まあ、原因もわかりましたし、方向性は見えましたのでおいおい。

開発:それで、ファイルをクリックで開く時に、それをどう扱うかは結局、拡張子で判断するのが趨勢なわけです。まあ、可変長文字列なのでまさに拡張性もありますしね。なので、

社長:ちょっと待った。ボウリングの試合に行ってきます。

* * *

社長:ただいま。

基盤:どうでした?

社長:130台で始まり、徐々に修正して、200台で終わりました。最初はフォームもタイミングも変でわけがわからなかったんですが、リリース時に右肩が突っ込んだりぶれてた事に気づいたんです。回転軸がぶれては、全てが台無しです。

社長:ああそれで、機能を持つファイルの名前ですが、最後は拡張子で終わる。ファイル名の先頭は本来の名前であるべき。だとすると、name++function.ext といった形になるのかなと思いました。

開発:「++function」の記法は悩ましいですね。?function でも良さそうには思いますが。

社長:「?」は伝統的にshellでファイル名の一文字マッチングに解釈されちゃうのが嫌なんですよね。まあ、おいおい考えましょう。

開発:ではとりあえず「++」がファイル名に入ってたら実行することにしてみます。

開発:またループすると嫌なので、$HOME/unifsv を $HOME/unifcl にマウントすることにします。まずこういうふうにexportsして、unfsdを起動。

開発:でこれをマウントする。

開発:ここにある4つのファイルは全部同じファイルです。ハードリンクしたものです。で、中身を読み出すと、NFSのクライアント側から見た ++ 付きのファイルだけが、実行された結果として見える。

開発:でこれをFinderで開いたりブラウザで開くとこうなります。

社長:ふーむ。機能的には出来てます。Finderやエクスプローラにファイルの名前以外でデータ型を、MIME Content-Type で伝えられると良いのですけどね。

開発:うーん。少なくとも最初のNFSが出来た時にはまだ MIME も無かったですしねw。

基盤:その後のNFSではどうなんでしょうね。

開発:grep -i mime *.h .c … unfs3には無いみたいですね。NFSv4にはあるんですかね… あった。

開発:まあ、これをNFSクライアントが、つまりファインダーやエクスプローラが見てくれるかどうかですが…

社長:見てくれるなら、CGI使ってヘッダにContent-Typeを返す必要なくなりますね。

開発:ものによっては、HTTPサーバである必要もなくなりますね。単にNFSマウントしてfile URLで開けば良い。

開発:ですが、せっかくHTTPでURLにいろんな機能をもたせて普及したわけですから、それをそのままファイル名にも使いたいのも確かです。

社長:HTTP的に考えれば、クライアント側に見えない隠しファイル的に、いろんな属性を付加できればいいんじゃ無いかととは思います。

開発:そうですが… クライアント側から一律な変換機能を叩けるところが、NFSでやる面白さなんじゃないかとも思うわけです。

開発:どうもその、一度ディレクトリをキャッシュしてしまうと、その中に無いパスを追ってくれない的なクライアントの作りになっているように思われるんです。そうなると、無限の組み合わせのある隠し機能というかパラメータを指定することが出来ない。

社長:でも、巨大なディレクトリの中の一つのファイルを開くこともあるわけで。クライアントとしてそういう理不尽な実装をしますかね?

開発:ああでも、これも、ディレクトリの最終変更日付を変える手でしのげますかね。あるいは、このディレクトリ、このファイルはキャッシュするなという指示がNFS的にできるのかもです。明日また確認します。

— 2020-0803 SatoxITS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です