我有几个用 exFAT 格式化的大硬盘,以保持 Win7/Bootcamp 和 Snow Leopard 之间的兼容性。
问题在于:fsck_exfat
需要 6-8GB 左右的 RAM 才能在大型磁盘上完成。(顺便说一下,Windows 的 chkdsk 工作正常)。如果 OSX 检测到某个卷是脏的,它似乎会自动尝试fsck
该卷……但我发现它实际上并没有解决任何问题。在此期间自动的扫描,OSX 必须分页几乎所有其他内容才能交换。我在家里的办公桌前使用几个外部驱动器,如果 exFAT 卷很脏,那么笔记本电脑可能需要 10 多分钟才能使用每个驱动器,这是后Finder 加载。
在建议使用备用文件系统之前:
- FAT32 - 4GB 文件限制对我来说是个问题,而且我至少有一个 3TB 的驱动器。考虑将较小的驱动器重新格式化为这种格式
- NTFS - 我试过的每个 OSX NTFS 驱动程序都很糟糕。ntfs3g 在 CPU 时间方面效率极低,而且由于某种原因,在 I/O 繁忙时,整个系统经常会冻结数秒。Tuxera NTFS 更好一些,但对于重度使用来说仍然很糟糕。Finder 为大型图像文件夹生成缩略图,或者在 300+gb 的托管库上使用 Songbird 的基本操作,都变得非常不愉快(而且不稳定)。
- HFS+ - 我在 Windows 中使用的 HFS 驱动程序(与 Seagate 硬盘捆绑在一起的 Paragon)已损坏至少一个重要文件夹,我拒绝再次触碰它
更糟糕的是,我试图在没有交换的情况下运行这台笔记本电脑,因为我对 OSX 的交换行为感到恼火(基本上,它会将不活动的内容分页到磁盘,而不管可用的 RAM 是多少)。禁用交换文件带来的性能提升非常好。但是!每次fsck
启动时,自动地之后笔记本电脑很快就会因内存不足而死机。
这当然让我陷入了循环:启动笔记本电脑,OSX 发现脏 exFAT,自动fsck
将其删除,笔记本电脑死机,由于错误关机,驱动器被标记为脏,反复清洗……真不愉快。启动 Win7 并运行 chkdsk(并干净地关机)可以摆脱这个循环。交换现在已重新启用 :-(
最好的部分是我仍然必须手动修复脏卷,因为无论出于什么原因,它们都以只读方式安装!我只能在自己修复fsck
它们之后才能撤消它!
这真是令人沮丧。那么……如何禁用fsck_exfat
在脏 exFAT 安装上运行的自动程序?或者您有其他解决方案吗?我不介意 OSX 安装驱动器 RO,如果这意味着我可以控制我的计算机(并且可以fsck
在以后有空时控制驱动器)。
答案1
免责声明:我没有办法正确地测试它,但以下内容可能会给你带来一些成功。
- 禁用 SIP:https://stackoverflow.com/a/32910408/619961
sudo plutil -replace FSPersonalities.ExFAT.FSRepairExecutable -string "/usr/bin/true" /System/Library/Filesystems/exfat.fs/Contents/Info.plist
- 启用 SIP
背景理念:在 XNU 内核代码中搜索有关 Apple 如何实现此功能的有用参考,并分析 hopper 中的 exfat_mount 二进制文件后,我预计替换FSRepairExecutable
或FSVerificationExecutable
简单地始终返回成功可以解决您的挑战。
以下是 ExFAT 相关 plist 的相关部分:
"FSPersonalities" => {
"ExFAT" => {
"FSRepairArguments" => "-y"
"FSVerificationArguments" => "-n"
"FSFormatMinimumSize" => 1048576
"FSFormatExecutable" => "newfs_exfat"
"FSFormatContentMask" => "Windows_NTFS"
"FSName" => "ExFAT"
"FSRepairExecutable" => "fsck_exfat"
"FSMountExecutable" => "mount_exfat"
"FSMountArguments" => ""
"FSVerificationExecutable" => "fsck_exfat"
"FSXMLOutputArgument" => "-x"
"FSFormatArguments" => ""
"FSFormatMaximumSize" => 144115188075855872
}
}
由于此文件位于文件夹下/System
,较新的 OSX 内核使用 SIP 保护它。因此需要上述微小而繁琐的解决方法。
或者,为了将来更轻松地编辑此 plist 文件而又不会过多损害您的安全性,您也可以在恢复模式下保持 SIP 启用,同时为文件系统部分禁用它:
csrutil enable --without fs
鉴于您似乎在一定程度上遇到了困难,您是否曾考虑过采用 Parallels 或 VMWare 之类的虚拟化解决方案?
答案2
灵感来自Moreaki 的回答(这似乎在 Mojave 上不起作用)我想出了一个丑陋的解决方法:
- 禁用 SIP(参见 Moreaki 的回答)。
- 创建原始文件的备份
fsck_exfat
:
sudo cp /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat_ORIGINAL
- 将二进制文件替换
fsck_exfat
为/usr/bin/true
:
sudo cp /usr/bin/true /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat
- 启用 SIP。
笔记:
which -a fsck_exfat
将显示位于 的二进制文件,/sbin/fsck_exfat
这是位于 下的真实二进制文件的符号链接/System/Library/...
。当 Mac 检查 ExFat 磁盘时,您可以fsck_exfat
使用来查看实际路径ps aux | grep exfat
。
警告:更改后,您的系统将不再自动检查和修复 exfat 驱动器!为了检查和修复这些驱动器上的错误,最好使用对 exfat 有更好支持的操作系统,例如 Windows 甚至 Linux。如果您没有其他操作系统,那么您仍然可以使用在步骤 #2 中创建的副本 ( /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat_ORIGINAL
)。此方法 不删除脏位,——它只是强制立即返回fsck_exfat
成功响应代码(0
)。