我正在尝试弄清楚 FreeBSD 中使用 ZFS 是否支持 xattrs,或者更确切地说,在何种程度上支持 xattrs。我读过一些相互矛盾的信息。
zfs get xattr
将其列为on (default)
、/
和/usr
,/var
但对于off (temporary)
所有其他数据集,包括上述数据集的子数据集。- 运行
zfs set xattr=on zroot/usr/home
我收到消息property 'xattr' not supported on FreeBSD: permission denied
。 - 这符合手册
zfs
页:xattr
FreeBSD 目前不支持该属性。 setextattr
,getextattr
并且lsextattr
似乎工作得足够好。- 我还设法使用 保存和恢复设备文件节点,并且可以使用和
rsync --fake-super
查看其数据。lsextattr
getextattr
- 维基百科有一些讨论xattr 讨论页面。显然,曾经有人声称 ZFS 从 FreeBSD 8 开始就支持 xattr,但后来参考手册页将其删除(参见 3.)。
目前,我的印象是 zfs 上的扩展属性在实践中有效,但xattr
控制其使用的属性并不像在其他 zfs 发行版中那样有效。但在我信任大量备份数据rsync --fake-super
在这样的机器上运行之前,我希望听到这一点得到确认(或纠正)。我不想因为已知的 xattr 问题而丢失所有元数据。
如果重要的话,这是一个非常我刚刚安装了新的 FreeBSD 10.2,安装程序设置了 ZFS。
答案1
正如您所发现的,xattrs 可以工作,但也有一些粗糙的地方。
有时您必须像人类学家一样接触开源代码。如果这本身没有帮助,也许这会引发一些更好的贡献(或最终代码修复!)
我在源代码中发现了这个:
/*
* Register property callbacks.
*
* It would probably be fine to just check for i/o error from
* the first prop_register(), but I guess I like to go
* overboard...
*/
error = dsl_prop_register(ds,
zfs_prop_to_name(ZFS_PROP_ATIME), atime_changed_cb, zfsvfs);
error = error ? error : dsl_prop_register(ds,
zfs_prop_to_name(ZFS_PROP_XATTR), xattr_changed_cb, zfsvfs);
error = error ? error : dsl_prop_register(ds,
zfs_prop_to_name(ZFS_PROP_RECORDSIZE), blksz_changed_cb, zfsvfs);
所以我认为实际发生的是 xattrs工作但通过 ZFS 数据集属性关闭(或打开)它们的功能已损坏,因此“不支持”消息意味着“您只能靠自己了”。
那里有一些设置 MNTOPT_XATTR 的代码,但我还没有找到它。尝试使用 zfs set 更改它会收到不支持的消息。我的猜测是,这解释了 /、/usr、/var 的 zfs xattr 属性怪异以及 /home 的冲突设置/行为。
这让事情有了一些线索。 https://www.lesbonscomptes.com/pages/extattrs.html
答案2
它与 FreeBSD-13.2 附带的 ZFS 配合使用。
例如
% zfs get xattr rpool/usr/home
NAME PROPERTY VALUE SOURCE
rpool/usr/home xattr on default
%
% ls -tal test
-rw-r--r-- 1 sabadi sabadi 31 May 31 2016 test
%
% setextattr user md5 `md5 -q test` test
% getextattr user md5 test
test 93d1d06c3b60c965fc696609b8c57a3f