最新 追記

だめだめ日記

ツッコミの内容は検索サイトからの検索やサイトのレーティングに影響します。そのため問題があるキーワードを含むと思われるツッコミについては、当方の判断で削除することがあります。予めご了承ください。 なお、コメントspamと判断されたツッコミは自動的に消去されます。ご容赦ください。
2002|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|05|06|09|10|11|12|
2013|01|02|02|03|08|09|
2014|01|
2015|09|10|11|
2016|01|04|

執筆、翻訳などに関わった書籍類


【改訂新版】Samba [実践]入門

Linux教科書
LPICレベル3 300試験

マスタリング Nginx

実践 パケット解析 第2版

改訂版 Sambaのすべて

アンドキュメンテッド
Microsoftネットワーク

その他の書籍は だめだめ日記のおみせ@本店でどうぞ。



2016年01月01日 [長年日記]

[Samba]FreeBSD 10以降の内蔵iconv関数とSamba

いまさらですが、2013年10月以降のFreeBSD 10以降で実装されたiconv(3)関数について確認してみました。

$ which iconv
/usr/bin/iconv
$ iconv -l | grep EUCJP-MS
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN EUCJPMS

ということで、従来glibcもしくはパッチを適用したGNU libiconv以外で、はじめてEUCJP-MSが実装されたiconv関数になります。

ただ、Portsを最新化して確認してみましたが、最新のsamba43パッケージでも、GNU libiconvの依存関係が有効なままで、シンボル上も

root@fbsd10-1-1: # smbd -b | grep ICONV
  HAVE_ICONV_H
  HAVE_ICONV
  HAVE_ICONV_OPEN
  HAVE_LIBICONV
  HAVE_NATIVE_ICONV

のように、GNU libiconvも認識されています。

実際には、GNU libiconv由来のiconvコマンドでは、次のようにEUCJP-MSロケールが認識されていないにもかかわらず、

root@fbsd10-1-1: # /usr/local/bin/iconv -l | grep EUCJP-MS

後述する、文字コードとしてEUCJP-MSを指定したsmb.confを使用しても問題なく動作する(つまりEUCJP-MSロケールを認識している)ので、内蔵のiconv()関数が使用されているようです。

ただ、切り分けとしては気持ち悪いので、念のため、次のようにして、GNU libiconvを使用していない状態で確認してみました。

  • libiconvを明示的にアンインストール
  • /usr/ports/net/samba43/Makefileを編集してUSES行からiconvを削除(これをしないと、依存関係チェックでlibiconvをインストールしようとするため)
  • PortsからSambaをインストール
root@fbsd10-1-1: # smbd -b | grep ICONV
  HAVE_ICONV_H
  HAVE_ICONV
  HAVE_ICONV_OPEN
  HAVE_NATIVE_ICONV

のように、LIBICONVシンボルがなくなっており、/usr/local/bin/iconvもインストールされていないことを確認のうえ、次のような/usr/local/etc/smb4.confを作成して確認してみましたが、特に問題は発生せず、日本語ファイル名がEUC-JPの符号化形式で正しく保存されていました。

[global]
  dos charset = CP932
  unix charset = EUCJP-MS

[homes]
  writeable = yes
  browseable = no

ちなみに、iconv関数が認識できない文字コードを指定すると、log.smbdに次にようなログが出力されます。

[2016/01/01 09:49:54.241896,  0]  ../lib/util/charset/convert_string.c:391(convert_string_talloc_handle)
  convert_string_talloc: Conversion not supported.

PortsからインストールしたSamba 4.3.3の場合は、最終的にsmbd自体の起動がアボートしました。

ためしに次のようなファイル名のファイルを作ってみましたが、

機種依存文字のファイル名

比較的文字化けしやすいと思われる、「てすとⅠⅰ.txt」と「てすと㈱¬」というファイル名について、Linux上に格納されているファイル名を次のようにしてダンプしてみると、

$ ls|tail -2|od -tx1
0000000    a4  c6  a4  b9  a4  c8  ad  b5  8f  f3  f3  2e  74  78  74  0a
0000020    a4  c6  a4  b9  a4  c8  ad  ea  a2  cc  2e  74  78  74  0a
  • 「Ⅰ」は「ad b5」
  • 「ⅰ」は「8f f3 f3」
  • 「㈱」は「ad ea」
  • 「¬」は「a2 cc」

に、おのおの適切に符号化されていることを確認できています。

網羅的な確認は行えていませんが、サンプリング的に確認した範囲では、結論としてFreeBSD 10以降であれば、本来的にSambaにGNU libiconv(libiconvパッケージ)は不要といえるように思います。

それにより、今まで面倒であった、FreeBSDのSambaでGNU libiconvを使用する場合にEUCJP-MSロケールなどに対応するための日本語パッチを適用するため、必ずPortsから作成する必要があるといったバッドノウハウも発展的に解消すると思われます。


Copyright (C) 2003-2017 TAKAHASHI, Motonobu
webmaster@monyo.com