Centos内核态启动并加载网卡的逻辑;用户态命名网卡流程;ifcfg-IFACE文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
内核态启动并加载网卡的逻辑 ======================================================================================================================== 1.运行Linux的机器在BIOS阶段之后,机器的boot loader根据我们预先定义好的配置文件,将intrd和linux kernel加载到内存。 这个包含initrd和linux kernel的配置文件通常在/boot分区(从grub.conf中读取参数) 2.内核启动,运行当前根目录下面的init进程,init进程再运行其他必要的进程,其中跟网卡PCI设备相关的一个进程,就是udevd进程, udevd负责根据内核pci scan的pci设备,从initrd这个临时的根文件系统中加载内核模块,对于网卡来说,就是网卡驱动。(对应systemd-udevd 服务) 3.udevd,根据内核pci device scan出来的pci device,通过netlink消息机制通知udevd加载相应的内核驱动, 其中,网卡驱动就是在这个阶段加载,如果initrd临时文件系统里面有这个网卡的驱动文件。 通常upstream到linux内核的驱动,比如ixgbe,或者和内核一起编译的网卡驱动,会默认包含在initrd文件系统中。 这些跟内核一起ship的网卡驱动会在这个阶段加载 4.udevd除了负责网卡驱动加载之外,还要负责为网卡命名。 udevd在为网卡命名的时候,会首先check “/etc/udev/rules.d/“下的rule,如果hit到相应的rule,就会通过rule里面指定的binary为网卡命名。 如果/etc/udev/rules.d/没有命名成功网卡,那么udevd会使用/usr/lib/udev/rule.d下面的rule,为网卡重命名。 其中rule的文件经常以数字开头,数字越小,表示改rule的优先级越高。intrd init不会初始化network服务, 所以/etc/sysconfig/network-scripts下面的诸如bond0,route的配置都不会生效。(内核启动先是 intrd init,然后执行一次真正的init) 5.在完成网卡driver load和name命名之后,initrd里面的init进程,会重启其他用户态进程,如udevd等,并且重新mount真正的根文件系统,启动network service。 6.重启udevd,会触发一次kernel的rescan device。这样第三方安装的网卡driver,由于其driver模块没有在initrd里面,会在这个阶段由udevd触发加载。 同时,也会根据“/etc/udev/rules.d/”和“/usr/lib/udev/rule.d”的rule,重命名网卡设备。–用户态修改网卡名字的机会 kernel: ixgbe 0000:3b:00.1 eth1: renamed from enp59s0f1 kernel: i40e 0000:88:00.0 eth7: renamed from enp136s0 7.同时network service 会启动,进而遍历etc/sysconfig/network-scripts下面的脚本,我们配置的bond0, 默认路由,通常会在这个阶段运行,创建 kernel: bond0: Enslaving eth0 as a backup interface with a down link kernel: ixgbe 0000:3b:00.0 eth0: detected SFP+: 5 kernel: power_meter ACPI000D:00: Found ACPI power meter. kernel: power_meter ACPI000D:00: Ignoring unsafe software power cap! kernel: ixgbe 0000:3b:00.1: registered PHC device on eth1 kernel: ixgbe 0000:3b:00.0 eth0: NIC Link is Up 10 Gbps, Flow Control: RX/TX kernel: bond0: Enslaving eth1 as a backup interface with a down link kernel: bond0: Warning: No 802.3ad response from the link partner for any adapters in the bond kernel: bond0: link status definitely up for interface eth0, 10000 Mbps full duplex kernel: bond0: first active interface up! ----------------------------------------------------------------- 由于我们系统的初始化有两个阶段,udevd会运行两次,所以内核态网卡driver的加载,网卡命名也有两次机会。 第一次网卡driver的加载和命名是在initrd运行阶段,这个阶段由于initrd文件系统比较小,只包括和kernel一起ship的内核module,所以这个阶段只能加载initrd里面有的内核模块。网卡的重命名也只能重命名加载了驱动的网卡。 第二个网卡driver的加载和命名,是在真正根文件系统加载后,内核再一次pci scan,这个时候,由于真的根文件系统包含了所有的driver,第一个阶段无法probe的网卡会在这个阶段probe,重命名也会在这个阶段进行。 内核默认命名规则有一定的局限性,往往不一定准确对应网卡接口的物理顺序,而且每次启动只根据内核发现网卡的顺序进行命名,因此并不固定; 所以目前一般情况下会在用户态启用其他的方式去更改网卡名称,原则就是在内核命名ethx后将其在根据用户态的规则rename为其他的名字, 这种规则往往是根据网卡的Mac地址以及其他能够唯一代表一块网卡的参数去命名,因此会一一对应; 内核自带的网卡驱动在initrd中的内核模块中。对于第三方网卡,我们通常通过rpm包的方式安装。这种第三方安装的rpm,通常不会在initrd里面,只存在disk上。 这样这种内核模块就只会在第二次udevd启动的时候被加载。 不论第一次重命名还是第二次重命名,其都遵循一样的逻辑,也就是先check /etc/udev/rules.d/的rule,然后check /usr/lib/udev/rule.d中的rule,其中rule的优先级etc下最高,然后是usr下面。 并且,rule的文件名中的数字表示该rule在同一文件夹中的优先级,数字越低,优先级越高。 network.service 根据network-script里面的脚本创建bond0,下发路由。这个过程和网卡重命名是同步进行, 一般网卡重命名会超级快,单极端情况下重命名可能在network.service后会导致创建bond0失败(依赖网卡名来bonding),这里会依赖network.service retry机制来反复尝试确保network服务能启动成功 要想解决网卡加载慢的问题,可以考虑把安装后的网卡集成到initrd中。Linux系统提供的dracut可以做到这一点,我们只需要在安装完第三方网卡驱动后,执行: dracut --forace udevadm info -q all -a /dev/nvme0 #查看 就可以解决这个问题,该命令会根据最新的内存中的module,重新下刷initrd。 其实在多数第三方网卡的rpm spec或者makefile里面通常也会加入这种强制重刷的逻辑,确保内核驱动在initrd里面,从而加快网卡驱动的加载。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
用户态命名网卡流程 ============================================================================================================== CentOS 7提供了在网络接口中使用一致且可预期的网络设备命名方法, 目前默认使用的是net.ifnames规则。The device name procedure in detail is as follows: 1.A rule in /usr/lib/udev/rules.d/60-net.rules instructs the udev helper utility, /lib/udev/rename_device, to look into all /etc/sysconfig/network-scripts/ifcfg-*suffix* files. If it finds an ifcfg file with a HWADDR entry matching the MAC address of an interface it renames the interface to the name given in the ifcfg file by the DEVICE directive.(根据提前定义好的ifcfg-网卡名来命名网卡–依赖mac匹配,如果网卡的ifconfig文件中未加入HWADDR,则rename脚本并不会根据配置文件去重命名网卡) 2.A rule in /usr/lib/udev/rules.d/71-biosdevname.rules instructs biosdevname to rename the interface according to its naming policy, provided that it was not renamed in a previous step, biosdevname is installed, and biosdevname=0 was not given as a kernel command on the boot command line. 3.A rule in /lib/udev/rules.d/75-net-description.rules instructs udev to fill in the internal udev device property values ID_NET_NAME_ONBOARD, ID_NET_NAME_SLOT, ID_NET_NAME_PATH, ID_NET_NAME_MAC by examining the network interface device. Note, that some device properties might be undefined. 4.A rule in /usr/lib/udev/rules.d/80-net-name-slot.rules instructs udev to rename the interface, provided that it was not renamed in step 1 or 2, and the kernel parameter net.ifnames=0 was not given, according to the following priority: ID_NET_NAME_ONBOARD, ID_NET_NAME_SLOT, ID_NET_NAME_PATH. It falls through to the next in the list, if one is unset. If none of these are set, then the interface will not be renamed. Steps 3 and 4 are implementing the naming schemes 1, 2, 3, and optionally 4, described in Section 11.1, “Naming Schemes Hierarchy”. Step 2 is explained in more detail in Section 11.6, “Consistent Network Device Naming Using biosdevname”. ----------------------------------------------------------------------------------------- 以上重命名简要概述就是对于CentOS系统,一般有下面几个rule在/usr/lib/udev/rule.d来重命名网卡: 1./usr/lib/udev/rules.d/60-net.rules 文件中的规则会让 udev 帮助工具/lib/udev/rename_device 查看所有 /etc/sysconfig/network-scripts/ifcfg-* 文件。 如果发现包含 HWADDR 条目的 ifcfg 文件与某个接口的 MAC 地址匹配,它会将该接口重命名为ifcfg 文件中由 DEVICE 指令给出的名称。 rename条件:如果网卡的ifconfig文件中未加入HWADDR,则rename脚本并不会根据配置文件去重命名网卡; 2./usr/lib/udev/rules.d/71-biosdevname.rules 中的规则让 biosdevname 根据其命名策略重命名该接口, 即在上一步中没有重命名该接口、安装biosdevname、且在 boot 命令行中将biosdevname=0 作为内核命令给出。 (bisodevname规则,从CentOS 7 开始默认不使用,所以该条规则在不配置的情况下失效,直接去执行3;默认在cmdline中bisodevname=0,如果需要启用,则需要设置bisodevname=1) 3./lib/udev/rules.d/75-net-description.rules 中的规则让 udev 通过检查网络接口设备,填写内部 udev 设备属性值 ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH、ID_NET_NAME_MAC。 注:有些设备属性可能处于未定义状态。 –没有修改网卡名,只是取到了命名需要的一些属性值。 查看:udevadm info -p /sys/class/net/enp125s0f0 4./usr/lib/udev/rules.d/80-net-name-slot.rules 中的规则让 udev 重命名该接口, 优先顺序如下:ID_NET_NAME_ONBOARD、ID_NET_NAME_SLOT、ID_NET_NAME_PATH。 并提供如下信息:没有在步骤 1 或 2 中重命名该接口,同时未给出内核参数 net.ifnames=0。 如果一个参数未设定,则会按列表的顺序设定下一个。如果没有设定任何参数,则不会重命名该接口 ###目前主流CentOS流都是这个命名方式 5.network service起来后会遍历/etc/sysconfig/network-scripts下的脚本,配置bond0、默认路由、其它网卡等 其中60 rule会调用rename_device根据ifcfg-xxx脚本来命名,rule 71调用biosdevname来命名网卡。以上规则数字越小优先级越高,高优先级生效后跳过低优先级 总的来说网卡命名规则:grub启动参数 -> /etc/udev/rules.d/的rule -> /usr/lib/udev/rule.d
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
系统网卡命名规则;/etc/udev/rules.d/70-persistent-net.rules ======================================================================== 系统网卡命名规则 默认安装网卡所在位置来命名(enp131s0 等),按位置命名实例如下: //name example ---默认方式,按照 /usr/lib/udev/rules.d/80-net-name-slot.rules 来命名 enp4s10f1 pci 0000:04:0a.1 | | | | | | | | | | | | domain <- 0000 | | | | | | | | | | en| | | --> ethernet | | | | | | | | | p4| | --> prefix/bus number (4) <-- 04 | | | | | | s10| --> slot/device number (10) <-- 10 | | | f1 --> function number (1) <-- 1 可以关掉这种按位置命名的方式,在grub参数中添加: net.ifnames=0 biosdevname=0,关闭后默认命名方式是eth**, 开启biosdevname=1后,默认网卡命名方式是p1p1/p1p2(麒麟默认开启;alios默认关闭,然后以eth来命名) -------------------------------------------------------------------------- 也可以添加命名规则在 /etc/udev/rules.d/ 下(这种优先级挺高),比如 cat /etc/udev/rules.d/70-persistent-net.rules # PCI device 21:00.0 (ixgbe) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="d4:5d:64:bb:06:32", PROGRAM="/lib/udev/rename_device", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" # PCI device 0x8086:0x105e (e1000e) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:59:9f:2d:48:2b", PROGRAM="/lib/udev/rename_device", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" 网卡重命名方式: /sbin/ip link set eth1 name eth123
https://plantegg.github.io/2021/01/01/%E7%BD%91%E7%BB%9C%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86/ 网络硬件相关知识
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
CentOS6.9修改网卡名称;centos7网卡修改为传统命名方式;网卡改名 =========================================================================================================================== CentOS6.9修改网卡名称 1.文件/etc/udev/rules.d/70-persistent-net.rules中NAME #此处为修改网卡名称 /etc/udev/rules.d/70-persistent-net.rules该文件可以删除,之后可以卸载、安装网卡驱动自动生成该文件 2.目录/etc/sysconfig/network-scripts/下有对应的ifcfg-NAME文件,同时文件内容的name需要与文件名相对应,例如:ifcfg-eth0 注意1:service NetworkManager stop#关闭该服务,该服务会影响网卡文件的加载;该服务其实就是linux桌面环境下桌面的网卡图标功能 注意2:配置完重载时,使用ifconfig -a,因为网卡可能不在工作,ifconfig不能正确地看到改名后的网卡 ------------------------------------------------------------------------------------------------------------------------------ CentOS6之前,网络接口使用连续号码命名,例如eth0、eth1 CentOS7使用基于硬件、设备拓扑、设置类型命名网卡,例如Firmware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,例如ens1 centos7网卡改名 步骤1、2:centos7网卡修改为传统命名方式(显示为ethx) 1.编辑/etc/default/grub文件, GRUB_CMDLINE_LINUX项增加内容"net.ifnames=0 biosdevname=0" 例如:GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0" 2.重新生成配置文件(根据步骤1生成新的配置文件) grub2-mkconfig -o /etc/grub2.cfg #该步骤生效,需要reboot重启系统 --------------- 步骤3:网卡改名 3.新增or修改/etc/udev/rules.d/70-persistent-net.rules的NAME 注入内容:SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:a6:f2:36", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1" #该步骤生效,需要reboot重启系统(本步骤才是真正的修改网卡名称) -------------- 步骤4、5:修改网卡配置 4.修改/etc/sysconfig/network-scripts/ifcfg-ethX文件名以及"DEVICE"名称(文件名其实也不用修改,"DEVICE"名称必须修改) 5.重启网络服务systemctl restart network(根据步骤5的配置启动网卡)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/etc/sysconfig/network-scripts/ifcfg-IFACE:修改IP、网关、DNS等配置 ============================================================================================================== 临时修改IP:参考命令ifconfig/ip addr 临时修改dns:修改文件/etc/resolv.conf ----------------------------------------------------------- centos6.9永久修改网卡获取IP地址方式、IP地址、MAC地址、DNS等配置 文件:/etc/sysconfig/network-scripts/ifcfg-IFACE (linux支持不同方式获取多个IP,但是dhcp获取ip的方式必须优先配置,例如ifcfg-eth0配置dhcp,ifcfg-eth0:1配置静态IP;若顺序相反则dhcp无效) TYPE=Ethernet #网卡类型 DEVICE=eth1 #网卡接口名称 ONBOOT=yes #系统启动时是否激活 yes|no BOOTPROTO=static #启用地址协议 –static:静态协议 –bootp:协议 –dhcp:协议 -none:不指定协议[最好指定] IPADDR=192.168.213.111 #网卡IP地址 NETMASK=255.255.255.0 #子网掩码 #PREFIXO0=24 #这个也是正确的子网掩码配置方式,但是不能与NETMASK同时存在 GATEWAY=192.168.213.2 #网卡网关地址 DNS1=218.108.243.2 #网卡DNS地址 BROADCAST=192.168.213.255 #网卡广播地址 NAME="System eth1" #这个就是个网络连接的名字,图形化界面时显示的网卡的名字 #HWADDR="00:0C:29:69:BB:BB"#HWADDR必须为网卡上的实际MAC MACADDR="00:0C:29:69:BB:BB"#网卡设备MAC地址,MACADDR是可以修改为任意MAC的 IPV6INIT="yes" #开启IPv6;相对应的为no,禁止IPV6 NM_CONTROLLED="yes" #network mamager的参数,是否可以由NNetwork Manager托管,建议CentOS6设置为no UUID="94897e8d-c8f8-45a5-866f-bc0fa9a50513" USERCTL #普通用户是否可控制此设备 PEERDNS #若选择dhcp获取IP,该选项为是否允许dhcp分配的DNS覆盖到/etc/resolv.conf文件中 centos7推荐使用nmcli进行修改,即时生效且同时修改文件/etc/sysconfig/network-scripts/ifcfg-IFACE 注意:在本地直接修改文件的话,需要使用nmcli进行reload;使用nmcli修改了方案接口不会直接生效,需要手工up;详见命令nmcli用法 nmcli connection modify homeEth0 con-name HomeEth0 #改名 nmcli connection modify HomeEth0 ipv4.addresses 192.168.1.77 ipv4.gateway 192.168.1.1 ipv4.dns 192.168.1.1 ipv4.method manual #静态IP nmcli connection modify HomeEth0 ip4 10.0.0.1 #并不是修改IP,而是新增了IP。。。 nmcli connection up HomeEth0 #注意:修改完不是直接生效的,需要重新up
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
固化静态路由;配置DNS;配置网关 --------------------------------------------------------------- 配置永久的静态路由 /etc/sysconfig/network-scripts/route-IFACE 例如:vi /etc/sysconfig/network-scripts/route-enp0s3 10.15.150.0/24 via 192.168.150.253 dev enp0s3 10.25.250.0/24 via 192.168.150.253 --------------------------------------------------------------- 配置DNS 方式1:修改文件/etc/resolv.conf #该文件即生效的DNS服务器IP,重启网络服务时,其他文件若修改DNS,则最终修改了该文件 方式2:修改文件/etc/sysconfig/network-scripts/ifcfg-eth0 (该文件优先级高于/etc/resolv.conf) --------------------------------------------------------------- 配置网关: 方式1:修改文件/etc/sysconfig/network 方式2:修改文件/etc/sysconfig/network-scripts/ifcfg-eth0 (该文件优先级高于/etc/sysconfig/network)
11111111111111111111111