前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go每日一库之118:netlink(内核通信)

Go每日一库之118:netlink(内核通信)

作者头像
luckzack
发布2023-09-30 08:37:18
1.4K0
发布2023-09-30 08:37:18
举报
文章被收录于专栏:人人都是架构师

什么是netlink?

netlink 是 Linux 系统里用户态程序、内核模块之间的一种 IPC 方式,特别是用户态程序和内核模块之间的 IPC 通信。比如在 Linux 终端里常用的 ip 命令,就是使用 netlink 去跟内核进行通信的。例如想在golang代码中实现ip link add xx的效果,一种办法是使用exec包执行对应的ip命令,另一种是采用netlink的方式,但是自己操作netlink还是有点繁琐。

golang netlink库

给大家推荐下https://github.com/vishvananda/netlink,使得在golang中使用netlink变的简单,对程序员小伙伴很友好。

netlink 包为 go 提供了一个简单的 netlink 库。Netlink 是 linux用户态程序用来与内核通信的接口。它可用于添加和删除接口、设置 ip 地址和路由以及配置 ipsec。Netlink 通信需要提升权限,因此在大多数情况下,此代码需要以 root 身份运行。由于底层 netlink 消息晦涩不好理解和使用,因此该库尝试提供一个简易api,该 API 模仿了 iproute2 提供的 CLI。诸如 ip link add 之类的操作将通过类似命名的函数(如 AddLink())来完成。这个库最初是 docker/libcontainer 中 netlink 功能的一个分支。

安装

使用go get命令

代码语言:javascript
复制
go get github.com/vishvananda/netlink

测试依赖:

代码语言:javascript
复制
go get github.com/vishvananda/netns

测试(需root权限)

代码语言:javascript
复制
sudo -E go test github.com/vishvananda/netlink

使用示例

例1:新建网桥,向其添加eth1

代码语言:javascript
复制
package main
 
import (
    "fmt"
    "github.com/vishvananda/netlink"
)
 
func main() {
    la := netlink.NewLinkAttrs()
    la.Name = "foo"
    mybridge := &netlink.Bridge{LinkAttrs: la}
    err := netlink.LinkAdd(mybridge)
    if err != nil  {
        fmt.Printf("could not add %s: %v\n", la.Name, err)
    }
    eth1, _ := netlink.LinkByName("eth1")
    netlink.LinkSetMaster(eth1, mybridge)
}

对例子做必要的解释:

注意 NewLinkAttrs 构造函数,它设置的默认值。目前它仅将 TxQLen 设置为 -1,因此内核将自行设置默认值。如果你使用简单的初始化(LinkAttrs{Name: "foo"}) TxQLen 将被设置为 0,除非你像 LinkAttrs{Name: "foo", TxQLen: 1000} 一样指定它。 [

](https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/120714569) LinkAdd函数原型

func LinkAdd(link Link) error LinkAdd 添加一个新的link设备。设备的类型和特性取自link对象中的参数。相当于:ip link add $link

LinkByName函数原型

func LinkByName(name string) (Link, error) LinkByName 按名称查找链接并返回指向该对象的指针。

LinkSetMaster函数原型

func LinkSetMaster(link Link, master Link) error LinkSetMaster 设置链接设备的master。相当于:ip link set link master master

例2:向loopback接口添加新ip地址

代码语言:javascript
复制
package main
 
import (
    "github.com/vishvananda/netlink"
)
 
func main() {
    lo, _ := netlink.LinkByName("lo")
    addr, _ := netlink.ParseAddr("169.254.169.254/32")
    netlink.AddrAdd(lo, addr)
}

先通过LinkByName 按名称查找链接并返回指向该对象的指针,然后调用netlink.AddrAdd向接口添加ip地址。 AddrAdd函数原型 func AddrAdd(link Link, addr *Addr) error AddrAdd 将向链接设备添加 IP 地址。等价于:ip addr add addr dev link 如果 addr 是一个 IPv4 地址并且没有给出广播地址,如果 /30 或更大,它将根据 IP 掩码自动计算。

总结

库的文档很齐全,库的api设计的也简洁易用,值得golang的小伙伴们尝试下。

参考链接 https://pkg.go.dev/github.com/vishvananda/netlink http://blog.studygolang.com/2017/07/linux-netlink-and-go-part-1-netlink/ https://hub.fastgit.org/vishvananda/netlink [

](https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/120714569)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是netlink?
  • golang netlink库
  • 安装
  • 使用示例
    • 例1:新建网桥,向其添加eth1
      • 例2:向loopback接口添加新ip地址
      • 总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档