远程文件“存根”如何在带有 APFS 的 Mac 上工作?
Posted
技术标签:
【中文标题】远程文件“存根”如何在带有 APFS 的 Mac 上工作?【英文标题】:How do remote file "stubs" work on Macs with APFS? 【发布时间】:2020-03-18 07:07:39 【问题描述】:iCloud Drive 和 OneDrive for Mac 都支持远程文件(或“文件按需”as OneDrive calls it)。
这些文件出现在 Finder 中,看起来就像真实文件一样(具有奇怪的快速查看行为)。 Inspector 显示他们的真实大小加上(4 KB on disk)
或类似的。
还有:
终端似乎不理解 iCloud 远程大小:: ~/Library/Mobile Documents/com~apple~Preview/Documents
$ ls -lh
total 24
-rw-r--r--@ 1 REDACTED staff 157B Apr 28 2014 .2AM.png.icloud
-rw-r--r--@ 1 REDACTED staff 6.0K Sep 30 2018 .DS_Store
但它理解 OneDrive 的(文件在 Finder 中显示 0 bytes on disk
):
: ~/OneDrive/Pictures/Drawings
$ ls -lh
total 24
-rwxrwxrwx@ 1 REDACTED staff 11M Apr 5 2019 MMM.kra*
令人失望的是,我在网上找不到有关这些文件的任何信息。官方Apple File System Reference 似乎没有为此显示任何明确的端点。
它们是如何工作的? 这是公共 macOS API 还是 APFS 的功能?这是否依赖于 APFS?【问题讨论】:
【参考方案1】:看起来他们正在使用稀疏文件(APFS 的一项功能)来显示大小而不会占用空间。
为了按需填充文件,他们使用扩展文件属性。
在您的文件上尝试此命令以查看更多信息:ls -l@
我还没有看到任何关于如何在任何地方使用它的文档,但显然有一个属性可以设置为在另一个应用程序打开文件时获取回调。这与 OneDrive 使用的 com.apple.fileutil kext 结合使用。 Microsoft 必须具有特殊访问权限。
【讨论】:
虽然您已经找到了其中的大部分内容,但请参阅 developer.apple.com/forums/thread/… 了解一些其他说明,包括 Dropbox 对vfs.fsplaceholder
的使用。您可以使用xattr -l some_placeholder_file.example.txt
显示ls -l@
属性的内容。【参考方案2】:
文件协调处理所有这些魔法。这些文件被标记为无日期占位符,并且 filecoordinationd 能够通过从 iCloud 检索它们在访问时“实现”它们(以及在它们被保存或“驱逐”时处理相反的方向。
/usr/bin/fileproviderctl 中有一个 Apple 实用程序,可用于进一步探索。 (例如 fileproviderctl materialize..)
稀疏文件完全不同:它们用于填充零的文件,因为它们的零块不占用空间,所以占用的空间要少得多。
参考:NewOSXBook.com,第二卷。
【讨论】:
哇,这太复杂了!如果你是那本书的作者,那太好了!似乎需要调查:D。有人抛弃了manpage for fileproviderctl,但几乎没有其他公开可用的信息。 这是因为它是一个 Apple 内部实用程序,可能不应该被忽略。但是,当您可以在 macOS 上简单地使用“man fileproviderctl”时,“转储手册页”并没有什么特别之处,因为它们也离开了手册页。书中有一个实验演示了如何使用该工具。您可以使用 dtrace 查看内核中发生的 vfs resolve_* 调用 “文件协调处理所有这些魔法。”我不确定这是否正确?参见例如developer.apple.com/forums/thread/… — 在 macOS 11 之前,Dropbox 和 OneDrive 使用了私有的fsplaceholder
和/或 fileutil
内核扩展。
内核扩展确实在内核级别处理 fs 的东西,但 filecoordinationd 是用户模式下的协调器。以上是关于远程文件“存根”如何在带有 APFS 的 Mac 上工作?的主要内容,如果未能解决你的问题,请参考以下文章