随着计算机网络技术的进步,网络环境越来越复杂。特别是无线网络技术的发展,其中一个主要的问题是,如何保证在网络环境变化的情况下,保持访问的可持续性。开发者们收集了新时代的网络需求,并开发出了networkManager。
    NetworkManager 的出现主要为了解决下面的问题:软件可以自动检测尽量多的信息,在复杂网络环境下可以平滑的切换,可以即使反馈网络状态,可以在桌面环境下工作。
    NetworkManager由一个管理系统网络连接、并且将其状态通过D-BUS进行报告的后台服务,以及一个允许用户管理网络连接的客户端程序组成。

  NetworkManager 网络配置顺序
    1) 如果有线网络连接可用,NetworkManager会自动配置有线网络连接。
    2) 如果有线网络连接不可以用,NetworkManager 会搜寻所有可检测到的无线网络,如果有保存的授权信息, NetworkManager会自动配置无线网络连接
    3) 如果用户自定义网络信息,用户定义具有最高优先权。

NetworkManger系统架构
    NetworkManger由四个独立的模块构成:
    
   - NetworkManager服务 — 一个核心服务,用户处理网络连接和策略
   - DHCPCD — NetworkManager使用的DHCP客户端服务 NetworkManagerInfo —
   - 收集用户桌面或者客户端定义信息,并反馈网络状态给用户 NetworkManagerNotification —   
   - Panel的桌面通知标识符。

      这四部分合作,完成 NetworkManager 网络的管理。 他们的结构图如下:

NetworkManager 和 D-BUS
   D-Bus 是一种被linux系统广泛集成的一个内部消息(IPC)和远程进程调用(RPC)组件, 同一系统间,进程可以通过D-Bus通过并发交互。D-Bus 是freedesktop.org 项目的一部分,目的是标准化linux桌面(如:KDE, GNOME)的系统消息服务。
   NetworkManager 使用D-BUS 可以增加系统设计的弹性和安全性。

   D-BUS 被用于NetworkManager内部进程通讯:

 - NetworkManager服务和 NetworkManagerInfo
 - NetworkManagerInfo 和NetworkManagerNotification
 - NetworkManager服务和 HAL

   对外,NetworkManager使用D-BUS 广播网络状态的变化,并允许通过D-BUS改变这种状态

   NetworkManager和HA
   HAL, 全称 硬件抽象曾,它允许应用程序获取硬件的状态。NetworkManager 启动时,查询HAL获得可用硬件状态。硬件状态的改变会被HAL记录,并传递给 NetworkManager. HAL可以提供网卡设备的信息,以便networkManger使用。

   NetworkManager命令及简单使用
    nmcli的基本配置选项:
    Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }
    
    OPTIONS
      -t[erse]                                   terse output
      -p[retty]                                  pretty output
      -m[ode] tabular|multiline                  output mode
      -f[ields] <field1,field2,...>|all|common   specify fields to output
      -e[scape] yes|no                           escape columns separators in values
      -n[ocheck]                                 don't check nmcli and NetworkManager versions
      -a[sk]                                     ask for missing parameters
      -w[ait] <seconds>                          set timeout waiting for finishing operations
      -v[ersion]                                 show program version
      -h[elp]                                    print this help
    
    OBJECT
      g[eneral]       NetworkManager's general status and operations
      n[etworking]    overall networking control
      r[adio]         NetworkManager radio switches
      c[onnection]    NetworkManager's connections
      d[evice]        devices managed by NetworkManager
      a[gent]         NetworkManager secret agent or polkit agent
      
       nmcli dev 列出所有网络设备     
    [root@dhcp-129-213 proc]# nmcli dev
    DEVICE      TYPE      STATE      CONNECTION
    docker0     bridge    connected  docker0    
    virbr0      bridge    connected  virbr0     
    eno1        ethernet  connected  eno1       
    virbr0-nic  tap       connected  virbr0-nic
    vnet0       tap       connected  vnet0      
    vnet1       tap       connected  vnet1      
    lo          loopback  unmanaged  --    
      
      nmclie dev disconnect 断开连接
    root@dhcp-129-213 proc]# nmcli dev disconnect  eno1
    Device 'eno1' successfully disconnected.
      nmclie dev connect 连接
    [root@dhcp-129-213 proc]# nmcli dev connect  eno1
    Device 'eno1' successfully activated with 'b3a8ec6f-337b-46e6-a88b-b988569fa271'.  
      nmcli con show 显示设备信息
       [root@dhcp-129-213 proc]# nmcli con show
    NAME        UUID                                  TYPE            DEVICE     
    docker0     f195ac51-0ad1-425c-b2a2-8964f5625fbc  bridge          docker0    
    virbr0-nic  a43be4e2-5ab7-43bc-9de4-5a3240edc3c4  generic         virbr0-nic
    virbr0      38f0556c-a225-4ff6-9fa7-c7d91744b440  bridge          virbr0     
    eno1        b3a8ec6f-337b-46e6-a88b-b988569fa271  802-3-ethernet  eno1       
    vnet1       205ad0f6-7c8e-4e5b-a9ed-231fb248b872  generic         vnet1      
    vnet0       84c6df62-8163-4ce6-8a46-b00abea19d8c  generic         vnet0  

 RHEL7 虚拟机 中一个NetworkManager 网络问题的解决:
    问题描述: 启动的虚拟机不能获得IP地址.
    检查:
    nmcli dev显示设备网络名为ens3
    [root@dhcp-129-128 ~]# nmcli dev
    DEVICE  TYPE      STATE      CONNECTION
    ens3    ethernet  connected  ens3       
    lo      loopback  unmanaged  --  
    nmcli con show 显示连接名为:eth9, 设备名为---
    [root@dhcp-129-128 ~]# nmcli con show
    NAME  UUID                                  TYPE            DEVICE
    eth0  9246e3d0-5ee6-424b-ab25-341b23740f9f  802-3-ethernet --  
    
    解决方案: 这是由于虚拟机拷贝后网卡设备名变化引起的。删除旧的连接重新建立连接后,问题消失。
    nmcli con delete eth0
    nmcli dev connect ens3
    [root@dhcp-129-128 ~]# nmcli con show
NAME  UUID                                  TYPE            DEVICE
ens3  9246e3d0-5ee6-424b-ab25-341b23740f9f  802-3-ethernet  ens3