更新资料
在弄乱了更多内容并查看了for chattr
和other 的代码之后e2fsprogs
,很明显,by chattr
设置的属性和by 设置的属性libattr
(例如,使用命令setfattr
)非常不同。chattr
设置ext
文件系统标志,这些标志根本不会映射到命名属性或名称空间。没有他们的出现与任何电话libattr
的 listxattr
。它们可能应该映射到命名system
空间中的命名属性,如下所示,但是到目前为止,这完全没有实现。同样,system.posix_acl_access
我误认为要映射到以下这些属性之一的属性与ext
文件系统标志无关,而与访问控制列表有关。相关的strace
消息出现在任何文件中,仅cp --preserve=xattr
使用时消失。
似乎由设置的属性chattr
特定于ext
文件系统,并且影响它们的唯一方法是通过e2fsprogs
工具。实际上,该man
页面实际上并未为它们使用术语“扩展属性”,而是为“文件属性”。“真实”扩展属性是可以由libattr
多个文件系统更改并在多个文件系统上实现的名称/值对。这些是什么cp
以及rsync
对外观,并给出正确的选择,当转移到复制的文件。但是,似乎确实system
存在命名空间,可以将chattr
属性映射到名称,并最终映射到其他文件系统上的等效属性,但是现在这不起作用。
我保留了原始答案,因为那里有一些很好的信息,尽管在某些方面确实有很大的错误。
更新2
我应该在此之前再次回到这个问题chattr
上,但是按照这个答案,它不仅仅适用于ext
文件系统。根据Wikipedia所述,它等效于chflags
基于BSD的系统上的命令。
我编写了一个脚本来测试一些文件系统上这些属性的设置和读取,并得到以下结果:
ext4:
suS-iadAcj-t-e-- mnt/test_file
suSDiadAcj-tTe-- mnt/test_dir
reiserfs:
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_file
lsattr: Inappropriate ioctl for device While reading flags on mnt/test_dir
xfs:
--S-iadA-------- mnt/test_file
--S-iadA-------- mnt/test_dir
btrfs:
--S-iadAc------C mnt/test_file
--SDiadAc------C mnt/test_dir
请注意reiserfs
,尽管它在Wikipedia上被列为具有某些功能,但所有尝试读取/设置文件标志的尝试均会产生上述错误。我没有测试reiser4
。同样,虽然c
可以在ext4
其上设置标志,但不能兑现。可能还有调整/装载选项会影响这些标志,但我找不到任何标志。
但是,似乎确实chattr
是Linux上唯一能够修改这些属性的实用程序,因此没有复制实用程序能够保留它们。
原始答案
原因rsync
似乎是什至没有尝试。从文档-X
部分rsync
:
For systems that support extended-attribute namespaces, a copy being done by a
super-user copies all namespaces except system.*. A normal user only copies
the user.* namespace.
这是很难通过映射使用的属性文字chattr
并lsattr
在文件系统中使用的基本命名属性(一个有在互联网上没有列表)。从我的测试来看,该A
属性映射到该system.posix_acl_access
属性,并且由于这是system
名称空间,rsync
因此甚至都不会尝试复制它。man
片段中未提及的其他两个名称空间是trusted
和security
,需要root特权才能设置这些名称空间(并且rsync
如果没有它们,将无法尝试)。
您尝试设置的属性很可能属于忽略的system
名称空间rsync
(可能是明智的选择)。要么,要么您需要成为root用户才能获得不是的root用户。
至于cp
,似乎有错误在起作用。strace
在上运行cp -a
,我得到以下两条有趣的代码:
fgetxattr(3, "system.posix_acl_access", 0x7fff5181c0e0, 132) = -1 ENODATA (No data available)
和
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0
首先,该fgetxattr
调用不会返回任何数据(可能是因为没有任何数据-属性的存在就足够了),但是以某种方式cp
找到了28个字节的(垃圾内容)数据以设置为目标文件中的属性值。这似乎是中的错误cp
,但是导致问题的原因似乎是错误,libattr
因为fsetattr
调用0
成功返回而没有实际设置属性。
ext4
无论是否安装,我都会得到这种行为user_xattr
。除了说“某些系统”需要此安装选项才能使扩展属性正常工作外,我找不到其他文档。貌似我的(Debian Jessie)没有。甚至我错过了一个日益严重的问题,这都是错误的fsetattr
,因此cp
默默地失败了。
其实user_xattr
有必要对ext2
,ext3
,reiserfs
可能还有一些其他人。不需要ext4
还要注意的是,attr
工具setfattr
,getfattr
和attr
(后者被证明是只为XFS
而已,但似乎只是工作,以及其他的ext4
)有什么,但工作问题user
的命名空间。Operation not supported
如果尝试使用setfattr
将属性放在system
名称空间中(或根据此bug没有名称空间),我会明白。setfattr
似乎在trusted
和security
命名空间中成功,但随后却getfattr
无法读回任何内容,也无法从system
设置的命名空间中读取任何内容chattr
。chattr
成功的原因是它使用了ioctl
call而不是libattr
。
但是,最有效的方法是在user
名称空间中设置扩展属性setfattr
并使用rsync
或cp
原样复制它们(cp
如果在创建属性时未指定值,甚至没有问题)。我认为最重要的是,system
当前使用名称空间值越野车和/或至少在Debian和其他发行版中不受支持。rsync
开发人员很可能知道这一点,这就是为什么他们忽略它们。