【折腾】开启 macOS 上原生的 NTFS 读写功能

先来张效果图


效果图

网上已经有的方法都比较麻烦,而且在新版系统中大多已经失效。我试过的还可以用的方法(在 10.12 中)只剩下修改 fstab 这一种了。很繁琐,每次插新设备都要改 fstab 表,还要重启后才能生效,更重要的是在 Finder 中找到分区位置还稍微有点麻烦。于是我想能不能从根源入手,(几乎)一劳永逸地解决这个问题。

首先说一下这么折腾的优缺点。优点是省钱(Paragon 和 Tuxera 做的 NTFS 驱动都是付费的),原生,比较满足一些原生党的心理诉求;缺点的话,性能可能不如第三方的高,毕竟术业有专攻,功能也可能会有所缺失,并且由于涉及到系统文件的修改,还会禁用系统完整性保护(SIP)功能。

然后是需要准备什么。一台 Mac,带与系统版本相匹配的 SDK 的 Xcode,然后就是苹果自己做的 macOS 版 NTFS 的代码。前两个不用说,第三个的话,可以在 https://opensource.apple.com 里下载的到。

下载解压,打开 ntfs.xcodeproj,找到 kext 下面的 ntfs_vfsops.c,按 ⌘F 搜索 MNT_DONTBROWSE,最新版(ntfs-91.50.2)代码里会找到两处,把相关代码注释掉

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

和这里

    if (vfs_isrdwr(mp))
        vfs_setflags(mp, MNT_DONTBROWSE);

在工具栏中选 ntfs.kext -> My Mac (64-bit),然后按 ⌘B 编译。


不要选成 32-bit 的

如果不出意外的话,会报错,提示 lck_rw_t 类型不完整之类的,按住⌘点进去大概是这个样子的

#ifndef _I386_LOCKS_H_
#define _I386_LOCKS_H_

#include <sys/appleapiopts.h>
#include <kern/kern_types.h>


typedef struct __lck_spin_t__   lck_spin_t;

typedef struct __lck_mtx_t__        lck_mtx_t;
typedef struct __lck_mtx_ext_t__    lck_mtx_ext_t;

typedef struct __lck_rw_t__ lck_rw_t;


#endif

而苹果并没有给出譬如 __lck_spin_t__ 之类的结构体的确切定义。
我在追根溯源的时候翻遍了 XNU 的代码,在从 XNU 生成的内核开发用的头文件中,我找到了可以用的这几个结构体的原型。

typedef struct {
    unsigned long    opaque[10];
} lck_spin_t;

typedef struct {
    unsigned long       opaque[2];
} lck_mtx_t;

typedef struct {
    unsigned long       opaque[10];
} lck_mtx_ext_t;


#pragma pack(1)
typedef struct {
    uint32_t        opaque[3];
    uint32_t        opaque4;
} lck_rw_t;
#pragma pack()

用其替换掉原来的四个 typedef,重新按 ⌘B 编译就得到了 ntfs.kext。

苹果曾经开放过 NTFS 的读写,但是不知道什么原因又禁用了,开发者在 mount_ntfs 里加了一行代码防止默认挂载为读写。
在 mount 中的 mount_ntfs.c 的 main() 函数中找到并注释掉这一行

/* Default to mounting read-only. */
    flags = MNT_RDONLY;

然后选好,⌘B。

放心,你依旧不会成功

会提示缺少头文件 mntopts.h,这个文件说实话害的我苦找了好几个小时,因为一开始搜的话搜到的都是 FreeBSD 相关的,但是 FreeBSD 的这个文件和 macOS 的还有点小区别,导致不能用。后来我在这里找到了 macOS 用的头文件,要么扔到 SDK 的 include 文件夹中,要么直接拖进工程然后把 #include <mntopts.h> 改成 #include "mntopts.h",依个人喜好而定。
最后 ⌘B,完成。

准备工作都做完了,剩下的就是把系统原来的文件都替换掉了。重启按 ⌘R 进恢复环境,选实用工具菜单,启动终端,输入 csrutil disable,按下回车,关掉 SIP。因为 SIP 会阻止用户替换系统文件和加载未经签名的 kext。当然副作用是恶意软件更容易提权对系统造成危害。

别问我怎么在恢复环境里截图的,这是技巧

重启之后先运行 kextstat | grep ntfs 确认 ntfs.kext 没有被加载
或者其他的方法也行,能确认就好

然后打开 ntfs.xcodeproj,在 Products 中点选 mount_ntfs 或 ntfs.kext 任一项,右键点选 Show in Finder
好磨叽啊有没有

我非要在这再加一张图

用终端把原来的 mount_ntfs 和 ntfs.kext 备份一下

sudo mv /sbin/mount_ntfs /sbin/mount_ntfs_orig
sudo mv /System/Library/Extensions/ntfs.kext /System/Library/Extensions/ntfs_orig.kext 

然后再把这两个分别 cp 到对应位置,不能直接复制不然权限会乱
比如我的在 /Users/alpine/Library/Developer/Xcode/DerivedData/ntfs-ccnxpvhcviyiuqcqzyqzrkoibcpc/Build/Products/Development/ 这里,如果你找不到的话,从 Finder 拖进终端里就行了

sudo cp -r /Users/alpine/Library/Developer/Xcode/DerivedData/ntfs-ccnxpvhcviyiuqcqzyqzrkoibcpc/Build/Products/Development/ntfs.kext /System/Library/Extensions/
sudo cp /Users/alpine/Library/Developer/Xcode/DerivedData/ntfs-ccnxpvhcviyiuqcqzyqzrkoibcpc/Build/Products/Development/mount_ntfs /sbin

这次挂一个 NTFS 分区试试看?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容