先说问题
由于 macOS 原生是支持写权限的,但是原生的写权限因为版权或其他技术原因,苹果官方默认没有打开,即使通过一些方案打开了,写入也变得很不稳定。
首先使用官方的挂载写权限解决方案是:
- 将
/sbin/mount_ntfs 移动到/sbin/mount_ntfs.orig
- 使用root权限编写
/sbin/mount_ntfs。root权限可能需要进入恢复模式使用 csrutil disable 关闭系统的完整性保护。
- 编写内容是:
1 2
| #!/bin/sh /sbin/mount_ntfs.orig -o rw,nobrowse "$@"
|
- 然后就可以进行愉快地读写了。
但是,以上的方式打开写权限后,写入 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后写了段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
|
用法:
忠告:记得在替换 mount_ntfs 原来的文件之前,做备份!!!!!