smbfsがcodepage=cp932を受け付けなかったらconvmvfsを使えば良い

 sambaを使ってファイルをやりとりする際には、ファイル名に使う文字コードが問題になることがある。最近だとcifsではUnicodeUTF-16?)になっているらしいが、数年前まではShift_JISも普通に使われていた。我が家のNASもちょっと古いので、ファイル名に使う文字コードSJISになっている。クライアントがWindowsだと問題ないかもしれないが、問題はクライアントがLinuxだ。
 Linuxでは今のところファイル名にはUTF-8を使うのが一般的だ。smbfsにはファイル名を変換してくれる機能がついており、マウントオプションにcodepage=cp932とつければsambaとの通信はShift_JISでして、Linuxに見せる文字コードUTF-8にしてくれた。平和な時代だった。
 しかし、いつのころからか、smbfsがcodepageオプションを受け付けてくれなくなった。悲しみの時代の当来である。トラブルに出会った当時はちょっと調べてみたが、解決策なし(古いの使え)という結論だった。しょうがないので、これまでは一年以上、ずっと古いバージョンを使っていた。古いものを使い続けるのはあまり望ましくない状態である。しかも、gvfsが新しいlibsmbclientに依存している関係で最新版に更新できず、重ねて望ましくない状態であった。しかし解決策が他に見当たらなかった。
 今日考え事をしているときに、ふと、fuse(Filesystem in Userspace、普通のプログラムでファイルシステムとして振る舞う機能を提供するもの。)を使ってファイル名の文字コードを変換するようなラッパをかませば良いんじゃね、と気づいた。そして、そういうファイルシステムは自分で作らなくてもありそうだなーと探してみたら、3分でfuse-convmvfsを発見できた。fuse-convmvfsは完全に望みを叶えてくれる。しかもC++で実装されてる。自分で作るならRubyPythonを使おうと思っていたところなので、パフォーマンス的にも嬉しい。
 使い方は簡単で、以下のような感じにコマンドを打つだけ。

convmvfs /path/to/mountpoint -o icharset=cp932,srcdir=/mnt/samba

 これで/path/to/mountpointにアクセスすると、/mnt/samba以下にあるファイル名がUTF-8で見えるようになる。と言う訳で、codepageオプションとはサヨナラして、sambaも最新版に更新できましたとさ。一年以上も放置してたのがばかばかしいぐらいに簡単に解決できた。
 ついでにプロトコルもSMBからCIFSに乗り換えてみて、なんか読み書きが速くなった気がするけど、これは気のせいかもしれない。
 あと、探している最中にcifsでリモートの文字コードを設定するためのパッチも見つけたけれど、まだupstreamでも採用されてないというか採用されないような気がするので、とりあえずconvmvfsでしのいで、新しいファイルサーバはファイル名をUnicodeにする、というのが良さそう。
 専用NASがsambaで動いてるんだけどPCサーバと違ってバージョンアップできないからどうしよう、とお困りの人は割と多いと思うので、そういう人はぜひ試されるとよいでしょう。