使用 ntfs-3g 替换 macOSX 原生的 ntfs 自动挂载程序, 实现 macOSX 自动挂载读写的ntfs分区, Mountain Lion 测试可行.
需要以下准备:
/usr/bin/ruby <(curl -fsSk https://raw.github.com/mxcl/homebrew/go)
brew install ntfs-3g
sudo /bin/cp -rfX $(brew --prefix fuse4x-kext)/Library/Extensions/fuse4x.kext /System/Library/Extensions
sudo chmod +s /System/Library/Extensions/fuse4x.kext/Support/load_fuse4x
参考链接: http://fuse4x.org/
# 备份原有的挂载程序
sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.orig
# 创建新的挂载程序并调整权限
sudo touch /sbin/mount_ntfs
sudo chmod 0755 /sbin/mount_ntfs
sudo chown 0:0 /sbin/mount_ntfs
# 编辑文件
sudo mvim /sbin/mount_ntfs
输入以下内容:
#!/bin/bash
VOLUME_NAME="${@:$#}"
VOLUME_NAME=${VOLUME_NAME#/Volumes/}
USER_ID=501
GROUP_ID=20
TIMEOUT=20
if [ `/usr/bin/stat -f "%u" /dev/console` -eq 0 ]; then
USERNAME=`/usr/bin/defaults read /library/preferences/com.apple.loginwindow | /usr/bin/grep autoLoginUser | /usr/bin/awk '{ print $3 }' | /usr/bin/sed 's/;//'`
if [ "$USERNAME" = "" ]; then
until [ `stat -f "%u" /dev/console` -ne 0 ] || [ $TIMEOUT -eq 0 ]; do
sleep 1
let TIMEOUT--
done
if [ $TIMEOUT -ne 0 ]; then
USER_ID=`/usr/bin/stat -f "%u" /dev/console`
GROUP_ID=`/usr/bin/stat -f "%g" /dev/console`
fi
else
USER_ID=`/usr/bin/id -u $USERNAME`
GROUP_ID=`/usr/bin/id -g $USERNAME`
fi
else
USER_ID=`/usr/bin/stat -f "%u" /dev/console`
GROUP_ID=`/usr/bin/stat -f "%g" /dev/console`
fi
# 这里指向安装好的`ntfs-3g'文件
/usr/local/bin/ntfs-3g \
-o volname="${VOLUME_NAME}" \
-o local \
-o noappledouble \
-o negative_vncache \
-o auto_xattr \
-o auto_cache \
-o noatime \
-o windows_names \
-o user_xattr \
-o inherit \
-o uid=$USER_ID \
-o gid=$GROUP_ID \
-o allow_other \
"$@" &> /var/log/ntfsmnt.log
exit $?;
sudo mv /sbin/mount_ntfs{.orig,}
# 运行上面这段代码即可
如果你升级了 Fuse4x, 需要先卸载旧的内核扩展再进行上面的第二步. 首先确认一下那些基于 FUSE 的文件系统有没有跑着:
mount -t fuse4x
接着卸载那些 FUSE 文件系统和内核扩展:
sudo kextunload -b org.fuse4x.kext.fuse4x