1. Netlink基础概念与核心价值
Netlink是Linux内核提供的一种特殊进程间通信机制,它允许用户空间程序与内核模块进行双向数据交换。与传统的ioctl或procfs相比,Netlink具有明显的架构优势:
- 全双工通信:支持内核主动向用户态推送消息(如事件通知)
- 结构化协议:基于消息的通信模型,自带类型检查和版本控制
- 多播支持:单个消息可同时发送给多个接收者
- 权限控制:基于Linux标准capability机制的安全管控
在实际工程中,Netlink常用于这些场景:
- 网络子系统配置(如iproute2工具集)
- 设备热插拔事件通知(udev实现基础)
- 安全策略下发(SELinux/AppArmor)
- 自定义内核模块的状态监控
重要提示:Linux内核主线目前已经包含了30多种标准Netlink协议族(如NETLINK_ROUTE、NETLINK_SOCK_DIAG等),新增协议前应先确认是否已有现成方案。
2. Netlink协议开发全流程
2.1 内核模块开发要点
首先在内核头文件中定义协议号(需向官方申请或使用动态分配范围):
c复制// 动态分配范围:0x10-0xffffff
#define MY_NETLINK_PROTOCOL 31
接着实现核心的消息处理结构体:
c复制static struct netlink_kernel_cfg cfg = {
.input = my_nl_recv_msg, // 消息接收回调
.groups = 0x1, // 多播组掩码
};
struct sock *nl_sk = netlink_kernel_create(&init_net,
MY_NETLINK_PROTOCOL, &cfg);
消息处理函数的典型实现模式:
c复制static void my_nl_recv_msg(struct sk_buff *skb) {
struct nlmsghdr *nlh = nlmsg_hdr(skb);
if(!netlink_capable(skb, CAP_NE
