OS X 中 xattr 的最大大小

Rho*_*Phi 3 macos json xattr

我想使用 xattr 将文件上的一些元数据直接存储在文件上。这些本质上是我在搜索文件时用于对文件进行分类的标签。我的目标是通过将更多信息与每个标签关联来扩展通常的 Mac OS X 标签,例如添加该标签的日期以及其他内容。

我正在考虑使用xattr -w. 我的第一个猜测是在这个 xattr 值中存储类似 JSON 的东西,但我想知道

1)我可以在 xattr 中存储的大小有哪些限制?(xattr 的 man 是 vauge,指的_PC_XATTR_SIZE_BITS是我在任何地方都找不到的东西)

2)将 JSON 格式的字符串存储为 xattr 有什么问题吗?

Dr.*_* F. 5

根据man pathconf,有一个 \xe2\x80\x9c 可配置的系统限制或选项变量\xe2\x80\x9d_PC_XATTR_SIZE_BITS称为

\n\n
\n

用于存储最大扩展属性大小(以字节为单位)的位数。例如,如果文件系统支持的最大属性大小为 128K,则返回的值将为 18。但是,值 18 可能意味着最大属性大小可以为 (256KB - 1) 到128KB。作为一种特殊情况,资源分叉可以具有更大的大小,并且某些文件系统特定的扩展属性可以具有更小的预设大小;例如,Finder Info 始终为 32 字节。

\n
\n\n

您可以使用这个用 Swift 4 编写的小型命令行工具来确定此参数的值:

\n\n
import Foundation\n\nlet args = CommandLine.arguments.dropFirst()\n\nguard let pathArg = args.first else {\n  print ("File path argument missing!")\n  exit (EXIT_FAILURE)\n}\n\nlet v = pathconf(pathArg, _PC_XATTR_SIZE_BITS)\n\nprint ("_PC_XATTR_SIZE_BITS: \\(v)")\n\nexit (EXIT_SUCCESS)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到:

\n\n
    \n
  • OS X 10.11 上的 HFS+ 为 31 位
  • \n
  • macOS 10.13 上的 APFS 为 64 位
  • \n
\n\n

作为用于存储最大扩展属性大小的位数。这意味着实际最大 xattr 大小在范围内

\n\n
    \n
  • OS X 10.11 上的 HFS+ 最大 1 GiB \xe2\x89\xa4 < 2 GiB
  • \n
  • 8 EiB \xe2\x89\xa4 最大值 < 16 EiB(适用于 macOS 10.13 上的 APFS)
  • \n
\n