文件属性
Linux文件属性分为常规属性与扩展属性,其中扩展属性有两种:attr与xattr.
一般常规的文件属性由stat API 读取,一般是三种权限,ower, group,时间等。
扩展属性attr
用户态API
ioctl(fd, FS_IOC32_SETFLAGS or FS_IOC_SETFLAGS,...)
使用ioctl中扩展的命令字
内核中的处理
ext2对应的FS_IOC32_SETFLAGS的函数
long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
*/
struct ext2_inode_info {
__le32 i_data[15];
__u32 i_flags; //保存配置的位置在ext2自已的inode接口里的i_flags里。这些数据最后同步到文件系统的磁盘中。
__u32 i_faddr;
__u8 i_frag_no;
__u8 i_frag_size;
__u16 i_state;
__u32 i_file_acl;
__u32 i_dir_acl;
__u32 i_dtime;
......
命令
lsattr 与chattr
这两个命令的关键字是attr,不是xattr,但他们是文件的扩展属性的另一个基础版本
lsattr file.txt
-----a---------- file.txt
[root@localhost ~]# chattr +i file.txt //为file.txt 增加i属性。不得任意更动文件或目录。
[root@localhost ~]# lsattr file.txt
----ia---------- file.txt
[root@localhost ~]#
扩展属性xattr
扩展属性是由Linux文件系统ext2(ext3)等为文件提供可配置扩展属性的空间。目前主要使用的是security.capability与security.selinux,用于可执行文件的能力控制和强制访问控制。
API
扩展属性有一组API,以xattr为关键字。
用户态API:
#include <sys/xattr.h>
ssize_t getxattr(const char *path, const char *name, void *value, size_t size);
ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size);
ssize_t fgetxattr(int fd, const char *name,void *value, size_t size);
内核对应的API入口:
见fs/xattr.c
sys_fsetxattr(int fd, char __user *name, void __user *value,size