Wednesday, March 1, 2006

外部デバイスのファイルシステムについて悩む [mac]

私は USB フラッシュメモリやポータブル HDD を使って様々なファイルの同期やバックアップをしているが,Mac を使い始めてこれらのファイルシステムを再考してみた.

以下,NetBSD・Linux・Mac を併用しているユーザの悩みの過程と出した結論 (そんな人はあまり居ないと思うのでどれだけ参考になるか分からないが,半分は自分に対する備忘録ということで).

まず,それぞれの PC で使っているファイルシステムは:
NetBSD: UFS2 (FFSv2)
Linux: ReiserFS (/boot は ext3)
Mac: HFS+
であり,外部デバイスのファイルシステム候補は,汎用性や Windows からも読めること等を考慮すると FAT32,UFS,ext3 ぐらいであろうか.

Fat32:

本来であればこれが一番簡単で,大体の人は 「複数環境で使う外部デバイス → FAT32」で終わりだろう.実際何も考えずに NetBSD・Linux・Mac 共通に使えるファイルシステムは FAT ぐらいなのである.ただ,私にとっては permission 管理ができないのが致命的で,最初にボツになってしまう.

UFS:

まだまだ NetBSD を中心に使っているので,本来ならばこれにしたいところ.Windows からも ufs2tools - UFS for Windows でアクセスできる.但し,Linux の UFS 実装は非常に貧相で,書き込みのサポートは kernel config に「DANGEROUS」と明記されている.とても使う気にはなれない.

ext3:

NetBSD からも普通に読み書きできるので,これまでは外部デバイスは全て ext3 にしていた.Windows からも Explore2fs を使えばアクセスできる.Mac の対応はというと,Mac OS X Ext2 Filesystem というソフトを入れればとりあえずマウントできるようになるとのこと.しかしまだまだ実験的なものであることに加え,私が試したところエラーで ext3 の USB メモリがマウントできなかった.

さらに詳しい説明は NetBSD/macppc Partitioning HOW-TO をご覧頂けば良いが,要するに全部を満たすファイルシステムが無いのである!! 全て UN*X ベースの OS なのですんなり行くと思っていたし,まさかこれほど悩むとは思わなかった.

結局,NetBSD/macppc Partitioning HOW-TO に従い,Linux 環境は read-only で諦めて「Apple UFS」を採用することに決める.ちなみに 「Apple UFS」とは普通の UFS と違い x86ハードウェアでも big endian になるという代物で,現段階では NetBSD しかサポートしていないらしい.
Mac OS X Filesystems

Darwin's implementation of UFS is similar to that on *BSD, as was NEXTSTEP's, but they are not really compatible. Currently, only NetBSD supports it. Apple's UFS is big endian (as was NeXT's) - even on x86 hardware. It includes the new Directory Allocation Algorithm for FFS (DirPref). The author of the algorithm offers more details, including some test results, on his site.


Mac の「ディスクユーティリティ」で「UNIX ファイルシステム」を選んでフォーマットすれば OK.NetBSD では kernel option の "options APPLE_UFS" と "options FFS_EI" を有効にしてカーネルを再構築すれば OK のはずだがもう1山あった.NetBSD の FFS_EI にバグがあり,PR 26823 で報告されている.この中の Michael Hitch の2つ目のパッチをカーネルにあててやっとOKだった.

以下に適用したパッチを添付しておく.

/c/NetBSD-current/src/sys/ufs/ffs/ffs_vfsops.c      2004-07-06 
21:54:15.000000000 -0600
+++ sys/ufs/ffs/ffs_vfsops.c    2004-10-28 10:28:42.000000000 -0600
@@ -1024,7 +1024,7 @@
        fs->fs_csaddr = fs->fs_old_csaddr;
        fs->fs_sblockloc = sblockloc;


-       fs->fs_flags = fs->fs_old_flags;
+       fs->fs_flags = fs->fs_old_flags | (fs->fs_flags & FS_INTERNAL);


        if (fs->fs_old_postblformat == FS_42POSTBLFMT) {
                fs->fs_old_nrpos = 8;

ちなみに私が利用しているのは NetBSD 2.0 で,3.0 ではこの不具合が修正されていた (上記のパッチがそのまま適用されていた).

ここまで来れば,あとは外部デバイスとファイルを同期する際,unisonrsync などの同期ソフトに,以下あたりの 「Mac が勝手に作る隠しファイル」を無視するように設定しておけば良いだろう.
._*
.DS_Store
.Trash
.Spotlight-*
.Trashes
.hidden
.hotfiles.btree
.vol

せっかくなので,iMac の uid/gid を合わせておきたいところだが,長くなってきたのでこれは次のエントリーに譲ることにしよう.


0 comments: