在 Mac OSX 中禁用脏卷安装时的自动 fsck_exfat

在 Mac OSX 中禁用脏卷安装时的自动 fsck_exfat

我有几个用 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

免责声明:我没有办法正确地测试它,但以下内容可能会给你带来一些成功。

背景理念:在 XNU 内核代码中搜索有关 Apple 如何实现此功能的有用参考,并分析 hopper 中的 exfat_mount 二进制文件后,我预计替换FSRepairExecutableFSVerificationExecutable简单地始终返回成功可以解决您的挑战。

以下是 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 上不起作用)我想出了一个丑陋的解决方法:

  1. 禁用 SIP(​​参见 Moreaki 的回答)。
  2. 创建原始文件的备份fsck_exfat
    sudo cp /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat_ORIGINAL
  1. 将二进制文件替换fsck_exfat/usr/bin/true
    sudo cp /usr/bin/true /System/Library/Filesystems/exfat.fs/Contents/Resources/fsck_exfat
  1. 启用 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)。

相关内容