2011年6月5日日曜日

続:FreeBSDのSMB(CIFS)マウント対応状況 mount_smbfsに関する訂正



まず、SMBで扱える文字コードはサーバからみると、


「ネイティブ(サーバ依存)」と「Unicode」の2種類、しかしFreeBSDの


mount_smbfsはUnicodeに対応してないので、ネイティブを選択せざるをえない。


一般には普通のwindowsならCP932(SJIS)だが、よくあるsambaの設定は


UTF-8がネイティブコードとして設定されている。


CP932もUTF-8もヌル文字を含まないので、正常に処理されるが、


mount_smbfsのバグのため、ヌル文字を使う文字コードをネイティブコードに使っている


time capsuleはマウントできない・・・といった所みたい。


(マルチバイト文字だけUTF-16BE?なんや不思議なエンコードに見えた)


なのでFreeBSD標準のmount_smbfsではtimecapsuleは正常にマウントできない 。


まとめると・・・・




  • windowsは-E UTF-8:CP932であらかた読める(3byte文字問題あり)

  • sambaは-E UTF-8:UTF-8で正常に読める。

  • timecapsuleは日本語含まなければ読める。


ちなみにこの調査の過程でkernelのlibiconvを拡張して遊んだりしてみた。


元のコードを数行書き換える必要はあったが、


iconv_xlat.c等の既存の変換エンジンをまねして変換エンジンを書いて


追加するだけで、モジュールがガンガン追加できるので実験しやすく面白い。


じゃ、どうすればいいか。


fuse-smbnetfsをつかう・・・というのが楽だけど、当然処理が遅い。


mount_smbfsをとりあえずの改造するならファイル名の扱いをヌル文字OKにするのがいいかな。


libiconv.koのほうには必要に応じて文字コード変換を追加して・・・


しかしながら、長期的にはUnicode対応のほうが絶対有利。今時Unicode吐けないSMBサーバは少数になりつつあるので。





0 件のコメント:

コメントを投稿