Snap.Shot.cx

トップページへ戻る

[Linux] smbfsのiocharset
10/26/2000 01:38 (投稿者:たかの)

kernel-2.4は奥が深いなぁ。SJISのファイル名を使ったVFATディスクやsmbfsにアクセスするのに、今まではVFATパッチやらsmbfs-NLSパッチやら、ごちゃごちゃとしたものが必要だった。ところがNLSが充実してきて、標準kernelのまんまでアクセスできるようになった。

#ひょっとすると最近の2.2系カーネルには組み込まれてる?
#いやはは、知らなかったことにしてください。

ポイントは、

1. filesystemの「Native Language Support」で「Codepage 932」のサポートを入れる。(最近のディストリビューションでは既に入っている気がする)
2. マウント時のオプションとして、「codepage=932,iocharset=euc」をつける。

たとえば、/dev/hda4のVFATパーテーションを/mnt/vfatにマウントするならこうだ。

# mount -o 'codepage=932,iocharset=euc' /dev/hda4 /mnt/vfat

これでSJISの漢字ファイル名もばっちり。

で。ここからが本題の「うんこhack」だ(こらこら)。
このiocharsetオプション、smbfsドライバでもサポートしているのだけど、smbfsのマウントには、samba専用のsmbmountとsmbmntというコマンドが要る。ところがこのマウンタ、困ったことに独自コマンドばりばりで、カーネルでサポートした新しいオプションをまるで渡してくれないのだ。
最初mountコマンドのほうをhackして、カーネルに直接渡してしまおうかとも思ったけど、それもダメ。なんでかというと、smbmountコマンドは実はdaemonとしても機能するようになっていて(そんなの反則だ!)、マウントを実行したあとも居座り続けてくれないといけないのだ。
kernel-2.4のConfigure.helpを読むと、「それをサポートしたsmbmountはまだ出てないよん。そのうちhttp://www.hojdpunkten.ac.se/054/samba/index.htmlで非公式パッチが出るんちゃう?」なんて書いてある。…そんな馬鹿な話があるか!

こりゃ、カーネルに直接オプションを渡せるようにつついてやる。がりがりつついて、強烈な「うんこhackパッチ(samba-2.0.7-ja-2.0.new-smbfs.patch)」の完成だ。
値チェックは全くせず、otherとして指定されたオプションすべてをベタでカーネルに渡すようになっている。

…こんなの、自分以外に誰が使うんじゃ(苦笑)


いちおうチャレンジしてみたいという奇特な方のために、簡単な説明書きを。

パッチはsamba-2.0.7-ja-2.0に適用する。とはいっても、日本語版はsmbmountまわりは触っていないと思うので、たぶん本家のsamba-2.0.7にも適用できると思う。適用して普通にコンパイルしたら、既存のsmbmountコマンド及びsmbmntコマンドと入れ替える。

マウントするための起動オプションは、かなり工夫が必要だ。というのも、本来デフォルト値を設定するべき部分もベタで渡しているので、そのままだとアクセス権限がなくってマウントできない。

ではどうするのかというと、たとえばこうする。

# smbmount //windows/myshare /mnt/samba -o 'other=version+7;iocharset+euc-jp;uid+501;gid+100;win95;oldattr;file_mode+420;dir_mode+493'

-oで示された「other=」以降がポイント。イコールやカンマを正しくオプション処理させようとするのは大変なので、それぞれ「=」→「+」、「,」→「;」に置き換えた。つまりこれは

version=7,iocharset=euc-jp,uid=501,gid=100,win95,oldattr,file_mode=420,dir_mode=493

というオプションとしてkernelに渡される。
つづく「version=7」は、smbmountのバージョン指定で、これは必須。古いsmbmountとの整合性をとるために、先頭の4文字が「vers」となっているかどうかで判断しているらしい(それはそれで強烈というかなんというか)。ちなみに、旧smbmountの場合、ここには文字列ではなくて、int数値として6が入る。

そのすぐ後ろに続くのが肝心要のiocharset。「euc-jp」は、「クライアント側で」どう見えるかというコードセット指定を行う。
uid,gidは見た目どおりなので省略。その後ろの「win95」と「oldattr」なのだけど、最近のsmbfsは、SMBサーバに応じた最適化オプションがいくつか追加されているらしいんだな。まだよく分かっていないけど、どうもwin95向きらしいオプションを追加している。

最後の「file_mode=420」「dir_mode=493」もクセモノ。420,493は、それぞれ8進数の0644,0755を示している。つまりパーミッション設定だ。getoptのソースをちらっと眺めた限りでは、8進数での取得がよく分からなかったので、そのまま10進数で渡すことにしてしまった。

無事にマウントできたなら、ちゃんとLinuxからも日本語ファイル名を参照できる。
半角カナだってばっちりだ。


…ちゅーか、この説明だけで動かせた方、もしいらっしゃいましたら、もうちょっと体裁整えて本家に投げてください。とほほ。

メールでコメント


(Powered by Zope)
リンクはご自由にどうぞ。各記事には記事番号がついていますので、URLは変わりません。
© 2000-2013 Yukimasa TAKANO, all RIGHTs reserved.