1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        「GoCN酷Go推薦」用戶態(tài)和內(nèi)核態(tài)通信的利器-netlink庫

        共 2610字,需瀏覽 6分鐘

         ·

        2021-10-13 02:52

        一、什么是netlink?

        netlink 是 Linux 系統(tǒng)里用戶態(tài)程序、內(nèi)核模塊之間的一種 IPC 方式,特別是用戶態(tài)程序和內(nèi)核模塊之間的 IPC 通信。比如在 Linux 終端里常用的 ip 命令,就是使用 netlink 去跟內(nèi)核進(jìn)行通信的。例如想在golang代碼中實現(xiàn)ip link add xx的效果,一種辦法是使用exec包執(zhí)行對應(yīng)的ip命令,另一種是采用netlink的方式,但是自己操作netlink還是有點繁瑣。

        、golang netlink庫

        給大家推薦下https://github.com/vishvananda/netlink,使得在golang中使用netlink變的簡單,對程序員小伙伴很友好。

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

        安裝部署

        使用go get命令

        go?get?github.com/vishvananda/netlink

        測試依賴:

        go?get?github.com/vishvananda/netns

        測試(需root權(quán)限)

        sudo?-E?go?test?github.com/vishvananda/netlink

        使用示例

        例1:新建網(wǎng)橋,向其添加eth1

        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 構(gòu)造函數(shù),它設(shè)置的默認(rèn)值。目前它僅將 TxQLen 設(shè)置為 -1,因此內(nèi)核將自行設(shè)置默認(rèn)值。如果你使用簡單的初始化(LinkAttrs{Name: "foo"}) TxQLen 將被設(shè)置為 0,除非你像 LinkAttrs{Name: "foo", TxQLen: 1000} 一樣指定它。

        LinkAdd函數(shù)原型

        func?LinkAdd(link?Link)?error

        LinkAdd 添加一個新的link設(shè)備。設(shè)備的類型和特性取自link對象中的參數(shù)。相當(dāng)于:ip link add $link

        LinkByName函數(shù)原型

        func?LinkByName(name?string)?(Link,?error)

        LinkByName 按名稱查找鏈接并返回指向該對象的指針。

        LinkSetMaster函數(shù)原型

        func?LinkSetMaster(link?Link,?master?Link)?error

        LinkSetMaster 設(shè)置鏈接設(shè)備的master。相當(dāng)于:ip link set $link master $master

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

        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 按名稱查找鏈接并返回指向該對象的指針,然后調(diào)用netlink.AddrAdd向接口添加ip地址。

        AddrAdd函數(shù)原型

        func?AddrAdd(link?Link,?addr?*Addr)?error

        AddrAdd 將向鏈接設(shè)備添加 IP 地址。等價于:ip addr add $addr dev $link

        如果 addr 是一個 IPv4 地址并且沒有給出廣播地址,如果 /30 或更大,它將根據(jù) IP 掩碼自動計算。

        三、總結(jié)

        庫的文檔很齊全,庫的api設(shè)計的也簡潔易用,值得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

        《酷Go推薦》招募:


        各位Gopher同學(xué),最近我們社區(qū)打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個庫或者好的項目,然后寫一點這個庫使用方法或者優(yōu)點之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到

        新的庫,并且知道怎么用。


        大概規(guī)則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!戳「閱讀原文」,即可報名


        掃碼也可以加入 GoCN 的大家族喲~




        瀏覽 60
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            爆操小穴 | 99色视频 | 东北嫖老熟女一区二区视频网站 | av国产av一区二区三区 | 午夜少妇久久 | 999在线视频 | 悠悠资源音影先锋在线观看 | 激情无码一区二区三区 | 国产三级网站 | 99久久婷婷国产综合精品电影 |