macOS挂载NTFS写权限的一种方案

Posted by crazywhale on 2019-05-19

先说问题

由于 macOS 原生是支持写权限的,但是原生的写权限因为版权或其他技术原因,苹果官方默认没有打开,即使通过一些方案打开了,写入也变得很不稳定。

首先使用官方的挂载写权限解决方案是:

  1. /sbin/mount_ntfs 移动到/sbin/mount_ntfs.orig
  2. 使用root权限编写 /sbin/mount_ntfs。root权限可能需要进入恢复模式使用 csrutil disable 关闭系统的完整性保护。
  3. 编写内容是:
1
2
#!/bin/sh
/sbin/mount_ntfs.orig -o rw,nobrowse "$@"
  1. 然后就可以进行愉快地读写了。

但是,以上的方式打开写权限后,写入 NTFS 分区的文件都会变成灰色,以至于macOS下就不能再操作了,需要使用 xattr -r -d com.apple.FinderInfo . 指令来将文件夹下的文件进行属性设置,比较麻烦。

曲线救国

这时要祭出来开源的力量了。github上有一个开源的项目是 osxfuse,这个项目旨在提供第三方文件系统的挂载操作等权限。优点是有的,他提供的对ntfs的读写功能经测试,是比较稳定的,而且也可以设置替换系统官方的自带挂载。缺点就是它好像没使用缓存,读写速度都非常慢。

首先需要做的就是安装osxfuse和ntfs-3g。安装方式使用homebrew就可以:

1
2
brew cask install osxfuse
brew install ntfs-3g

然后就是替换原生的 mount_ntfs 程序了。当然,这个第三方的挂载程序需要root权限以及关闭系统完整性保护,所以如果你对你的电脑安全有苛刻的要求的话,不建议折腾NTFS读写了,可以左转exFAT。

替换方式也比较简单。

1
2
sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.orig  # 将原生的挂载程序备份
sudo ln -s /usr/local/sbin/mount_ntfs /sbin/mount_ntfs # 将ntfs-3g挂载程序软连接到/sbin

编写半自动脚本

我们如果偶尔还需要切换回官方原生的挂载程序的话,我自己当然很懒每次都敲这么多命令,于是在装好ntfs-3g后写了段bash脚本。这段可以套在function扔进 .bash_profile 文件的结尾,也可以单独写一个 ntfs 的文件放入 /usr/local/bin 文件夹下然后 chmod a+x /usr/local/bin/ntfs 使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
if [ "$1" = "on" ]; then
if [ ! -f "/sbin/mount_ntfs.orig" ]; then
sudo cp /sbin/mount_ntfs /sbin/mount_ntfs.orig
fi
sudo rm /sbin/mount_ntfs
sudo ln -s /usr/local/sbin/mount_ntfs /sbin/mount_ntfs
echo "Switched to Write mode(ntfs-3g)."
elif [ "$1" = "off" ]; then
if [ ! -f "/sbin/mount_ntfs.orig" ]; then
echo "Mode not switched."
else
sudo rm /sbin/mount_ntfs
sudo cp /sbin/mount_ntfs.orig /sbin/mount_ntfs
echo "Switched to Read mode(original)."
fi
elif [ "$1" = "status" ]; then
file1=/sbin/mount_ntfs
file2=/sbin/mount_ntfs.orig
if [ ! -f "$file2" ]; then
echo "Mode: Off"
else
diff $file1 $file2 > /dev/null
if [ $? != 0 ]; then
echo "Mode: On"
else
echo "Mode: Off"
fi
fi
else
echo "Usage: ntfs [OPTIONS]\n"
echo "Example usage:"
echo " ntfs on\tMount NTFS with ntfs-3g to write-and-read"
echo " ntfs off\tMount NTFS with original macOS mount_ntfs"
echo " ntfs status\tShow status"
fi

用法:

1
2
ntfs on # 切换到ntfs-3g挂载模式
ntfs off # 切换回原生挂载模式

忠告:记得在替换 mount_ntfs 原来的文件之前,做备份!!!!!