日記ブログ、または雑多なメモ
2010年2月26日

OSX Tiger から FreeBSD-8.0-STABLEのNFSをマウント /iconv UTF-8-MAC パッチ





 ファイルサーバとのやりとりはsambaだけで済ませるつもりだったのだが、やっぱり所有権情報なんかを保持しておきたいフォルダもあったりもするので、ローカルファイルシステムとして使えるNFSもファイルサーバ側でおったてる。

 まず、ファイルサーバ(FreeBSD-8.0-STABLEの)側の「/etc/rc.conf」に以下を足す。
portmap_enable="YES" #いらない?
nfs_server_enable="YES"
nfs_server_flags="-u -t -n4"
nfs_reserved_port_only="NO" #OSX(Finderが?)がreserved portだけだとマウントできないらしいのでこの設定
rpc_lockd_enable="YES" #NFS上でflockするのに必要。 しないならいらない。
rpc_statd_enable="YES" #同上


 /etc/exportsを書く。
/nfs -maproot root -alldirs -network 192.168.0.0 -mask 255.255.255.0

 /etc/hosts.allow の rpc.bind 辺りのアクセス権設定をいじっておいて、リブートするとNFSサーバの準備完了。


 他方、OSX側。 Finderでさっくりマウントはできないようなので、手動でマウント。
まずportmap等を手動で起動させる。
# launchctl start com.apple.portmap
# rpc.statd


 NFSを手動でマウントする。 オプションはかなり適当。
# mount_nfs -o rsize=4096,wsize=4096,async -P "ファイルサーバのアドレス":"共有ディレクトリ" "マウントポイント"

 以上でNFS領域にアクセス可能に。


 だがしかし。
G4Cube(OSX 10.4)からファイルサーバ(FreeBSD)側へバックアップするのにいくつか問題点が。

1・NFS領域へ日本語ファイル名のファイルを普通にコピーすると濁点などが2文字化したりなど文字化け。 UTF-8-MACの問題
2・NFS領域へ、root権限でユーザー所有のファイル群をまとめて「rsync -a」すると部分的に所有権がrootになったりする
3・Samba領域へは文字化けしないが「rsync -a」するとファイルによっては毎回新規上書きしやがります
4・リソースフォーク問題

 (1)はrsync3の「--iconv」オプションで一応回避できるものの、それとは別にうっかりファインダー上で日本語ファイルをドラッグで放り込んでしまったりすると逆にややこしいことになってしまう。 あえて回避せずに「基本的にNFS領域には日本語ファイル名のファイルは置かない」ことにする。
 (2)は原因不明。 リモートでやってもローカルでやっても同じ。 一部消して再度rsyncするなりで対処するしかなさそう。
 (3)はrsyncのFAQにあった「--modify-window=1」オプションを足して回避。
 (4)はrsync3のXオプションに頼る。 cpmacでもいいけど。 何にせよリソースフォークがないと死亡するようなファイルの取り扱いには注意しないといけないが、実際のところそのようなファイルはあまりないのでさほど問題でもなかったりはする。



 文字化け問題対処途中、「もしかしてFreeBSDでもUTF-8-MAC読めないとファイルサーバをたてた意味ないかもじゃああん!?」などと半ばとち狂って、Apple版のiconvをFreeBSDでビルドしてはみたものの、やたらと苦労した割にはあまり使い道がないことにあとから気づく。 それはともかく、せっかくできたのでパッチをメモっておく。

FreeBSD環境用 apple iconvパッチ
--- libiconv-13/libiconv/lib/utf8mac.h       2003-10-23 09:00:42.000000000 +0900
+++ libiconv-13.patched/libiconv/lib/utf8mac.h    2010-02-27 04:45:53.000447263 +0900
@@ -27,13 +27,22 @@
        Includes Unicode 3.2 decomposition code derived from Core Foundation
  */
 
-#include <libkern/OSByteOrder.h>
+//#include <libkern/OSByteOrder.h>
 
 #define        UTF_REVERSE_ENDIAN      0x01    /* reverse UCS-2 byte order */
 #define        UTF_NO_NULL_TERM        0x02    /* do not add null termination */
 #define        UTF_DECOMPOSED          0x04    /* generate fully decomposed UCS-2 */
 #define        UTF_PRECOMPOSED         0x08    /* generate precomposed UCS-2 */
 
+#include <strings.h>
+#define u_int32_t unsigned int
+#define u_int16_t unsigned short
+#define u_int8_t unsigned char
+#define __LITTLE_ENDIAN__
+#include <sys/endian.h>
+#define OSSwapInt16(x) be16toh(x)
+
 int    utf8_encodestr (const u_int16_t *, size_t, u_int8_t *, size_t *,
                size_t, u_int16_t, int);


 まずportsなりpkg_addなりでlibiconvをインストール後に、ありがたくというか迷惑な事にというか、アップル謹製のlibiconv-13.tar.gzを拾って来てパッチを当て、「--enable-extra-encodings --enable-relocatable」の辺りのオプションを入れてconfigure、make install。 してから/usr/local/lib/libiconv.so.3を消して、代わりに/usr/local/lib/libiconv.so.4.0へのリンクを同じ名前で貼り直すとutf-8-mac対応iconv完成。 ただしgettextとかexpat2とかdependencyのある物をいくつかリビルドしないといけないかもである。

# f=`find /バックアップ場所`; for i in $f;do mv $i `echo $i|iconv -t UTF8-MAC`;done

 とかやると、ファイルサーバー側で文字化けファイルを復元できると言えばできる……が、OSXが動いてるマシンに戻せば謹製iconvでできるともいう。


コメント欄
(投稿なし)

コメントなどありましたらこちらからどうぞ
名前
内容
 ※名前、内容ともに入力必須です
- C'sGallery Blogっぽく見えるシステム3.2 -
小武 (管理人) eta2@tim.hi-ho.ne.jp