1(1)/15468 更新:2013/05/19

←ホームページ

NTFSファイル書き込み(Lion編)→


以下の話はMac OS X 10.4.*でのみ有効です。10.3.*でも動作するかも知れませんが、検証はしていません。

注意このページの内容については、何ら動作を保証するものではありません。使用するときは個人の責任でお願いします。

NTFSファイル書き込み

Intel MacではBoot Campを使って、Windowsを動作させることができますので、NTFSでフォーマットされたHD(パーティション)を使うことも多くなっています。

ところが、現状Mac OS XではNTFSフォーマットされたパーティション上のファイル(以下、NTFSファイルということにします)を読み込むことは出来ても、書き込むことが出来ません。ですから、Mac OS X上のファイルをNTFSパーティションにコピーしようとすると、ParallelsVmware経由で移動したり、ネットワークドライブに一旦コピーしたあと、Windowsを立ち上げてコピーするなど、いろいろと面倒です。

ということで、ここではNTFSパーティションをマウントして、Finder上から普通に読み書きできる方法を紹介します。

MacFUSEntfs-3g

FUSEというのは、ユーザ空間で動作するプログラム(要するにドライバなどの制約の多い特権プログラムではない普通のプログラム)のために、ファイルシステム構築のための機能(API)を提供するものです。その使いやすさのため、現在、非常に多くのファイルシステムがFUSEを使って作られています。

ntfs-3gはそのファイルシステムの一つで、その名の通り、NTFSファイルの読み書きができるファイルシステム(ドライバ)です。

また、MacFUSEというのは、元々Linux用に作られたFUSEのMacへの移植版です。

MacFUSEとntfs-3gのインストール

MacFUSEはバイナリパッケージが提供されていますので、それをダウンロードして、普通のアプリケーションをインストールするのと同様に、インストーラを動かしてインストールすれば終わりです。ソースコードも提供されていますので、自分でビルドして動かすこともできますが、MacFUSEだけでなく、glibやgettextなどいくつもインストールしないといけませんので、素直にバイナリをインストールしたほうが無難だと思います。

ただ一つだけ、MacFUSEのバージョンが0.1.7以前の場合、BootCampを使用しているとき、システム設定の起動ディスクにWindowsの起動パーティションが現れなくなってしまうことがあるそうですので、MacFUSEの0_READ_THIS_FIRSTのページを参考に修正してください。
簡単に言うと、/System/Library/Filesystems/fusefs.fs/Contents/Info.plistのNTFSとなっているところをNTFS-3gと直せばよいようです。

次に、ntfs-3gですが、これは元々Linux用に作られており、Mac用のバイナリパッケージは正式にはありません。
探せばある(こことか)ようですが、うまく動かないという話もありますし、(こっちはわりと簡単なので)自分でbuildしたほうがよいと思います。

ということで、ntfs-3gのビルド方法です。

基本的にはAppleNova Forumsのこの投稿のようにすればよいのですが、最近のバージョンではうまくいかないところもありますので、多少修正しながら、順を追って説明します。

まず、ntfs-3gの最新版ソースをntfs-3gのページからダウンロードし、適当な場所に展開します。現在の最新版はntfs-3g-0.20070118-BETA.tgzですので、以下はこれを例に話を進めます。
Shellはtcshを使っていますので、それ以外を使っている人は適当に読み替えてください。また、wgetXCodeなどはインストールされていることを前提にしています。

% wget http://www.ntfs-3g.org/ntfs-3g-0.20070118-BETA.tgz
    :
% tar xvfz ntfs-3g-0.20070118-BETA.tgz
    :
% cd ntfs-3g-0.20070118-BETA
%

次にconfigureですが、Linuxでしか動かないようになっていますので、

case "$target_os" in
の先の行の
linux*)
となっているところを、
*)
に変更します。

また、Mac OS Xでは持っていない関数getresuid()を使っていますので、これをgetuid()とgeteuid()で置き換えます。つまり、src/ntfs-3g.cで、

	if (getresuid(&uid, &euid, &suid)) {
		ntfs_log_perror("Failed to get user ID's");
		goto err_out;
	}
となっているところを、
	uid = getuid();
	euid = geteuid();
	suid = euid;
で、置き換えます。

これだけで、問題なくコンパイルでき、動作はしますが、毎回エラー(ワーニング)メッセージが表示され、煩わしいですので、以下の変更を加えることにします。src//ntfs-3g.cで、

	fstype = get_fuse_fstype();
	if (fstype == FSTYPE_NONE || fstype == FSTYPE_UNKNOWN)
		fstype = load_fuse_module();
となっているところを、
	fstype = FSTYPE_FUSEBLK;
で、置き換えます。

これで材料がそろいましたので、以下のように、ビルド、インストールします。

% env CFLAGS="-D_FILE_OFFSET_BITS=64 -D__FreeBSD__=10" ./configure --prefix=/usr/local
    :
% make
    :
% sudo make install
    :
%

使い方(マウント方法)

以下の手順でマウントします。

  1. デバイス名を知る

    マウント時にデバイス名が必要になりますから、まずそれを調べます。デバイス名を知るには、ディスクユーティリティの"情報をみる"を使う方法もありますが、dfコマンドなどでも簡単に知ることができます。

    % df
        :
    /dev/disk0s2    83770024 52642226 31127798 71% /Volumes/Untitled
        :
    %
    

    上記の場合、/dev/disk0s2がデバイス名です。

  2. アンマウント

    Mac OS XではNTFSパーティションを読むことはできますので、通常、立ち上がっているときはマウントされた状態になっていますので、ntfs-3gでマウントする前に、まずマウントを解除する必要があります。マウントの解除はディスクユーティリティのマウント解除機能を使ってもできますが、diskutilコマンドを使うほうが後々便利です。具体的には以下のようになります。

    % sudo diskutil unmount /Volumes/Untitled
    %
    

    /Volumes/Untitledは、実際の環境のマウントポイントに合わせて変更してください。BootCampを使って、素直にWindowsをインストールした場合、ボリューム名はUntitledになっていると思います。

    diskutilではなくumountコマンドを使っても、一見、アンマウントされたようになりますが、Finder上からそのボリュームアイコンは消えませんし、/Volumesディレクトリにはディレクトリが残ったままで、中途半端な状態になってしまいますので、使わないようにしてください。

  3. マウント

    マウント先のディレクトリを作成し、そこにNTFSパーティションをマウントします。以下のようになります。

    % sudo mkdir /Volumes/WinSys
    % sudo ntfs-3g /dev/disk0s2 /Volumes/WinSys -o ping_diskarb,volname="WinSys"
    %
    

    これで、デスクトップにWinsysボリュームが現れるはずです。自分のローカルディスク上にマウントするなら、特にsudoを使う必要はありませんが、Mac OS X標準のマウントポイントにあわせたいということと、起動時のマウントともあわせたいということもあって、sudoを使って/Volumesディレクトリ下にマウントしています。

  4. Mac OS X起動時のマウント

    起動時には通常DiskArbitration(diskarbitrationd)が見つけた(マウントできる)パーティションはすべてマウントされてしまいます。ただ、/etc/fstabは見ているようで、そこに特定のパーティションを自動マウントしないように指定しておけば、起動時にマウントされないようにすることができます。
    普通、/etc/fstabを見に行くのはmountコマンドなのですが、どうもMac OS Xのmountコマンドは/etc/fstabを見に行かないようです。(man mountで見る限りは見に行くことになっていますが...)

    それなら、/etc/fstabにうまく指定すれば、逆に、ntfs-3gを使ってマウントさせることができるのではないかと、ちょっと試してみましたが、これは無理なようです。

    ということで、/etc/fstabの設定で、DiskArbitrationがNTFSディレクトリを読み取り専用として自動マウントしないようにし、launchdを使って、ntfs-3gでマウントするようにしてみました。

    具体的にはまず、/etc/fstabファイルを(なければ)作成し、次のような行を書いてセーブします。

    LABEL=Untitled none ntfs rw,noauto
    

    LABEL=...のところは、UUIDを書きたかったのですが、どうもNTFSパーティションにはUUIDが設定されていない(あるいはMac OS Xから見えない?)ようで、書けませんでした。なお、デバイス名ではうまく動かないようです。(diskarbitrationdのmanページ参照)

    次に、マウントを実行するためのコマンドファイルを作成します。(これをmountwinとしておきます。) コマンドファイルの中身は以下のようなものです。

    if [ -d /Volumes/Untitled ]; then
        /usr/sbin/diskutil unmount /Volumes/Untitled > /dev/null 2>&1
        /bin/rmdir /Volumes/Untitled  > /dev/null 2>&1
    fi
    if [ -d /Volumes/WinSys ]; then
        /usr/sbin/diskutil unmount /Volumes/WinSys > /dev/null 2>&1
        /bin/rmdir /Volumes/WinSys > /dev/null 2>&1
    fi
    /bin/mkdir /Volumes/WinSys
    /usr/local/bin/ntfs-3g /dev/disk0s2 /Volumes/WinSys -o ping_diskarb,volname="WinSys"
    

    上記のif文の中は、万一マウントが既にされていたり、マウントポイントのディレクトリがすでに存在していた場合に、それらを念のため解除するために存在します。

    このファイルを、/usr/local/sbin/mountwinとして保存します。もちろん、実行権は設定しておいてください。最後に/Library/LaunchDaemonsにmountwin.plistという名前で、以下の内容のファイルを作成します。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>Label</key>
    	<string>jp.yansite.mountwin</string>
    	<key>ProgramArguments</key>
    	<array>
    		<string>/usr/local/sbin/mountwin</string>
    	</array>
    	<key>RunAtLoad</key>
    	<true/>
    </dict>
    </plist>
    

    これで、Mac OS X起動時にNTFSパーティションを書き込み可能なボリュームとしてマウントできるようになります。ただし、どうも外付けのHDのNTFSパーティションを起動時にマウントしようとすると、どうもうまくできないようです。launchdではなく、SystemStarterを使って、もっと起動の後ろの方でマウントするようにすればうまくいくかも知れませんが、当面私には必要性は薄く、やってみていないので、どうなるかは分かりません。