1(1)/20167 更新:2015/10/24

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

簡単システム切替→


以下の話はOS X 10.9.*(Mavericks)/OS X 10.10.*(Yosemite)/OS X 10.11.*(El Capitan)でのみ有効です。

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

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

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

ところが、Mac OS X 10.7.*(Lion)では、この方法での書き込みができなくなり、OS X 10.11.*(El Capitan)でも未だに書き込みできません。また、El CapitanでもNTFSファイル書き込み(Lion/Mountain Lion編)で書いた方法と基本的には同じ方法で書き込めるようになりますが、ちょっとだけ違いがあります。

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

Mavericks/Yosemite/El Capitan上でNTFSマウント

さて、まずnobrowseオプションをつけてマウントする方法はLionと全く同じですので、NTFSファイル書き込み(Lion/Mountain Lion編)をご覧下さい。

この方法は、普通にはFinder上で表示できませんのでご注意ください。

Yosemite、El Capitanについて

詳しい説明の前に、セキュリテイ強化されたYosemite、El Capitanについて書いておきます。

Yosemite、El Capitanでも基本的にはMavericksと同様にntfs.kextを修正ビルドすることによって、書き込みできるようになるのですが、kextに署名がされていないと動作しない(ロードしない)ようになっています。なので、署名すればすむのですが、(有料の)デベロッパー登録をしたユーザの署名でないとダメなようで、そこまでするのはどうも...
(もちろん、デベロッパー登録をしている人なら、下記方法で作成したntfs.kextに署名して使えば動作すると思います。署名の方法などは、Xcodeのマニュアルなどを参照してください。)
例外的に、kextのハッシュコードを登録しておいて、そのハッシュコードに一致するkextであれば動作するようですが、どのようにハッシュコードを作成しているのかよくわかりません。ということで、強化されたセキュリテイを無効にすることで対応したいと思います。

注意せっかく強化されたセキュリティを無効にしてしまいますので、必ず自己責任でお願いします。

まず、Yosemiteの場合nvram上に以下のようなパラメータを設定して再起動することによって無署名ntfs.kextが有効になります。

% sudo nvram boot-args="kext-dev-mode=1"
	:
%

El Capitanの場合、さらにシステム整合性保護機能というセキュリティ強化がされ、kext署名の無効化方法も変更されています。システム整合性保護機能を無効にすることで、kext署名も無効化できるのですが、その方法については、ちょっと長くなりますので、OS X 10.11 El Capitanのシステム保護機能「Rootless」を無効にするcsrutilコマンドの使い方などを参照してください。

後は、ntfs.kextを下記(ソースコードなどのバージョンは適当に読み替えてください)のように変更してやれば、Mavericksと同様に書き込みできるようになります。

ntfs.kextの修正ビルド

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

まず、開発環境のxcode 5.*以降をMac App Storeからダウンロードし、インストールします。なお、xcode 4.*の時は、Command Line Toolsを別途インストールする必要がありましたが、xcode 5.*以降ではxcode 5.*以降のインストール時に同時にCommand Line Toolsもインストールされるようで、別途Command Line Toolsをインストールする必要はありません。
インストールしたら、一度xcodeを起動し、"Xcode→Preferences..."メニューの"Locations"タブの"Derived Data:"の項目を"Default"から"Relative"に変更しておいてください。必須ではありませんが、以下の説明は変更してあることを前提に書いていますので、どうしても変更したくない場合はPathを適当に読み換えてください^^;
また、Apple Open Source (Mac OS X 10.9 Source)から、ntfs-83xnu-2422.1.72(足りないヘッダファイルを補うために必要なので)をダウンロードします。

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

% tar xvfz ntfs-83.tar.gz
    :
% tar xvfz xnu-2422.1.72.tar.gz
    :
%

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

% cd ntfs-83
% open ntfs.xcodeproj
%

xcode上で("Product→Scheme"メニューでntfs.kextを選ぶなどして)active schemeをntfs.kextにし、"Product→Scheme→Edit Scheme..."メニューを開いて、Run->Info->Build ConfigurationをDeploymentに設定します。
次に、Projectウィンドウでntfs projectをクリックして選択し、"Editor→Validate Settings..."を選ぶと、Xcode 5(以降)のproject形式に変換するかどうかのメッセージボックスが現れますので、"Perform Changes"を選んで変換します。

また、xnuよりlocks.hを適切な場所にコピーします。locks.hについては、Xcodeのリソースの中のヘッダファイルを置き換えますので、元のファイルはsaveしておいたほうがよいと思います。Lion/Mountain Lion時にはkernel frameworkの中を書き換える必要がありましたが、Xcode 5(以降)では自分自身のリソースとして各種ヘッダファイルを持っているようですので、システムのframeworkを弄る必要はなくなっています。また、Lion/Mountain Lion時に必要だったspecdev.hはXcode内に組み込まれているようで、コピーする必要はなく、ソースコードを書き換える必要もありません。

% cd kext
% sudo mv /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/i386/locks.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/i386/locks.h.org
% sudo cp ../../xnu-2422.1.72/osfmk/i386/locks.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/i386/
%

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

	if (vfs_isrdwr(mp))
		vfs_setflags(mp, MNT_DONTBROWSE);
となっているところと、4112行目の
	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 ../DerivedData/ntfs/Build/Products/Deployment/ntfs.kext /System/Library/Extensions/
%

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

使い方(マウント方法)

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

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