如何阻止 iCloud 和 Dropbox 妨碍驱动器推出
云同步服务以妨碍 Mac 上外置驱动器的推出而臭名昭著。这里说明它们为何会占用你的驱动器,以及如何绕过这个问题。
你关闭了每一个 App。你保存了一切。你点按推出,macOS 却说驱动器仍在使用。你运行 lsof,在输出中看到了 bird、cloudd 或 Dropbox。一个云同步服务正在扣押你的驱动器。
这是 Mac 上推出失败最常见、也最不为人理解的原因之一。云同步服务会一直在后台运行,专门用来监测文件的变化。这种监测意味着会有打开的文件句柄,而打开的文件句柄就意味着你的驱动器无法推出。
为什么同步服务会阻止推出
云同步服务的工作方式是监视文件夹的变化。当一个文件被创建、修改或删除时,服务会检测到它并把更改同步到云端。为了检测这些变化,服务会保持打开的文件句柄,或在它所监视的目录上使用文件系统事件监视器。
当任何被监视的路径位于你的外置驱动器上时,问题就出现了。这可能以几种方式发生:
你自己把同步文件夹放在了驱动器上。也许你为了腾出空间把 Dropbox 文件夹移到了外置驱动器,或者你在那里存放着一个通过 iCloud 云盘共享的项目文件夹。
某个应用程序在驱动器上创建了一个被同步服务认领的文件。一些 App 会把临时文件、缓存或项目元数据保存在它们正使用的任何宗卷上。
聚焦为你的驱动器编制了索引,而某个同步服务捕捉到了那份索引数据。这是间接的,但它确实会发生。
具体说说 iCloud
macOS 上 iCloud 的同步守护进程叫做 bird(没错,真的)。你还会看到 cloudd 处理某些同步操作。这些进程作为系统服务运行,如果你退出它们,它们会自动重启。
如果 bird 在阻止你的驱动器,那它正在监视该宗卷上的某个文件或文件夹。常见的触发因素包括:
- iCloud 桌面与文稿:如果你启用了这项功能,而你的外置驱动器作为一个位置出现在访达中,iCloud 可能会为与之相关的路径编制索引。
- 预览与快速查看:在“预览”中打开你外置驱动器上的某个文件,可能会创建 iCloud 同步的最近文件引用。
- Pages、Numbers 或 Keynote:这些 App 默认会自动存储到 iCloud。如果你从外置驱动器打开了一个文稿,App 可能会在本地文件和一个 iCloud 引用之间维持一条连接。
要检查 iCloud 是否是你的阻止者:
lsof /Volumes/YourDriveName | grep -i bird
lsof /Volumes/YourDriveName | grep -i cloudd
具体说说 Dropbox
Dropbox 在文件监测方面甚至更为积极。在现代 macOS 版本上,Dropbox 客户端使用 Apple 的 File Provider 框架(较旧的内核扩展方式已在 macOS 12.3 中弃用)来实时监测文件系统操作。
如果你的 Dropbox 文件夹或任何 Dropbox 同步的文件夹位于你的外置驱动器上,Dropbox 就会与那个宗卷维持持久的连接。即便是很久以前就完成同步的文件,也可能为了监测目的而被 Dropbox 的文件句柄占用着。
你可能还会看到 Apple 的 fileproviderd 进程代表 Dropbox 占用着文件。这是管理所有 File Provider 扩展(包括 Dropbox、OneDrive 和 Google Drive)的系统守护进程。它可能会在那些服务所监视的宗卷上创建额外的文件句柄。
对付 Dropbox 最可靠的做法:在推出之前彻底退出 Dropbox 应用程序。点按菜单栏中的 Dropbox 图标,点按你的头像,然后选择“退出”。推出你的驱动器后,再重新打开 Dropbox。
Google Drive 和 OneDrive
Google Drive 的桌面 App(Drive for Desktop)会创建一个虚拟驱动器,它可以通过文件操作与你的外置驱动器交互。如果你在 Google Drive 和外置驱动器之间拷贝过文件,Drive 客户端可能会维持一些引用。
OneDrive 的行为与 Dropbox 类似,也有后台文件监测。它在占用文件句柄方面通常没那么积极,但仍可能阻止推出。
这两种服务都可以在推出前从它们的菜单栏图标暂停或退出。
实用的工作流程
如果你经常在外置驱动器上处理文件,又使用云同步服务,那就养成在推出前暂停同步的习惯。
对于 iCloud,没有简便的暂停按钮,但你可以在“系统设置 > Apple ID > iCloud > iCloud 云盘”中临时停用 iCloud 云盘。不过这相当折腾。
对于 Dropbox,从菜单栏图标暂停同步。点按 Dropbox 图标,点按你的头像,然后选择“暂停同步”。
对于 Google Drive,点按菜单栏中的 Drive 图标,然后选择“暂停同步”。
暂停后,等几秒钟让打开的文件句柄关闭,然后推出你的驱动器。
预防这个问题
最干净的做法是:永远不要在外置驱动器上存放云同步的文件夹。把同步文件夹放在你 Mac 的内置存储上,把外置驱动器用于不需要同步的数据。
如果你必须在外置驱动器上保留同步内容,就做一个清晰的区隔。把同步文件放在一个文件夹里,把非同步文件放在另一个文件夹里。当你需要推出时,你就知道该暂停哪个同步服务。
避免用那些会自动存储到 iCloud 的 App(Pages、Numbers、Keynote、预览)打开你外置驱动器上的文件。或者至少在推出前关闭那些 App,并给它们一点时间去释放文件句柄。
当暂停还不够时
有时你暂停了同步、退出了 App,驱动器却仍然无法推出。同步服务留下了一个陈旧的文件句柄,即便在暂停后它依然存在。
你可以通过终止那个特定进程来强制释放这些句柄:
kill $(lsof -t /Volumes/YourDriveName)
这会终止每一个使用该驱动器的进程。它很激进,但有效。
Ejecta 处理起来更精准。它明确辨认出究竟是哪些进程在占用你的驱动器,包括云同步守护进程,并让你逐个退出它们。你无需终止所有连接到驱动器的进程,而是可以只针对那个 bird 进程,或只针对那个引发问题的 Dropbox 辅助进程。当你不确定几个同步服务中哪一个才是罪魁祸首时,它尤其有用。
云同步和外置驱动器不必互相冲突。你只是需要看清幕后到底发生了什么。
如果你不想每次都动用终端,Ejecta 会准确告诉你是哪个进程在占用硬盘——只需在菜单栏中点击一下即可退出它。
立即购买 — $9.99