OS X中xattr的最大大小

时间:2017-11-17 14:22:11

标签: json macos xattr

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

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

1)我可以在xattr中存储的大小限制是多少? (xattr的人是vauge,指的是_PC_XATTR_SIZE_BITS,我找不到任何地方的东西)

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

2 个答案:

答案 0 :(得分:2)

根据man pathconf,有一个名为_PC_XATTR_SIZE_BITS的“可配置系统限制或选项变量”,

  

用于存储最大扩展属性大小(以字节为单位)的位数。对于   例如,如果文件系统支持的最大属性大小为128K,则该值   返回值为18。但是值18表示最大属性大小可以为   从(256KB-1)到128KB之间的任何值。作为一种特殊情况,资源分支可以有很多   较大的文件,某些文件系统特定的扩展属性可以较小和预设   尺寸;例如,Finder信息始终为32个字节。

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

import Foundation

let args = CommandLine.arguments.dropFirst()

guard let pathArg = args.first else {
  print ("File path argument missing!")
  exit (EXIT_FAILURE)
}

let v = pathconf(pathArg, _PC_XATTR_SIZE_BITS)

print ("_PC_XATTR_SIZE_BITS: \(v)")

exit (EXIT_SUCCESS)

我得到:

  • 在OS X 10.11上HFS +为31位
  • 在macOS 10.13上为APFS提供64位

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

    对于OS X 10.11上的HFS +,
  • 1 GiB≤最大值<2 GiB
  • 对于MacOS 10.13上的APFS,
  • 8 EiB≤最大值<16 EiB

答案 1 :(得分:0)

我似乎能够通过生成260kB的空值并将它们转换为字母a来编写至少260kB,这样我就可以看到它们了:

xattr -w myattr "$(dd if=/dev/zero bs=260000 count=1|tr '\0' a)" fred
1+0 records in
1+0 records out
260000 bytes transferred in 0.010303 secs (25235318 bytes/sec)

然后用以下内容阅读它们:

xattr -l fred 
myattr:  aaaaaaaaaaaaaaaaaa...aaa

检查返回的长度:

xattr -l fred | wc -c
260009

我怀疑这实际上是命令行上ARGMAX的限制:

sysctl kern.argmax
kern.argmax: 262144

另外,仅仅因为你可以在xattr中存储260kB,这并不意味着它是可取的。我不知道HFS +,但是在一些Unixy文件系统上,属性可以直接存储在inode中,但如果超过某个限制,则必须在磁盘上为数据分配额外的空间。

---

随着 High Sierra APFS的出现取代HFS+,请确保在两个文件系统上进行测试 - 同时确保 Time Machine 也可以备份和恢复数据,并且在复制/移动/存档文件时,dittotar和Finder等实用程序会传播它们。

还要考虑通过电子邮件发送标记文件或将其复制到FAT格式的USB记忆棒时会发生什么。

我还尝试在单个文件上设置多个属性,以下脚本成功地将单个文件中的1,000个属性(称为attr-0attr-1 ... attr-999)写入260kB - 意味着文件有效地携带260MB的属性:

#!/bin/bash
for ((a=1;a<=1000;a++)) ; do
   echo Setting attr-$a
   xattr -w attr-$a "$(dd if=/dev/zero bs=260000 count=1 2> /dev/null | tr '\0' a)" fred
   if [ $? -ne 0 ]; then
      echo ERROR: Failed to set attr
      exit
   fi
done

这些都可以看到和回读 - 我检查过。