1(1)/31685 更新:2015/10/17

←NTFSファイル書き込み

NTFSファイル書き込み(Mavericks/Yosemite/El Capitan編)→


以下の話はMac OS X 10.7.*(Lion)及び10.8.*(Mountain Lion)でのみ有効です。

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

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

Mac OS X 10.6.*(Snow Leopard)では、公式にはサポートされていませんが、内蔵されているNTFSドライバーを使って、NTFSフォーマットされたパーティション上のファイル(以下、NTFSファイルということにします)を読み書きすることができました。具体的な方法についてはいろいろなところで紹介されていますので、そちらを参照してください。
例えば、「知られざるSnow Leopard(NTFS編)」などを参考にするとよいと思います。

ところが、Mac OS X 10.7.*(Lion)では、この方法での書き込みができなくなってしまいました。NTFSファイル書き込みで書いたように、MacFUSEとntfs-3gを使って書き込みできるようにする方法もありますが、動作速度が遅いですし、ちょっと問題(うまくマウントできないとか、エラーメッセージが表示されるとか)もあるようです。

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

Lion上でNTFSマウント

さて、Snow Leopardで書き込みマウントできていたNTFSパーティションが、なぜLionではできなくなってしまったか、ですが、どうやらNTFSファイルの書き込みにはバグがあるようで、Finder上では書き込みできないよう強制的にReadOnlyでマウントするように修正されてしまったようです。

しかし、逆にいうと、Finder上で表示できなくてもよいなら、読み書きマウントすることは可能です。つまり、nobrowseオプションを付けてマウントすれば、書き込みできるようになります。具体的には、Terminal上で以下のようにすればよいでしょう。

% sudo umount /Volumes/Win7
% sudo mkdir /Volumes/Win7
% sudo mount -t ntfs -o nobrowse,rw /dev/disk0s3 /Volumes/Win7
%

ここで、/dev/disk0s3というのはNTFSパーティションで、/Volumes/Win7というのは、そのマウントポイントのことです。これらは環境に合わせて適当に読み替えて(変更して)ください。また、起動時にマウントしたいなら、/etc/fstabファイルに以下のように書いておけばよいと思います。(試していませんので、間違っていたらすみません)

LABEL=Win7 none ntfs nobrowse,rw

Finder上での表示

上記の通り、Lion上でもNTFSの書き込みマウントはできますが、普通にはFinder上に表示されませんので、ちょっと(かなり?)不便です。

ただ、絶対表示できないことはありません。例えば、Terminal上で以下のように実行すれば、とりあえず表示することはできます。

% cd /Volumes/Win7
% open .
%

それでも、やはり不便であることは確かです...

ntfs.kextの修正ビルド

ということで、NTFSドライバー(ntfs.kext)ソースコードを修正し、nobrowseオプションなしでも読み書きできるようにします。

まず、開発環境のxcode 4.*をMac App Storeからダウンロードし、インストールします。
また、Apple Open Source (Mac OS X 10.7 Source)から、ntfs-78xnu-1699.22.73(足りないヘッダファイルを補うために必要なので)をダウンロードします。

ダウンロードしたntfsとxnuを以下の通り、Terminal上で(Terminal上でなくてもよいですが...)展開します。
Shellはtcshを使っていますので、それ以外を使っている人は適当に読み替えてください。

% tar xvfz ntfs-78.tar.gz
    :
% tar xvfz xnu-1699.22.73.tar.gz
    :
%

次に、xcodeでntfs-78を開きます。

% cd ntfs-78
% open ntfs.xcodeproj
%

xcode上でSchemeをntfs.kextにし、"Edit Scheme..."を開いて、Run->Info->Build ConfigurationをDeploymentに設定します。

また、xnuより、specdev.hとlocks.hを適切な場所にコピーします。locks.hについては、kernel.frameworkの中のファイルを置き換えますので、元のファイルはsaveしておいたほうがよいと思います。

% cd kext
% cp ../../xnu-1699.22.73/bsd/miscfs/specfs/specdev.h .
% sudo mv /System/Library/Frameworks/Kernel.framework/Headers/i386/locks.h /System/Library/Frameworks/Kernel.framework/Headers/i386/locks.h.org
% sudo cp ../../xnu-1699.22.73/osfmk/i386/locks.h /System/Library/Frameworks/Kernel.framework/Headers/i386/
%

xcode上でソースコード(ntfs_vfsops.c)を書き換えます。具体的には68行目の

#include <miscfs/specfs/specdev.h>
となっているところを、
#include "specdev.h"
に、書き換え、3919行目の
	if (vfs_isrdwr(mp))
		vfs_setflags(mp, MNT_DONTBROWSE);
となっているところと、4019行目の
	if ((vfs_flags(mp) & MNT_DONTBROWSE) == 0 && !vfs_isupdate(mp))
		vfs_setflags(mp, MNT_RDONLY);
となっているところをコメントアウトします。

//	if (vfs_isrdwr(mp))
//		vfs_setflags(mp, MNT_DONTBROWSE);
//	if ((vfs_flags(mp) & MNT_DONTBROWSE) == 0 && !vfs_isupdate(mp))
//		vfs_setflags(mp, MNT_RDONLY);

これで材料がそろいましたので、xcode上でビルド(Product->Build For->Build For Running)し、以下のように、インストールします。オリジナルのntfs.kextは適当な場所にsaveしておいた方がよいと思います。

% sudo mv /System/Library/Extensions/ntfs.kext ~/save/
% sudo cp -R ~/Library/Developer/Xcode/DerivedData/ntfs-****/Build/Products/Deployment/ntfs.kext /System/Library/Extensions/
%

"ntfs-****"のところは環境によって異なりますので、適当に読み替えてください。

とりあえずこれで修正インストールは終了ですので、再起動をして、正常に立ち上がるか(もちろんこのままでは、NTFSパーティションはReadOnlyで立ち上がるはず)試してみてもらえばよいのですが、万一途中でハングする場合のことを考えて、外付けHDなどから起動できるバックアップ環境を作っておくことを強く勧めます。

使い方(マウント方法)

ここまでくれば、あとはSnow Leopardと同様な方法で、Read-Writeマウントすればよいだけです。例えば、「知られざるSnow Leopard(NTFS編)」などを参考にしてください。

私の場合、手動で設定するのが面倒なので、SL-NTFSを使ってマウントしています。

Mountain Lionの場合

さて、Mountain Lionの場合も、基本的にはLionの場合と同じで、書き込みを許していませんが、Lionと同じ方法で書き込みできるようになります。ただ、ntfsのソースコードが変更されていますので、上記ソースコードの行番号が微妙に変わっていますが、修正点は変わっていません。文字列を検索するなどして、該当箇所を修正すれば書き込めるようになります。