EA的详细介绍,参考LinuxQuestion网站的介绍:
http://wiki.linuxquestions.org/wiki/Extended_attributes
大体的意思就是,EA是目前流行的POSIX系统中文件系统具有的一项特殊功能,可以给文件、文件夹添加额外的key/value的键对值,键和值都是字符串并且有一定长度的限制。
常用到的命令如下:setfattr、getfattr、attr。
setfattr可以设置EA,getfattr可以获取EA,attr是一个综合命令,可以设置、获取、删除、列举所有等操作。
注意,这个扩展属性不是我们常说的lsattr、chattr中对文件操作的属性,这里的EA是完全的自定义属性。
在使用EA中,我们自定义的属性名称最好使用上命名空间,如user、root、system等,比如Linux中ACL中使用的键值为:system.posix_acl_access
注意,在大多系统中,使用setfattr设置EA的时候,我们必须使用user作为命名空间前缀,否则会返回如下错误 setfattr xxx Operation not supported 的错误!
举例如下:
设置EA属性
setfattr -n user.foo -v bar test-file
获取EA属性
getfattr -n user.foo test-file
删除EA属性
setfattr -x user.foo test-file
列举所有EA属性
attr -lq test-file
注意,在列举出的属性中,没有显示默认的命名空间,所以你必须知道该属性命名空间,参加下面的方法获取全名属性。
列举所有EA属性
getfattr -d -m ".*" test-file
至此,我们谈一下关于GlusterFS中经常遇到的一个问题,在添加或者替换某个brick的时候,经常会遇到如下错误提示:
a prefix of it is already part of a volume
常常让我们无法使用一个已有的目录作为brick,我们可以新建一个brick,还有一种做法就是删除掉这个目录的Extended Attribute(EA),这些EA是由Gluster添加的,命名空间是trusted。
for i in `attr -lq .`; do setfattr -x trusted.$i .; done
显示所有属性getfattr -m .* -d 1
其他内容: 最近研究文件系统的扩展属性,在特殊情况下可以实现令人想象不到的效果,现在还没有搞太明白,先记录 几条命令,有时间再深入研究。 attr -s status -V "In Progress" test.txt Attribute "status" set to a 11 byte value for test.txt: status getfattr test.txt # file: test.txt user.status getfattr -n user.status test.txt # file: test.txt user.status="In Progress" 如果出现“Operation not supported”错误,要注意两个事情: 1) 文件系统的挂载选项是否包括user_xattr选项,可以用mount命令来查看,比如 /dev/cciss/c0d0p2 on / type ext3 (rw) /dev/cciss/c0d0p1 on /boot type ext3 (rw) /dev/sda3 on /data01 type ext3 (rw) /dev/sdb on /data02 type ext3 (rw,user_xattr) 比较诡异的事情是,/, /data01虽然没有user_xattr选项,但是可以使用setfattr,而/data02去掉 user_xattr选项的话就报“Operation not supported”。因此必须要增加该选项,在/etc/fstab表中格式如下: LABEL=/ / ext3 defaults 1 1 LABEL=/data01 /data01 ext3 defaults 1 2 LABEL=/boot /boot ext3 defaults 1 2 /dev/sdb /data02 ext3 defaults,user_xattr 1 2 这里区别是/, data01,/boot是安装操作系统时自动生成的,/data02是后来格式化挂载的,不知道其中到底是什么区别。 2)即使使用了user_xattr的选项,照样也会出现这个错误,比如 # setfattr -n "test" -v bigfs f1000 setfattr: f1000: Operation not supported 这里的错误原因是,name 一定是要以 user. 开头项目 (为namespace,一般称呼为命名空间),比如: # setfattr -n "user.test" -v bigfs f1000。
ACL Extended Attribute 新增与检视 setfacl 程序使用的方式如下: setfattr -n name [-v value] pathname... (新增标注) setfattr -x name pathname... (取消标注)
其中 -n 表示属性名称,-v 后面接属性的储存内容。 -x 表示删除该属性数据。 假设目前已经建立了 file.txt 档案,操作 setfacl 使用如下: setfattr -n user.author -v "kenduest" file.txt setfattr -n user.desc -v "test only file" file.txt 要注意的是,name 一定是要以 user. 开头项目 (为namespace,一般称呼为命名空间),要不然执行期会出现 operation not supported 错误。 getfacl 程序使用的方式如下: getfattr -n name pathname... 其中 -n 表示属性名称,表示取出该属性的数据内容。若是都没指定参数只有接文件名,会列出所有设定上去的属性名称列表。 执行如下命令可以取出属性的纪录内容: getfattr -n user.author file.txt getfattr -n user.desc file.txt
程序执行结果分别显示输出如下: # file: file.txt user.author="kenduest" # file: file.txt user.desc="test only file" 可以发现到刚刚设定的属性数据已经可以正确检视了。 其中执行如下可以联系查看:
{
#getfattr -d -m "" file0
输出结果如下:
# file: file0 trusted.test-xattr="test"
}
Extended Attribute其他事宜 同 POSIX ACL 权限的一些问题等,并不是所有的程序都支持 Extended Attribute,所以可能程序于存取读写后可能会遗失这类信息纪录,尤其是常使用的 GNU tar 程序就尚未正式纳入该支持,所以在档案目录备份上还需要另外处理细节问题。 若是 Linux Distribution 对于 POSIX ACL与 Extended Attribute已经整合完备的话,常见的档案目录管理工具应该都会正确支持。而至于 GNU tar 程序问题,到是可以另外安装 star 程序来解决。