栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

sysctl与devlink总结

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sysctl与devlink总结

整体概述

由于自己水平和精力有限,本篇博文只涉及如何使用的问题,不涉及讲解原理,如果有朋友对如何创建命令的原理感兴趣,可以自己进行探讨。

sysctl概述

在FreeBSD系统上,设备通信和控制主要通过sysctl和ioctl接口,也就是在用户层(shell)配置的方式,进行对底层驱动参数的一个设置。
具体使用方式例如:
sysctl -A : 通过此命令查看系统当中都有那些可以配置的参数。
比如输入sysctl -A命令后有以下输出,
a.b.c : 1
a.b.c是一种二进制的表示方式,1代表某个参数的值,当然也可以是字符类型或者结构体等。具体的后面遇到代码再讲解。
随后,如果我们输入sysctl a.b.c命令是查看该参数的值,
而sysctl a.b.c=2是将此参数的值进行修改,如果你看到有
0 -> 2的输出就代表值从0修改为了2,已经成功修改了。

sysctl例程感性认识

我们通过一个例程对怎么创建sysctl配置命令的有一个感官上的认识。如下

#include
#include
#include
#include
#include

static struct sysctl_ctx_list clist;
static struct sysctl_oid *poid;

static int i = 10;
static long j = 20;
static const char *c = "hello init";

static int
sysctl_procedure(SYSCTL_HANDLER_ARGS)
{
    const char *buf = "sysctl_procedure call";
    return sysctl_handle_string(oidp, buf, strlen(buf), req);
}


static int
sysctl_modevent(module_t mod_unused, int event, void *arg __unused)
{
    int error = 0;
    switch (event) {
    case MOD_LOAD:
        sysctl_ctx_init(&clist);

        
        poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(), OID_AUTO,
        "top", CTLFLAG_RW, 0, "tree top");
        if (poid == NULL) {
            printf("SYSCTL_ADD_NODE failedn");
            return EINVAL;
        }

        
        SYSCTL_ADD_LONG(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
        "long", CTLFLAG_RW, &j, 0, "creat long leaf");

        
        SYSCTL_ADD_INT(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
        "int", CTLFLAG_RW, &i, 0, "creat int leaf");

        
        poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(poid), OID_AUTO,
        "node", CTLFLAG_RW, 0, "tree node");
        if (poid == NULL) {
            printf("SYSCTL_ADD_NODE failedn");
            return EINVAL;
        }

        
        SYSCTL_ADD_PROC(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
        "proc", CTLFLAG_RD, 0, 0, sysctl_procedure, "A", "creat proc leaf");

       
        poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(_debug), OID_AUTO,
        "top", CTLFLAG_RW, 0, "tree node");
        if(poid == NULL) {
            printf("SYSCTL_ADD_NODE failedn");
            return EINVAL;
        }

        
        SYSCTL_ADD_STRING(&clist, SYSCTL_CHILDREN(poid), OID_AUTO,
        "string", CTLFLAG_RD, c, 0, "new string leaf");

        printf("module loadedn");
        break;
    case MOD_UNLOAD:
        if (sysctl_ctx_free(&clist)) {
            printf("sysctl_ctx_free failed.n");
            return -1;
        }
        printf("module unloadedn");
        break;
    default:
        error = -1;
        break;
     }
    return error;
}

static moduledata_t sysctl_mod = {
    "sysctl_modevent",
    sysctl_modevent,
    NULL
};
DECLARE_MODULE(sysctl_modevent, sysctl_mod, SI_SUB_EXEC, SI_ORDER_ANY);

makefile:

 
动态创建sysctl宏总结 
SYSCTL_STATIC_CHILDREN 宏 
 
SYSCTL_CHILDREN宏 
 
sysctl接口的简单使用 
 
devlink概述 

后面在补齐。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/871442.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号