Centos内核态启动并加载网卡的逻辑;用户态命名网卡流程;ifcfg-IFACE文件

 

内核态启动并加载网卡的逻辑
========================================================================================================================
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里面,从而加快网卡驱动的加载。
内核态启动并加载网卡的逻辑
用户态命名网卡流程
==============================================================================================================
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=13./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
用户态命名网卡流程
系统网卡命名规则;/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
系统网卡命名规则;/etc/udev/rules.d/70-persistent-net.rules

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/ 网络硬件相关知识

 

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的配置启动网卡)
CentOS6.9修改网卡名称;centos7网卡修改为传统命名方式;网卡改名

 

 

/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
/etc/sysconfig/network-scripts/ifcfg-IFACE:修改IP、网关、DNS等配置

 

固化静态路由;配置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)
固化静态路由;配置DNS;配置网关

 

 

 

 

 

 

 

 

 

 

11111111111111111111111

posted @ 2022-07-17 09:24  雲淡風輕333  阅读(308)  评论(0编辑  收藏  举报