linux文件的属性
说起文件,首先想到文件的内容,通常可以用 md5sum
计算签名。其次想到文件的状态,包括owner,mode,time等,通常用stat
或ls -l
查看。那么两个文件的内容和状态完全一样,两个文件就完全一样了吗?
linux文件还有属性、扩展属性、acl,如果碰到文件内容和状态都一样,但文件行为不一样,不妨检查下这些属性。
1 文件属性
文件属性是文件系统内置的属性,操作文件时会检查这些属性。它们以状态位的形式存在,几乎不占用额外的磁盘空间。 文件属性用 lsattr 查看,用 chattr +-=[aAcCdDeijsStTu] 操作 + 表示开启, - 表示关闭,= 表示设置。 常用的文件属性包括:
i
只读属性,开启后文件不能被修改,移动,改名等。只有root和配置了CAP_LINUX_IMMUTABLE
的进程才能操作该属性。a
append属性,类似i
,但文件可以追加
2 文件扩展属性
文件扩展属性是应用定义的属性,以 namespace.field=value
的形式存在,属性的含义由应用解释(rsync 通过 user.rsync.%stat 实现 fake-super功能)。namespace目前支持 user,system等,不能任意指定,key可以任意指定,但最好加上应用自己的标记,以免不同应用冲突。
- 设定属性
setfattr -n user.foo.favor -v apple test-xattr
- 获取属性
getfattr -d test-xattr
3 文件acl
除了chmod设定文件的读写权限,还可以通过acl控制,acl可以细粒度划分权限。 例如 root-test 文件仅让root和指定其它用户可读
chmod 0600 root-file
此时只有root可读,zzyong没权限。setfacl -m u:zzyong:r root-file
给zzyong添加读权限getfacl root-file
查看,现在zzyong已经可读
4 如何备份文件
cp
能备份文件吗?是的,但必须是 cp -a --preserve=all
,其中 --preserve=all
用来复制acl。
此外可以用 rsync -a -A
,其中 -A
用来复制acl。