首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OS中xattr的最大大小

OS中xattr的最大大小
EN

Stack Overflow用户
提问于 2017-11-17 14:22:10
回答 2查看 1.4K关注 0票数 3

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

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

( 1)我在xattr中能储存的大小有什么限制?( xattr的人是vauge,指的是_PC_XATTR_SIZE_BITS,我在任何地方都找不到)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-17 16:06:25

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

代码语言:javascript
复制
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)

然后把它们读回来:

代码语言:javascript
复制
xattr -l fred 
myattr:  aaaaaaaaaaaaaaaaaa...aaa

并检查返回的长度:

代码语言:javascript
复制
xattr -l fred | wc -c
260009

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

代码语言:javascript
复制
sysctl kern.argmax
kern.argmax: 262144

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

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

此外,考虑一下当电子邮件标记的文件,或复制到一个脂肪格式的USB记忆棒发生什么情况。

我还尝试在单个文件上设置多个属性,下面的脚本成功地将260 to中的每个属性(称为attr-0attr-1 . attr-999)编写成一个文件--这意味着该文件有效地承载了260 to的属性:

代码语言:javascript
复制
#!/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

这些都可以看到,也可以读回来-我查过了。

票数 3
EN

Stack Overflow用户

发布于 2018-07-25 12:25:27

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

用于存储最大扩展属性大小(以字节为单位)的位数。例如,如果文件系统支持的最大属性大小为128 K,则返回的值将为18。但是,值18可能意味着最大属性大小可以介于(256 to 1)到128 to之间。作为特例,资源叉可以有更大的大小,而某些文件系统特定的扩展属性可以有更小的和预置的大小;例如,Finder Info总是32字节。

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

代码语言:javascript
复制
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)

我得到:

  • 操作系统X10.11上HFS+的31位
  • macOS 10.13上的64位APFS

存储最大扩展属性大小的位数。这意味着实际的最大xattr大小在范围内的某个地方。

  • 1 GiB≤最大值<2 HFS+在OS 10.11上
  • 8 EiB≤最大值< 16 EiB在macOS 10.13上
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47352805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档