Mac 读写 NTFS 这事,我自己写了个工具:插上硬盘就自动挂载

软件相关 · 7 分钟阅读· 37 次阅读

把一块 Windows 时代留下来的移动硬盘插到 Mac 上,想拷一部电影进去,访达直接弹了个提示:此项目不能被修改——macOS 对 NTFS 天生只读。

装 Paragon NTFS,官网一年两百块;iBoysoft 也要小一百;开源的老方案 macFUSE 更麻烦:要装内核扩展,还得重启进恢复模式把系统安全策略降级,SIP 一关,系统完整性就裸奔了。

作为一个手里有服务器、有代码的人,这事的最优解显然不是掏钱,是自己写一个。于是有了这个「NTFS 读写助手」:一个 1.8 MB 的菜单栏小工具,插上 NTFS 硬盘 3 秒自动转读写、自动弹访达窗口。写完已经在我自己的机器上跑了几天,插拔十几次、330GB 的资料读写无恙。今天放出来,免费下载。

NTFS 读写助手封面

先说结论

  • macOS 原生对 NTFS 只读,往里拷文件直接被拒;商业软件(Paragon / iBoysoft)要收费,老开源方案要动系统安全策略
  • 我写的 NTFS 读写助手:免费、安装包约 1.8 MB、ntfs-3g + FUSE-T 双引擎全内置,拖进「应用程序」就能用
  • 插上硬盘约 3 秒自动转为读写并弹出访达窗口;首次运行授权一次管理员密码,之后永久免密
  • 稳定性下了大功夫:USB 掉线 5 秒内自动恢复挂载,推出保护、僵尸挂载自动清理都有
  • 支持 Apple Silicon(M 系列)和 Intel,macOS 13 及以上
  • 产品页(教程与下载):杨杨.xyz/ntfs;直链:NTFSReadWriteHelper-1.4.0.dmg

为什么 Mac 天生不能写 NTFS

NTFS 是微软的文件系统,核心实现不开源。Apple 的态度一直很微妙:系统里其实藏着一个实验性的 NTFS 写开关(/etc/fstab 里加 ntfs rw),但从来没被官方支持过,新版 macOS 里基本形同虚设。

所以想写 NTFS,只有三条路:

路线 代表 问题
商业闭源驱动 Paragon NTFS、iBoysoft、Tuxera 收费年付,闭源黑盒
内核扩展开源方案 macFUSE + ntfs-3g 要重启进恢复模式降级安全策略,新版 macOS 越来越难装
用户态文件系统 FUSE-T + ntfs-3g 性能略低于内核方案,但不碰系统任何设置

我选了第三条。FUSE-T 的思路很聪明:它不做内核扩展,而是把 FUSE 文件系统请求翻译成 NFS 协议,通过本机回环挂载。ntfs-3g 则是十几年历史、久经考验的开源 NTFS 实现,Linux 世界的标配。两者都是纯用户态,SIP、系统安全策略统统不用动。

代价也有:因为本质是回环 NFS,Finder 会把这个卷归类成「网络位置」而不是本地磁盘。这是架构决定的,不影响使用。

写 App 容易,稳定才是真功夫

挂载本身不难:调 ntfs-3g,指定卷和挂载点,几行代码的事。真正花时间的是把「插上就能用、拔了再插还能用」做到位。这几个坑记录一下,踩过的都知道多恶心。

坑一:一行解析错误,硬盘被自己反复卸载

FUSE-T 挂载成功后,mount 命令的输出长这样:

fuse-t:/Untitled on /Volumes/Untitled (nfs)

我靠解析这一行来确认挂载状态。第一版代码在截取文件系统类型时,把右括号一起带进了变量——于是类型永远不等于 nfs,App 每 12 秒就误判一次「盘掉了」,重新挂载一次。用户看到的现象就是:插上硬盘,它自己一遍遍卸载重挂。一个字符的 bug,症状完全不搭边。

坑二:僵尸挂载,假成功

USB 短暂断连重连后,系统会给盘分配新的设备号,而旧的 ntfs-3g 进程可能不退出,占着挂载点不撒手。这时 mount 列表里有这个卷,访达里也能看到,但点进去报 Device not configured——一个僵尸卷。

解法是每次挂载后必须做可达性探活:用 statvfs 真的去 stat 一次,通了才算挂载成功,不通就强卸重挂。

坑三:USB 选择性挂起,盘悄悄睡着

macOS 会对闲置的 USB 设备做省电挂起,盘就「掉」了。caffeinate -i -m 能挡住一部分,但文件层的 I/O 命中缓存后挡不住挂起判定。最后用的办法比较硬核:定期以 root 直接读一次裸设备(/dev/disk5 读 512 字节),设备级 I/O 让系统没法把它挂起。配合内存里的「这盘我挂成功过」记忆,盘掉了 5 秒内自动恢复。

坑四:死锁,App 自己把自己锁死

最阴的一个。第一版卸载逻辑是同步等待:主线程等特权助手返回 → 助手的 diskutil unmount 等 DiskArbitration 会话确认 → 而确认恰好需要主线程来应答 → 死锁。表现为 App 偶尔无响应。解法是把所有挂载/卸载操作全部丢到后台队列,再给特权助手加一个 8 秒看门狗,超时就杀进程用 umount 兜底。

怎么用

三步:

  1. 下载 DMG(约 1.8 MB),拖进「应用程序」
  2. 打开,输入一次管理员密码——这一步会自动装好免密挂载组件,之后再也不用输密码
  3. 插上 NTFS 硬盘,等两三秒,访达窗口自己弹出来,直接拖文件

产品页

项目 参数
当前版本 1.4.0
安装包 约 1.8 MB(引擎与运行库全内置)
系统要求 macOS 13 及以上,Apple Silicon / Intel
引擎 ntfs-3g 2022.10.3 + FUSE-T(开源引擎)
价格 0 元

下载地址:

已知限制

  • Finder 里卷显示为「网络位置」样式,这是 FUSE-T 回环 NFS 架构的固有行为
  • 写入速度在 USB 机械盘上实测 50 MB/s 左右,够用但别指望媲美原生
  • 很老的 NTFS 卷(Windows XP 之前格式化的)没有测试覆盖,遇到问题欢迎反馈

相关阅读

评论 (0)

还没有评论,来说两句吧~

发表评论

验证码

提交后需站长审核,通过后才会显示。