少し前にうちの漢字コードをデータベースからFreeBSDで扱うファイルの内部コード、httpdの表示にいたるまで EUCや SJIS を使っていたところを UTF-8 に変更しました。唯一残っていたのが mount_smbfs で共有しているファイル名。問題はカーネルにありそうなのでちょっと面倒かな~と思っていたのですが、別解として fusefs_smbnetfs を使うことで解決しました。
本題に入る前に、FreeBSDで Windows のドライブをSMB共有するには問題があります。確かに mount_smbfs を使えば簡単にマウントできます。が、これだとファイル名に漢字が使われている場合に期待通り動作しないことがあります。具体的には片仮名の「ソ」が含まれたディレクトリがあるとうまく動きません。
# mount_smbfs //ホスト/共有 /mAgicTV
# ls /mAgicTV | nkf -w8
アリソンとリリア 10話
# find /mAgicTV/ |& nkf -w8
/mAgicTV/
find: /mAgicTV/アリソンとリリア 10話: No such file or directory
SHIFT-JIS で「ソ」は 0x83 0x5c ですので、0x5c(\)がエスケープ記号と解釈されて困ったことになってるのでしょうね。我が家ではタイマー録画機(Windows)で録画したMPEG2データをFreeBSDでiPod用に自動エンコードしているのですが、このおかげでアリソンとリリアはiPodでは見られません(笑)。ちなみに、通常のファイルシステム上にSJISの「ソ」が含まれたディレクトリを作成しても find はちゃんと表示してくれるので、 find が悪いわけではありません。
それではと、mount_smbfs の-E オプションで EUC-JP に変換してみたのですが、今度は特定の文字コードが含まれている場合に応答がなくなります。エラー終了してくれたらまだ良いのですが、readdirだったかstatだったかを呼んだあと永遠に帰ってこず、CPUパワーもそれなりに食った状態を維持してくれるので 5分おきにエンコードプログラムをcron で呼び出しているうちのFreeBSDは一時ロードアベレージが 数十まで膨れ上がってたいへんなことになりました(笑)。で、仕方がないのでしぶしぶ mount_smbfs を SJIS で使っていました。
考え方を変えてiSCSI上にWindowsのドライブを作成してFreeBSDからは mount_ntfs で読み込もうとしたのですが、これまたうまくいきません。漢字コードについては大丈夫っぽいのですが、Windowsからファイルシステムを更新しても、FreeBSD側の読み込みバッファの有効期間がひたすら長いのか、5分程度待っても更新されないのです。いったん umount/mount すれば反映されますが、mount_smbfs は root で動かしてるので同期させるのは面倒です。
他に NTFS を読む方法はないものか? と locate ntfs してみると、ports の中にありました。fusefs-ntfs というのだそうです。これを使うと、特に何も指定しない場合は UTF-8 でマウントしてくれます。おぉぉ、これは良いですね。ただ、もっとぴったりのものがありまして、fusefs-smbnetfs というのだそうです。mount_smbfs の代わりになるものです。
こちらも何もしなければ UTF-8 でマウントしてくれます。rootでマウントすると一般ユーザがアクセスできない状況になったのでこちらのページも参考にして
すると一般ユーザでマウントできるようになりました。接続先の電源が切れても mount_smbfs と違って df がひたすら遅くなったりはしないようなので、状態を監視しての umount は特に必要なく、cron で @reboot にて動かす ことにしました。
ちなみに、面白いのはマウントの方法。引数の中にはマウントポイントは指定できるのですが、mount_smbfs と違って共有名を入れるところがないのです。はじめは意味がわからなくて困ったのですが、マウントポイントから順番にたどっていくとそれぞれの共有にたどり着けるようです。
% pwd
/usr/home/takatani/smbnetfs
% ls
TORIYU WORKGROUP
% ls WORKGROUP/
LAVIEG TORIYUXP
% ls WORKGROUP/TORIYUXP
mAgicTV
認証が必要な場合は ~/.smb 下にファイルを用意するようですが、うちの共有はゲストで入れるようになっているので特に必要ありませんでした。
かくして往年の野望であった UTF-8 統一がようやく完了です。正直言うとこの自動エンコードスクリプトの中がいちばんややこしくて、ffmpegを実行するコマンドラインの「入力ファイル名はSJIS」「埋め込むコメント部分はUTF8」という意味不明な記述もすっきりしました。何でもかんでもUTF-8にすればよい・・・というわけではないのでしょうが、少なくとも私にとっては漢字コードを統一したことでずいぶんと保守が楽になりました。
□ 関連記事