在Linux内核模块中获取全局网络名称空间的实例

时间:2019-06-23 20:34:11

标签: linux namespaces kernel-module

我正在编写Linux内核模块,并希望获得指向设备上全局网络名称空间的struct net*指针。我在模块初始化函数中尝试了以下代码:

// test-module.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <net/net_namespace.h>

int init_dev (void)
{
    struct net *net1;

    printk ("Init Module\n");

    net1 = get_net_ns_by_pid(1); // getting NS for PID 1 (init process)
    if(net1 != NULL){
        printk ("Init Module --- Got net ns pointer \n");
    }
    else {
        printk ("Init Module --- Blank net ns pointer \n");
    }

    return 0;
}

void cleanup (void)
{
    printk ("Cleaning Up the Module\n");
    return;
}

module_init (init_dev);
module_exit (cleanup);

Makefile:

obj-m += test-module.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

我可以编译模块,但是当我尝试使用sudo insmod test-module.ko插入模块时,在dmesg中得到了错误:

test-module: Unknown symbol get_net_ns_by_pid (err 0)

我想问问是否有人知道如何获取struct net*指针。

1 个答案:

答案 0 :(得分:0)

如@Tsyvarev所述,我在文件末尾添加了以下行,并且运行良好:

MODULE_LICENSE("GPL");