golang 源碼分析 netlink

        https://github.com/vishvananda/netlink,netlink 是 Linux 系統裏用戶態程序、內核模塊之間的一種 IPC 方式,特別是用戶態程序和內核模塊之間的 IPC 通信。比如在 Linux 終端裏常用的 ip 命令,就是使用 netlink 去跟內核進行通信的。例如想在 golang 代碼中實現 ip link add xx 的效果,一種辦法是使用 exec 包執行對應的 ip 命令,另一種是採用 netlink 的方式,但是自己操作 netlink 還是有點繁瑣。

          netlink 包爲 go 提供了一個簡單的 netlink 庫。Netlink 是 linux 用戶態程序用來與內核通信的接口。它可用於添加和刪除接口、設置 ip 地址和路由以及配置 ipsec。Netlink 通信需要提升權限,因此在大多數情況下,此代碼需要以 root 身份運行。由於底層 netlink 消息晦澀不好理解和使用,因此該庫嘗試提供一個簡易 api,該 API 模仿了 iproute2 提供的 CLI。諸如 ip link add 之類的操作將通過類似命名的函數(如 AddLink())來完成。這個庫最初是 docker/libcontainer 中 netlink 功能的一個分支。

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)
}
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)
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/6ySlzmbeM6xStguze4RaIA