Linux之configfs简介和编程入门

一、什么是configfs
是一种基于ram的文件系统
二、configfs有什么用处
在用户空间配置内核对象
三、configfs VS ioctl
configfs可直接察看,通过用户态目录文件访问接口,适用于内核对象有众多复杂的配置。
四、configs VS sysfs
configfs可以在用户态创建和删除内核对象。
五、什么时候用configfs
当内核需要很多参数需要配置时;当需要动态创建内核对象并且内核对象需要修改配置时;
不想写用户态程序和ioctl时,写shell脚本就可以直接配置configfs。
六、怎么知道系统上是否已经安装了configfs,安装在哪个目录
执行如下命令,可以看到安装目录为/sys/kernel/config
cat /proc/mounts | grep configfs
configfs /sys/kernel/config configfs rw,relatime 0 0
七、configfs组织结构是怎么样的
顶层结构是struct configfs_subsystem,为configfs子系统结构,接着是struct config_group,是configfs目录和属性的容器,struct config_item是configfs目录,代表可配置的内核对象,struct configfs_attribute是目录下面的属性。
八、代码示例(来自内核目录Documentation\filesystems\configfs)
介绍代码之前,先过一下基本的数据结构:

240struct configfs_subsystem {
241    struct config_group    su_group;
242    struct mutex          su_mutex;
243};

configfs子系统,config_group是抽象容器,之所以叫容器,是因为容器中可以包括config_item,还可以递归包含config_group。struct mutex是用于子系统访问控制的。

89/**
90 *    group - a group of config_items of a specific type, belonging
91 *    to a specific subsystem.
92 */
93struct config_group {
94    struct config_item          cg_item;
95    struct list_head          cg_children;
96    struct configfs_subsystem      *cg_subsys;
97    struct config_group          **default_groups;
98};

config_group作为幕后主使,是不轻易出现在台前的。所以有了94行的struct config_item来表现为一个目录。

56struct config_item {
57    char              *ci_name;
58    char              ci_namebuf[CONFIGFS_ITEM_NAME_LEN];
59    struct kref          ci_kref;
60    struct list_head    ci_entry;
61    struct config_item    *ci_parent;
62    struct config_group    *ci_group;
63    struct config_item_type    *ci_type;
64    struct dentry          *ci_dentry;
65};

58行为目录名称。
63行为目录下属性和属性操作,属性表现为目录下的文本文件。

82struct config_item_type {
83    struct module                    *ct_owner;
84    struct configfs_item_operations          *ct_item_ops;
85    struct configfs_group_operations    *ct_group_ops;
86    struct configfs_attribute          **ct_attrs;
87};

84行为属性操作方法,操作对象是86行属性。
85行为目录操作方法,可以在当前目录下创建item或group。
86行为当前目录属性数组。

124struct configfs_attribute {
125    const char          *ca_name;
126    struct module          *ca_owner;
127    umode_t              ca_mode;
128};

相关推荐