Monthly Archives: 1月 2009

FreeBSDでNTFS上の日本語名ファイルを扱うには。

Pocket

FreeBSDでは、先日のMSDOSFSの件と同じく、NTFS上の日本語ファイル名の扱いにも問題がある。

こちらもEUC-JPでマウントすれば一応は問題が解消されるが、俺はFreeBSDの環境をUTF-8にしているので、もともとUTF-8のNTFSを、EUC-JPにして読み込むのは実に馬鹿馬鹿しい。

そこで、MSDOSFSの件で発見した、http://people.freebsd.org/~imura/kiconv/で公開されているパッチを使用する。

ただ、こういうのも何だが、文字コードを変換してマウントする場合、現時点では読み込みのみがサポートされ、書き込みは不可であることを考える*1と、一時的な用途であればLinuxを使った方がはるかに早い。例えば、死んでしまったWindowsのディスクからファイルを復旧したいといったケースには、LinuxのLiveCDを使うほうが手軽。

また、カーネルとユーザランドへのパッチなので、ソースをアップデートする度にパッチを当てなおさなければならないのは、かなりのデメリット。継続的にNTFSをマウント(加えて読み取りのみ)する必要がある場合に限ったほうがいいと思う。

さておき。まず、上記のサイトから、1.,2.のパッチと、3.のNTFS向けパッチをダウンロードする。

/usr/src直下でpatchコマンドにこれらのパッチを食わせればよい。本番前に-Cオプションを付けて実行し、様子を見るのが吉。

◎実行例

# pwd
/usr/src
# patch -C < ~/ntfs.patch/01.k.patch
(略)
# patch < ~/ntfs.patch/01.k.patch
(略)

次に、kernelの再構築と、libkiconvのmake install。

上記のパッチは、kernelに対するものと、libkiconvに対するものの二つであるため。

kernelは、特別なことはなにもせず、再インストールすればいいだけ。(/usr/src配下でmake buildkernel, make installkernel)

libkiconvは/usr/src/lib/libkiconvでmake, make installする。

◎実行例

# pwd
/usr/src/lib/libkiconv
# make clean
rm -f kiconv.3.gz kiconv.3.cat.gz
(略)
# make
cc -O2 -fno-strict-aliasing -pipe  -I/usr/src/lib/libkiconv/../../sys  -c /usr/src/lib/libkiconv/sysctl.c
(略)
# make install
install -C -o root -g wheel -m 444   libkiconv.a /usr/lib
(略)

あとは再起動して新しいkernelを読み込ませ、mout_ntfsに-CUTF-8オプションを与えるだけ。

◎実行例

# mount_ntfs -o ro -CUTF-8 /dev/da0s1 /mnt

FreeBSD初心者スレにもちょうど同じ話題があったのでコピーしておく。シンクロニシティ・・。

初心者もOK! FreeBSD質問スレッド その99

445 : 名無しさん@お腹いっぱい。 : sage : 2009/01/13(火) 08:13:53

.UTF-8 で ntfs のこと:

http://people.freebsd.org/~imura/kiconv/

の、1. 2. と3. の ntfs ぶん当てて kernel と libkiconv 作り直して、

% grep ntfs /etc/fstab

/dev/ad0s3 /diske ntfs ro,-CUTF-8 0 0

で、日本語 file name 読めた。

% uname -rp

7.1-RELEASE-p1 i386

へけけ

*1:mount_ntfs(8)の-Cの項参照。

No tags for this post.

FreeBSDでmsdosfs上の日本語ファイルを扱うには

Pocket

MSDOSFSの日本語ファイル名に使われる文字コードはCP932(Shit_JIS)だが、これをFreeBSDでマウントするには少々の手間がかかる。

結論からいえば、現時点(2009/01/12)でUTF-8に変換すると問題があるため、EUC-JPに変換する。

具体的には、mount_msdosfsに-L, -Dオプションを与えて使う。

◎実行例

# dmesg|grep da0
Jan 12 12:37:10 onyx kernel: da0 at umass-sim0 bus 0 target 0 lun 0
Jan 12 12:37:10 onyx kernel: da0: <Maxtor OneTouch 0200> Fixed Direct Access SCSI-0 device
Jan 12 12:37:10 onyx kernel: da0: 40.000MB/s transfers
Jan 12 12:37:10 onyx kernel: da0: 194480MB (398295040 512 byte sectors: 255H 63S/T 24792C)
<略>
# mount_msdosfs -o large -Lja_JP.eucJP -D CP932  /dev/da0s1 /mnt

これでファイル名はEUC-JPで表示されるので、LANG=ja_JP.eucJP;export LANGとしたうえで、ターミナルの設定を変えてやればOK。

UTF-8のターミナルでファイル名を確認したい場合には、nkf( /usr/ports/japanese/nkf)やiconv(/usr/ports/converters/libiconv)で変換する。

◎実行例

$ ls /mnt/Document/*.url
/mnt/Document/SUPPORT[Support Info.]Windows 2000 ???????.url
/mnt/Document/????????????????.url
$ ls /mnt/Document/*.url|iconv -f EUC-JP -t UTF-8
/mnt/Document/SUPPORT[Support Info.]Windows 2000 関連情報.url
/mnt/Document/ファイアウォール.url
$

nkfの場合にはiconvの代わりにnkf -Ewとする。

ファイル名の文字コード自体を変換したい場合には、convmv(ファイル名の文字コード変換)を使う。

なお、mount_msdosfsでUTF-8への変換時に発生する問題については下記のリンクを参照のこと。

”(FreeBSD-users-jp 91921) Re: Trouble in msdosfs UTF-8 conversion of japanese filename”

一部引用。

Q

cd9600 msdosfs ntfs などの CP932 なファイルシステムで

日本語を含むファイルがある場合、UTF-8 に変換して mount する

(たとえば # mount_msdosfs -L ja_JP.UTF-8 ) と、日本語を

含むファイルへのアクセスがおかしいようです。

A

カーネル内部のコード変換が、バイト数が変化する変換に完全にはまだ

対応できていないためです( UTF-8 では漢字は 3 バイト)。EUC への

変換で回避するか、imuraさんによる kiconv enhancement パッチ

http://people.freebsd.org/~imura/kiconv/

を自分で当てて、対応したカーネルを作成する必要があります。

No tags for this post.