RHEL/CentOS系列發行版nmcli命令概述

RHEL7 與 CentOS 7 以上的版本中默認的網絡服務由 NetworkManager 提供(簡稱NM),這是動態控制及配置網絡的守護進程,它用於保持當前網絡設備及連接處於工作狀態,同時也支持傳統的 ifcfg 類型的配置文件。NetworkManager 可以用於以下類型的連接:Ethernet,VLANS,Bridges,Bonds,Teams,Wi-Fi,mobile boradband(如移動3G)以及 IP-over-InfiniBand。 針對與這些網絡類型,NetworkManager 可以配置他們的網絡別名,IP 地址,靜態路由,DNS,VPN連接以及很多其它的特殊參數。可以用命令行工具 nmcli 來控制 NetworkManager。nmcli的功能要比 ifconfig 強大、複雜的多。
nmcli是命令行的NetworkManager工具,自動把配置寫到/etc/sysconfig/network-scripts/目錄下面。RHEL7 與 CentOS 7之前的網絡管理是通過 ifcfg 文件配置管理接口(device),而現在是通過NetworkManager服務管理連接(connection)。一個接口(device)可以有多個連接(connection),但是同時只允許一個連接(connection)處於激活(active)狀態。但有一個問題,重啓服務器後默認激活那個連接,我沒查到相關的資料,如果是服務器建議一個網口對於一個連接。
簡單理解就是,一個連接就是(connection)就是/etc/sysconfig/network-scripts/目錄下的一個配置文件,接口(device)是物理設備,一個物理設置可以擁有多個配置文件,但只能有一個配置文件屬於使用(active)狀態;配置文件的生成與使用狀態均由NetworkManager控制。當然,依舊支持ifcfg文件配置管理網絡,但不推薦。
-------------------------------------------------------------------------------------------------------

一、nmcli使用方法

nmcli使用方法非常類似linux ip命令、cisco交換機命令,並且支持tab補全,也可在命令最後通過-h、--help、help查看幫助。在nmcli中有2個命令最爲常用:

nmcli語法:
nmcli [ OPTIONS ] OBJECT { COMMAND | help }
   OBJECT和COMMAND可以用全稱也可以用簡稱,最少可以只用一個字母,建議用頭三個字母。OBJECT裏面我們平時用的最多的就是connection和device,還有其他的選項在裏暫時不介紹,這裏需要簡單區分一下connection和device。

1、nmcli connection

連接,偏重於邏輯設置,可理解爲配置文件,相當於ifcfg-ethX。可以簡寫爲nmcli c
多個connection可以應用到同一個device,但同一時間只能啓用其中一個connection。這樣的好處是針對一個網絡接口,我們可以設置多個網絡連接,比如靜態IP和動態IP,再根據需要up相應connection,這樣可以方便的切換網絡配置,比如筆記本電腦移動辦公,到不同的環境同一個網卡可以切換到不同的網絡配置,配置好以後不需要每次都從新配置。

2、nmcli device

設備,是網絡設備的接口,可理解爲實際存在的網卡(包括物理網卡和虛擬網卡)。可以簡寫爲nmcli d

在NM裏,有2個維度:連接(connection)和設備(device),這是多對一的關係。想給某個網卡配ip,首先NM要能納管這個網卡。設備裏存在的網卡(即 nmcli d可以看到的),就是NM納管的。接着,可以爲一個設備配置多個連接(即 nmcli c可以看到的),每個連接可以理解爲一個ifcfg配置文件。同一時刻,一個設備只能有一個連接活躍。可以通過 nmcli c up切換連接。

3、connection有2種狀態:

▷ 活躍(帶顏色字體):表示當前該connection生效
▷ 非活躍(正常字體):表示當前該connection不生效

4、device有4種常見狀態:

▷ connected:已被NM納管,並且當前有活躍的connection
▷ disconnected:已被NM納管,但是當前沒有活躍的connection
▷ unmanaged:未被NM納管
▷ unavailable:不可用,NM無法納管,通常出現於網卡link爲down的時候(比如ip link set ethX down)


二、nmcli connection說明
------------------------------------------------------------------------
pipci@HP:~$ nmcli c show         #顯示所有連接
NAME       UUID                    TYPE        DEVICE
CMCC-Debian       80171577-f5fb-45f2-aa9b-512251c2e000         wifi           wlp2s0   ##這是當前激活的連接帶顏色字體,只是文章裏體現不出來
10.97.17.90      93e8cf06-bd0b-4b69-b802-f3c8c602e000    ethernet          --              ##“--”表示當前沒有激活的連接
DHCP          3efe4ab9-4a5f-4da1-8a0f-88ff7a1f0000       ethernet          --
laopi            67a1ca1d-222d-4b81-b7f7-abda9a474000   wifi             --
virbr0        d7188d09-6030-435b-abdf-34032aa1e7d7      bridge          virbr0
pipci@HP:~$
------------------------------------------------------------------------      
每一行是一個連接,只是只有一個是激活狀態
第一列是connection名字(連接名稱)簡稱con-name,簡稱con-name(注意con-name不是網卡名)
第二列是connection的UUID
第三列是connection的網絡類型
最後一列纔是網卡名(標準說法叫device名),可通過nmcil d查看device

對connection做操作時需要指定標識,標識可以是con-name、UUID、如果存在ifcfg文件則也可以用ifcfg的完整路徑,即/etc/sysconfig/network-scripts/ifcfg-ethX,如下示例:
-------------------------------------------------------------
nmcli c show ethX
nmcli c show cae3f1ef-e79a-46c3-8e0c-946b91a65e11
nmcli c show /etc/sysconfig/network-scripts/ifcfg-ethX
-------------------------------------------------------------

1、nmcli connection名字(連接名稱)

同時對應ifcfg的文件名以及內容中的NAME=,該參數表示連接(connection)的名字,無需和網卡名相同,可以爲一個設備(device)創建多個連接,但同一時刻只能有一個連接生效。當有多個連接時候,可以通過nmcli c delete刪除當前連接,就會自動選擇同一個設備的其他連接來頂替生效。可以通過nmcli c up來將指定連接切換生效。

注意:通過nmcli c modify修改連接名稱,只會對應修改ifcfg文件中的NAME,而不會更改ifcfg文件名。

2、nmcli c的ipv4.method

對應ifcfg文件內容的BOOTPROTO,ipv4.method默認爲auto,對應爲BOOTPROTO=dhcp,這種時候如果指定ip,就可能導致網卡同時有dhcp分配的ip和靜態ip。設置爲manual表示BOOTPROTO=none,即只有靜態ip。


三、nmcli device說明

 -------------------------------------------------------------

pipci@HP:~$ nmcli d status               #查看設備接口簡略信息
DEVICE    TYPE    STATE     CONNECTION
wlp2s0       wifi      connected      CMCC-Debian
enp1s0    ethernet      unavailable   --
vboxnet0      ethernet      unmanaged   --
lo            loopback     unmanaged    --
pipci@HP:~$
-------------------------------------------------------------
每一行表示一個網絡設備的接口
第一列表示設備接口的名稱
第二列表示設備接口的類型
第三列表示設備接口狀態
最後一列表示connection的名字,“--”表示設備爲使用

 

1、nmcli d connect ethX

由NM對指定網卡進行管理,同時刷新該網卡對應的活躍connection(如果之前有修改過connection配置);如果有connection但是都處於非活躍狀態,則自動選擇一個connection並將其活躍;如果沒有connection,則自動生成一個並將其活躍。

2、nmcli d disconnect ethX

讓NM暫時不管理指定網卡,此操作不會變更實際網卡的link狀態,只會使對應的connection變成非活躍。若重啓系統則又會自動connect。另外,如果手工將該網卡的connection全部刪掉,該網卡狀態也會自動變爲disconnected。

3、nmcli d reapply ethX

專門用於刷新connection,前提是網卡的device處於connected狀態,否則會報錯。

4、nmcli d set ethX autoconnect yes|no managed yes|no

可以設置是否自動連接和是否自動管理,但經測試只能用於當前開機狀態, 如果這2個參數都設置爲no,然後重啓系統,又會自動恢復成connected和managed yes的狀態。所以該命令用途不大。注意事項:如果managed設置爲no,那麼nmcli c reload會讀取配置文件,但是不會立即生效,接着如果執行nmcli c up ethX,就會立即生效,同時managed自動變爲yes。

重啓系統自動恢復成connected和managed yes的狀態,這種邏輯並不實用也不夠合理,牛人已將此問題提交給redhat,據回覆,這麼設計是因爲目前沒有一個有效的手段來證明“我是我”,比如當網卡重新拔插到其他插槽時候,網卡名有很大可能性會發生變化,因此無法確定關機前設置的是對應開機後的哪個網卡,目前暫無辦法解決,筆者將持續跟進。

四、3種網絡配置方法
在講3種配置方法前,需要先明白ifcfg和NM connection的關聯:雖然network.service被廢棄了,但是redhat爲了兼容傳統的ifcfg,通過NM進行網絡配置時候,會自動將connection同步到ifcfg配置文件中。也可以通過nmcli c reload或者nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX的方式來讓NM讀取ifcfg配置文件到connection中。因此ifcfg和connection是一對一的關係,另外上面有提到,connection和device是多對一的關係。

1. 手工配置ifcfg,通過NM來生效
2. 通過NM自帶工具配ip,比如nmcli
3. 手工配置ifcfg,通過傳統network.service來生效

建議:

推薦使用上述第1種網絡配置方法(手工配置ifcfg,通過NM生效),因爲這樣既兼容了傳統的ifcfg配置,又能熟悉nmcli。舉例:
-----------------------------------------------
vi /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
----------------------------------------------
nmcli c reload           ## 重載所有ifcfg到connection(不會立即生效)
nmcli c up eth0         ## 如果之前沒有eth0的connection,則上一步reload後就已經自動生效了
----------------------------------------------
這麼做有2個好處:
按官方建議使用NM而不是network.service,當還不太熟悉nmcli命令時候,這樣最穩妥

四、Tips
1. nmcli命令支持tab補全,但是需要yum install bash-completion

2. 如果希望NM不要納管網卡,只有一個辦法最徹底最靠譜,就是自己寫ifcfg,內容加上NM_CONTROLLED=no,這樣該device的狀態就會始終保持unmanaged。nmcli c up、nmcli c reload、nmcil c load都不會對其起任何作用。

3. NM只能對link狀態爲up的網卡進行操作,如果手動ip link set ethX down,那麼NM就無法對該網卡做任何操作(即使nmcli d connect也沒有用)。

4. 對於RHEL8,可以通過yum install network-scripts來安裝傳統的network.service,不過redhat說了,在下一個rhel的大版本里將徹底廢除,因此不建議使用network.service。

5. 手工創建新的ifcfg或者在ifcfg裏修改ip等配置,NM不會自動讀取,需要手工執行nmcli c reload或者nmcli c load /etc/sysconfig/network-scripts/ifcfg-ethX。這一點可能和其他系統的NM行爲不太一樣,但這種做法實則更適合服務器。

6. 不手工配置ifcfg,使用默認的dhcp情況下,網卡的增減是不會自動生成ifcfg,此時nmcli c看到的con-name將類似'System ethX'或者'Wired connection 1'。

7. NetworkManager支持3種獲取dhcp的方式:dhclient、dhcpcd、internal,當/etc/NetworkManager/NetworkManager.conf配置文件中的[main]部分沒配置dhcp=時候,默認使用internal(rhel7/centos7默認是dhclient)。internal是NM內部實現的dhcp客戶端。

8. 關於手動指定網關ip的方法,經過實測,/etc/sysconfig/network中的GATEWAY僅在3種情況下有效:NM_CONTROLLED=no或ipv4.method manual或從ipv4.method manual第一次轉到ipv4.method auto時候。建議:當NM_CONTROLLED=no時,將網關寫在/etc/sysconfig/network(GATEWAY);當使用NM時候,使用nmcli c命令配置網關(比如nmcli c modify ethX ipv4.gateway 192.168.1.1)。

9. NM默認會從dhcp裏獲取dns信息,並修改/etc/resolv.conf,如果不想讓NM管理/etc/resolv.conf,則只需在/etc/NetworkManager/NetworkManager.conf裏的[main]裏增加dns=none即可。

10. 如果想讓NM不要自動管理新網卡(比如不要給新網卡獲取ip地址),則只需在/etc/NetworkManager/NetworkManager.conf裏的[main]裏增加no-auto-default=*即可,改完後通過systemctl restart NetworkManager或者重啓系統來生效。除了手工在NetworkManager.conf里加配置,也可以yum install NetworkManager-config-server,這會生成/usr/lib/NetworkManager/conf.d/00-server.conf,內容爲如下截圖。建議使用前者方案,因爲後者的ingore-carrier是不被推薦的參數。

11. 更多NetworkManager參數詳見man NetworkManager.conf

 

參考:

https://www.jianshu.com/p/244115c34f08

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章