一、 网络接口设备 Linux2.6 内核引入了一个基于内存的文件系统 sysfs ,用于向用户空间导出内核设备资源并且进行读写操作,挂载点位于/sys 。
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@MiWiFi-RA70-srv ~]# tree /sys -L 1 /sys ├── block 已废弃。记录当前被发现的所有块设备,已迁移到 /sys/class/block ├── bus 已注册在操作系统内核的总线类型,每种类型均包括 devices 和 drivers ├── class 最核心!已注册在操作系统内核的全量设备,按照设备功能分目录管理 ├── dev 维护一个字符设备和块设备的软链接文件 ├── devices 最基础!全局设备结构体系,包含所有被发现的注册在各种总线上的各种真实物理设备 ├── firmware 系统加载固件对象和属性的用户空间接口 ├── fs 记录当前被发现的所有文件系统 ├── hypervisor 与虚拟化Xen相关的装置 ├── kernel 内核中所有可调整的参数 ├── module 包含所有的被载入操作系统内核的模块 └── power 系统的电源选项
该文件系统是内核设备树的一个直观反映,也就是说,当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。 Centos网络接口信息位于/sys/class/net,但该目录下实际都是软链接文件,物理文件实际位于/sys/devices。
1 2 3 4 [root@MiWiFi-RA70-srv fs]# ls -l /sys/class/net 总用量 0 lrwxrwxrwx 1 root root 0 8月 19 10:24 ens18 -> ../../devices/pci0000:00/0000:00:12.0/virtio3/net/ens18 lrwxrwxrwx 1 root root 0 8月 19 10:24 lo -> ../../devices/virtual/net/lo
要查看网络接口信息,最简单的方法就是命令ip a,或者传统方式ifconfig -a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@MiWiFi-RA70-srv network]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 5a:3b:ab:a3:01:88 brd ff:ff:ff:ff:ff:ff inet 192.168.0.32/24 brd 192.168.0.255 scope global dynamic ens18 valid_lft 28934sec preferred_lft 28934sec inet6 2409:8a00:321c:d121:583b:abff:fea3:188/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 215859sec preferred_lft 129459sec inet6 fe80::583b:abff:fea3:188/64 scope link valid_lft forever preferred_lft forever
二、 网络服务组件 1. network.service network的启动方式 Centos7 之前的版本都是通过 network.service 管理网络配置,启动方式还是基于rc.d的传统方式,启动脚本位于 /etc/rc.d/init.d/network。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@copy-of-vm-centos7 ~]# systemctl status network ● network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) Active: active (running) since 四 2023-08-17 23:53:18 CST; 1 day 16h ago Docs: man:systemd-sysv-generator(8) Process: 576 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS) CGroup: /system.slice/network.service └─760 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H copy-of-vm-centos7 eth0 8月 18 22:32:37 copy-of-vm-centos7.8-cloudinit dhclient[760]: bound to 192.168.0.17 -- renewal in 15251 seconds. 8月 19 02:46:48 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPREQUEST on eth0 to 192.168.0.1 port 67 (xid=0x1b984451) 8月 19 02:46:48 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPACK from 192.168.0.1 (xid=0x1b984451) 8月 19 02:46:50 copy-of-vm-centos7.8-cloudinit dhclient[760]: bound to 192.168.0.17 -- renewal in 15611 seconds. 8月 19 07:07:01 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPREQUEST on eth0 to 192.168.0.1 port 67 (xid=0x1b984451) 8月 19 07:07:01 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPACK from 192.168.0.1 (xid=0x1b984451) 8月 19 07:07:03 copy-of-vm-centos7.8-cloudinit dhclient[760]: bound to 192.168.0.17 -- renewal in 17059 seconds. 8月 19 11:51:22 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPREQUEST on eth0 to 192.168.0.1 port 67 (xid=0x1b984451) 8月 19 11:51:22 copy-of-vm-centos7.8-cloudinit dhclient[760]: DHCPACK from 192.168.0.1 (xid=0x1b984451) 8月 19 11:51:24 copy-of-vm-centos7.8-cloudinit dhclient[760]: bound to 192.168.0.17 -- renewal in 17493 seconds.
network的配置文件 网卡配置文件位于/etc/sysconfig/network-scripts/,每个设备都需要生成独立的接口配置文件,命名方式是ifcfg-<网络接口名>。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@MiWiFi-RA70-srv /]# ls -l /etc/sysconfig/network-scripts/ 总用量 4 -rw-r--r--. 1 root root 279 8月 15 22:11 ifcfg-ens18 [root@MiWiFi-RA70-srv /]# more /etc/sysconfig/network-scripts/ifcfg-ens18 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens18 UUID=8e4c648c-871f-4223-8d94-ee09aa8580b9 DEVICE=ens18 ONBOOT=no
network的应用说明
network.service 是一个非常简单的软件包,仅有264行代码的脚本文件
设计目标基于简单的有线网络环境,当网络接口配置信息修改后,网络服务必须重新启动,因此很难满足无线网络切换的需求
2. NetworkManager.service RedHat 在2004年启动了 NetworkManager 项目,皆在能够让Linux用户更轻松的处理现代网络需求,尤其是无线网络,能够自动发现网卡并配置IP地址,现在由 GNOME 管理。
NetworkManager的启动方式 NetworkManager.service的主程序是/usr/sbin/NetworkManager,支持 systemd 启动方式,启动配置文件位于/usr/lib/systemd/system/NetworkManager.service。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@MiWiFi-RA70-srv ~]# systemctl status NetworkManager ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled) Drop-In: /usr/lib/systemd/system/NetworkManager.service.d └─NetworkManager-ovs.conf Active: active (running) since Fri 2023-08-18 00:06:55 CST; 33min ago Docs: man:NetworkManager(8) Main PID: 547 (NetworkManager) Tasks: 5 Memory: 13.0M CGroup: /system.slice/NetworkManager.service ├─547 /usr/sbin/NetworkManager --no-daemon ├─573 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/NetworkManager/dhclient-eth0.pid -lf /var/lib/NetworkMan> └─965 /sbin/dhclient -d -q -6 -N -sf /usr/libexec/nm-dhcp-helper -pf /var/run/NetworkManager/dhclient6-eth0.pid -lf /var/lib/Net> 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option life_starts => '1692288420' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option max_life => '43200' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option preferred_life => '43200' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option rebind => '34560' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option renew => '21600' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option requested_dhcp6_client_id => '1' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1369] dhcp6 (eth0): option requested_dhcp6_domain_search => '1' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1370] dhcp6 (eth0): option requested_dhcp6_name_servers => '1' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1370] dhcp6 (eth0): option starts => '1692288420' 8月 18 00:07:00 MiWiFi-RA70-srv NetworkManager[547]: <info> [1692288420.1370] dhcp6 (eth0): state changed unknown -> bound, event ID="28:3> [root@MiWiFi-RA70-srv ~]#
NetworkManager的配置文件 NetworkManager.service网卡配置方式与network.service保持一致,也是位于/etc/sysconfig/network-scripts/,文件命名和配置方式也完全相同。nmcli是用于控制 NetworkManager 和报告网络状态的命令行工具,用于创建,显示,编辑,删除,激活和停用网络连接,以及控制和显示网络设备状态。
1 2 3 4 5 6 7 [root@MiWiFi-RA70-srv ~]# nmcli connection show NAME UUID TYPE DEVICE ens18 8e4c648c-871f-4223-8d94-ee09aa8580b9 ethernet ens18 [root@MiWiFi-RA70-srv ~]# ls -l /etc/sysconfig/network-scripts 总用量 4 -rw-r--r-- 1 root root 280 8月 19 23:40 ifcfg-ens18
此外,NetworkManager 还有一个漂亮的图形界面软件 nmtui,其核心功能与nmcli完全相同。
NetworkManager的应用说明
Centos7 同时支持network.service和NetworkManager.service,相当于在 Centos7 的一个过渡,默认情况下这2个服务都有开启,但是因为NetworkManager.service当时的兼容性不好,大部分人都会将其关闭
Centos 8 已经废弃 network.service(默认不安装),只能通过 NetworkManager 进行网络配置,OpenEuler 21.10 也是这样
3. systemd-networkd.service 作为一个 “从未完成、从未完善、但一直追随技术进步” 的系统,systemd 已经不只是一个初始化进程,它被设计为一个更广泛的系统以及服务管理平台,包含了不断增长的核心系统进程、库和工具的生态系统。systemd-networkd是 Systemd 计划的一部分,旨在提供一个轻量级、高性能的网络管理器。它使用原生Linux网络接口,不依赖第三方软件包,因此占用更少的资源和内存。
systemd-networkd的启动方式 systemd 210 及其更高版本提供了systemd-networkd,其主程序是/usr/lib/systemd/systemd-networkd,启动配置文件位于/usr/lib/systemd/system/systemd-networkd.service。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@MiWiFi-RA70-srv ~]# systemctl status systemd-networkd ● systemd-networkd.service - Network Service Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2023-08-18 00:06:55 CST; 35min ago Docs: man:systemd-networkd.service(8) Main PID: 548 (systemd-network) Status: "Processing requests..." Tasks: 1 Memory: 1.6M CGroup: /system.slice/systemd-networkd.service └─548 /usr/lib/systemd/systemd-networkd 8月 18 00:06:55 MiWiFi-RA70-srv systemd[1]: Starting Network Service... 8月 18 00:06:55 MiWiFi-RA70-srv systemd-networkd[548]: Enumeration completed 8月 18 00:06:55 MiWiFi-RA70-srv systemd[1]: Started Network Service. 8月 18 00:06:56 MiWiFi-RA70-srv systemd-networkd[548]: eth0: Gained carrier 8月 18 00:06:58 MiWiFi-RA70-srv systemd-networkd[548]: eth0: Gained IPv6LL
systemd-networkd的配置方式 网络配置文件保存在/etc/systemd/network/。 配置文件名可以任意,物理网络设备一般使用后缀名.network,虚拟网络设备一般使用后缀名.netdev。
1 2 3 4 5 6 7 8 9 10 11 12 13 $ cat /etc/systemd/network/20-dhcp.network[Match] Name=enp3* [Network] DHCP=yes $ cat /etc/systemd/network/10-static-enp3s0.network[Match] Name=enp3s0 [Network] Address=192.168.10.50/24 Gateway=192.168.10.1 DNS=8.8.8.8
正如你上面看到的,每个网络配置文件包括了一个或多个 “sections”,每个 “section”都用 [XXX] 开头。每个 section 包括了一个或多个键值对。[Match]部分决定这个配置文件配置哪个(些)网络设备。例如,这个文件匹配所有名称以 ens3 开头的网络设备(例如 enp3s0、 enp3s1、 enp3s2 等等)对于匹配的接口,[Network]部分指定的 DHCP 网络配置。
配置目录存在多个文件时,systemd-networkd会按照字母顺序一个个加载并处理。
systemd-networkd的应用说明
目前,systemd-networkd还不能直接支持无线网络,但你可以使用wpa_supplicant服务配置无线适配器,然后把它和systemd-networkd联系起来
使用systemd-networkd时,需要手工启用systemd-resolved服务用于域名解析。 该服务实现了一个缓存式 DNS 服务器,并通过/run/systemd/resolve/resolv.conf管理DNS服务。 由于很多应用程序依赖于/etc/resolv.conf,因此为了兼容性需要为两者建立一个软链接。
Ubuntu 18.04及更高版本中,默认使用 systemd-networkd 作为网络管理器,但也可以选择切换到 NetworkManager。
4. netplan Netplan 是由 Ubuntu 的母公司 Canonical 开发的网络组件,目标是为不同的后端管理工具提供统一的网络配置抽象方法。
以最简单的静态网卡配置为例,
1 2 3 4 5 6 7 8 9 10 11 12 13 network: version: 2 renderer: networkd ethernets: enp3s0: addresses: - 10.10 .10 .2 /24 nameservers: search: [mydomain , otherdomain ] addresses: [10.10 .10 .1 , 1.1 .1 .1 ] routes: - to: default via: 10.10 .10 .1
netplan 提供两个命令行工具:
netplan generate :以 /etc/netplan 配置为管理工具生成配置信息
netplan apply :应用配置。调整 /etc/netplan 配置后,需要执行该命令方能生效,必要时重启管理工具
三、小结
如果你使用的是 KDE 或者 GOME 等 Linux 桌面,毫无疑问应该使用 NetworkManager。 因为其使用DBus作为通信机制,可以集成各种网络类型和设备,包括以太网、无线网络、蓝牙、移动宽带等,支持广泛的网络协议和语言环境,提供图形界面和命令行界面等多种管理方式,能让你的计算机在任何时候通过多种接口保持连接。
如果你使用的是 Linux 服务器,则需要区分不同版本:
Centos7 及以前版本:建议直接使用 network,并关闭 NetworkManager,因为存在一些兼容性问题
Centos8 及以后版本:建议使用 NetworkManager,并关闭 systemd-networkd(network 已被默认卸载)
systemd-networkd 有着快速启动、低内存占用和高性能等突出优点,与其他 systemd 组件(例如用于域名解析的 resolved、NTP 的timesyncd,用于命名的 udevd)结合的非常好,但目前还不是一个成熟的解决方案,主要问题是:
不支持无线网络,需要手工关联wpa_supplicant服务
全局域名解析存在缺陷,需要手工关联systemd-resolved服务
不能为更高层面的脚本编程提供 ifup/ifdown 钩子函数
Netplan 目前并未流行,主要是 Ubuntu 17 以后的版本提供,Centos 似乎没有默认安装包。
附录:网卡设备的命名方式 Centos6 及之前的版本网卡命名格式:eth[0123…],也就是常见的eth0等等。随着服务器网卡的数量、类型和集成方式越来越复杂(既有主板集成的,也有PCIe插槽,wifi、蓝牙等无线网卡),简单的数字编号已经很难准确标识网卡接口的物理位置。
Centos7 开始默认启用一致网络设备命名(Consistent Network Device Naming),支持 biosdevname 和 net.ifnames 两种命名规范。 常见的 net.ifnames 命名规范表述为:设备类型 + 设备位置 + 数字,主要设备类型前缀包括:
en :用于以太网
wl :用于无线 LAN(WLAN)
ww :用于无线广域网(WWAN)。
另外,以下之一会根据 udev 设备管理器应用的模式,附加到上述前缀中的一个:
o<on-board_index_number>:主板集成设备
s<hot_plug_slot_index_number>[f<function>][d<device_id>]:主板集成的PCI插槽 请注意,所有多功能 PCI 设备在设备名称中都包含[f<function>]号,包括功能 0 设备。
x<MAC_address>:网卡的MAC地址
[P<domain_number>]p<bus>s<slot>[f<function>][d<device_id>]:PCI扩展卡 [P<domain_number>] 部分定义了 PCI 的地理位置。如果域号不是 0 ,才会设置此部分。
[P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][…][c<config>][i<interface>]:USB设备 对于 USB 设备,hub 端口号的完整链由 hub 的端口号组成。如果名称大于最大值(15 个字符),则不会导出该名称。如果链中有多个 USB 设备,则 udev 会抑制 USB 配置描述符(c1)和 USB 接口描述符(i0)的默认值。
biosdevname 规范的常见名称包括:em1、p3p4、p3p4_1、。。。
udev 设备管理器会根据以下方案生成设备名称:
Scheme
描述
示例
1
设备名称包含固件或者 BIOS 提供的索引号,用于板上的设备。如果此信息不可用或不适用,则 udev 将使用方案 2。
eno1,主板集成的1号以太网卡
2
设备名称包含固件或 BIOS 提供的 PCI Express(PCIe)热插件插槽索引号。如果此信息不可用或不适用,则 udev 将使用方案 3。
ens1,内置1号PCI接口的以太网卡
3
设备名称包含硬件连接器的物理位置。如果此信息不可用或不适用,则 udev 将使用方案 5。
enp2s0,2号PCI扩展卡的slot 0的以太网卡
4
设备名称包含 MAC 地址。Red Hat Enterprise Linux 默认不使用这个方案,但管理员可选择性地使用它。
enx525400d5e0fb,网卡的MAC地址
5
传统的无法预计的内核命名方案。如果 udev 无法应用任何其他方案,则设备管理器使用这个方案。
eth0,传统方案
更多示例包括:
wlp3s0 :PCI无线网卡
wwp0s29f7u2i2 :4G modem
wlp0s2f1u4u1 :连接在USB Hub上的无线网卡
enx78e7d1ea46da :直接以MAC地址命名的 PCI 网卡
参考文献