udev是一种动态设备管理系统,用于在Linux系统中自动管理设备的插拔、识别、配置等操作。它的主要作用是监视系统中的设备事件,并根据设备事件动态地创建、删除或修改系统中的设备节点。
udev的工作原理是通过读取系统中的硬件信息、驱动程序和设备特征信息等,来自动识别和配置设备。当系统中添加或删除设备时,udev会根据设备事件的类型和属性信息来自动更新系统中的设备节点,并自动加载或卸载相应的驱动程序。
udev的主要优点包括:
简化了Linux系统中的设备管理操作,提高了用户的使用体验;
支持动态设备管理,可以在系统运行时自动识别和配置设备,减少了系统管理员的工作量;
支持规则编写,可以为不同类型的设备自动分配名称和特定的配置信息,提高了系统的可维护性和可靠性;
支持自定义脚本,可以通过编写自定义的脚本来对设备进行更加灵活的配置和管理。
在Linux系统中,udev通常作为系统中其他组件(如systemd、HAL等)的底层服务来使用。
/etc/udev/rules.d/70-persistent-net.rules 是一个udev规则文件,它被用来在Linux系统中为网卡设备定义持久的、可预测的名称。该文件是由udev守护进程自动生成并维护的。
在Linux系统中,由于网络接口的名称可能因硬件变化或系统配置的变化而发生变化,这可能会导致系统启动时网卡的名称发生不确定性。为了解决这个问题,udev会在系统启动时检测系统的网络接口并将其匹配到已知的网卡设备名称中。
/etc/udev/rules.d/70-persistent-net.rules 文件包含了每个网卡设备的一些属性信息,例如设备的MAC地址、总线信息、驱动程序等。当udev检测到一个新的网卡设备时,它会根据这些属性信息将其匹配到一个已知的网卡设备名称上,并将该匹配信息写入到/etc/udev/rules.d/70-persistent-net.rules 文件中。
这样,在系统下次启动时,udev将使用该文件中的信息为每个网卡设备分配一个持久的、可预测的名称,从而避免了网络接口名称的不确定性。
当插入新的网络设备时,内核首先识别到,随后在sysfs文件系统(一般挂载在/sys下)中生成该设备对应的信息文件。然后内核通知udev的后台守护进程udevd(若不知道它是什么东西,请认为它是Windows系统中的设备管理器,管理和监视硬件设备),udevd将读取sysfs中对应设备的相关信息,并比对或生成udev的规则集,能匹配上的则做对应的操作。对于网卡来说,CentOS 6上它的的规则集文件默认为/etc/udev/rules.d/70-persistent-net.rules,匹配该规则集成功后,最后还在/sys/class/net目录中生成对应的设备子目录。
1、文件示例
[root@xuexi ~]# cat /etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:a4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:7f:cf:ae", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
2、手动生成 70-persistent-net.rules
export MATCHADDR=“00:f1:f3:1a:f0:05” eth0网卡的mac地址,一定要小写
export INTERFACE=eth0 eth0网卡名称
/lib/udev/write_net_rules
此时会生成70-persistent-net.rules文件,内容如下
SUBSYSTEM==“net”, ACTION==“add”, DRIVERS==“?", ATTR{address}“00:f1:f3:1a:f0:05”, KERNEL"eth”, NAME=“eth0”
/etc/udev/rules.d/70-persistent-net.rules 和 /etc/udev/rules.d/50-persistent-net.rules 都是udev规则文件,用于在Linux系统中为网卡设备定义持久的、可预测的名称。它们的区别在于生成规则的版本和优先级。
在较早的Linux发行版中,如RHEL 6或CentOS 6,/etc/udev/rules.d/50-persistent-net.rules 文件用于存储网络接口的规则信息,该文件的生成规则是基于网卡的MAC地址进行匹配的。在新的Linux发行版中,如RHEL 7或CentOS 7,/etc/udev/rules.d/70-persistent-net.rules 文件取代了/etc/udev/rules.d/50-persistent-net.rules,其生成规则与旧版相同。
在新版Linux系统中,/etc/udev/rules.d/70-persistent-net.rules 文件具有更高的优先级,因此它将覆盖旧版的/etc/udev/rules.d/50-persistent-net.rules 文件。如果两个文件中都存在相同的规则,则系统将使用/etc/udev/rules.d/70-persistent-net.rules 文件中的规则。
需要注意的是,如果将一个使用了旧版规则的系统升级到新版,则该系统可能会同时包含/etc/udev/rules.d/50-persistent-net.rules 和/etc/udev/rules.d/70-persistent-net.rules 两个文件。在这种情况下,系统会优先使用/etc/udev/rules.d/70-persistent-net.rules 文件中的规则。如果你需要手动编辑这些规则文件,请务必备份原文件,以免意外破坏系统。
如何实现网卡按插槽地址排序
在Linux系统中,可以通过配置udev规则来实现网卡按插槽地址排序的功能。
具体步骤如下:
确定网卡对应的PCI插槽地址。可以使用lspci命令查看系统中的PCI设备信息,其中包含了每个设备对应的插槽地址。
编写udev规则文件,命名为/etc/udev/rules.d/70-persistent-net.rules。可以使用SUBSYSTEM、DRIVER和KERNELS等属性描述符来过滤需要操作的网卡设备。使用ATTR{address}属性描述符来匹配网卡的MAC地址,并使用NAME属性描述符来为网卡设备指定名称。
在规则文件中,可以使用SYMLINK属性描述符来为网卡设备创建符号链接。使用符号链接可以为设备创建更加友好的名称,例如eth0、eth1等。
在规则文件中,可以使用KERNEL=="eth*"等模式匹配符来匹配以"eth"开头的网卡设备,并根据PCI插槽地址的顺序为网卡设备命名,以实现按照PCI插槽地址排序的功能。
例如,一个实现网卡按插槽地址排序的udev规则文件可能如下所示:
# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", KERNELS=="0000:01:00.0", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", KERNELS=="0000:02:00.0", NAME="eth1"
在以上规则文件中,两个网卡设备分别命名为eth0和eth1,并按照PCI插槽地址的顺序排列。如果需要为这两个网卡设备创建符号链接,可以在规则文件中添加如下条目:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:11:22:33:44:55", KERNELS=="0000:01:00.0", NAME="eth0", SYMLINK+="net0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", KERNELS=="0000:02:00.0", NAME="eth1", SYMLINK+="net1"
这样,在系统中就会同时存在eth0、eth1和net0、net1两个名称,用户可以根据自己的需要进行选择和使用。
suse 手册,数字越小优先级越高
https://documentation.suse.com/zh-cn/sles/12-SP5/html/SLES-all/cha-udev.html
udev手册:http://www.jinbuguo.com/systemd/udev.html#
网卡命名
在Linux系统中,网卡设备的命名方式有两种:传统的命名方式和新的预测性命名方式。
传统的命名方式使用网卡接口的硬件名称(如eth0、eth1等)来标识每个网卡设备。这种方式基于网卡设备的物理接口名称,因此对于拥有多个网卡设备的系统,可能会出现重复的命名,或者无法预测的命名。
新的预测性命名方式(Predictable Network Interface Names)则使用一种基于设备属性的算法来命名网卡设备。这种方式可以根据网卡设备的属性,例如PCIe插槽地址、MAC地址等来进行命名,从而避免了传统命名方式中可能出现的重名问题。新的预测性命名方式也更加可读性强,易于管理。
新的预测性命名方式下,网卡设备的命名规则可以使用以下两种方式之一:
使用enpXsY命名方式:其中X是PCIe插槽地址,Y是网卡接口的名字(如a、b、c等)。例如,enp1s0f0表示PCIe插槽地址为1的第一个网卡接口。
使用自定义名称:可以通过修改udev规则来指定网卡设备的名称。例如,可以创建一个名为/etc/udev/rules.d/10-network.rules的udev规则文件,内容如下:
ACTION==“add”, SUBSYSTEM==“net”, DRIVERS==“?*”, ATTR{address}==“00:11:22:33:44:55”, NAME=“mydevice”
上述规则将根据网卡设备的MAC地址(00:11:22:33:44:55)将其命名为mydevice。可以根据实际需求修改属性值以及自定义的名称。
在Linux系统中,网卡的命名遵循一定的规则,通常是通过规则文件实现的。
在早期版本的Linux系统中,网卡的命名方式是根据网卡的驱动名称来命名的,例如eth0、eth1、wlan0等。这种命名方式存在一些问题,例如当系统引入新的驱动程序时,会导致网卡名称的变化,从而影响到系统的配置和管理。
因此,自从Linux 2.6.25内核版本开始,引入了一种新的网卡命名方式,即根据网卡的MAC地址或PCIe插槽地址进行命名。这种命名方式使用较长的名称,如enp0s3、eno1等,使得网卡名称更加稳定,易于管理和配置。
具体来说,网卡的命名规则如下:
如果存在固定的命名规则,即在/etc/udev/rules.d/目录下已经存在对应的规则文件,那么系统会根据规则文件中的命名规则进行命名。
如果没有规则文件,则系统会按照以下顺序进行命名:
基于PCIe插槽地址进行命名,形如enp0s3、eno1等。
基于MAC地址进行命名,形如ens33、enp2s0等。
基于驱动名称进行命名,形如eth0、wlan0等。
总之,Linux系统中的网卡命名是一个动态的过程,系统会根据规则文件或者一定的规则对网卡进行命名,以确保网卡名称稳定、易于管理和配置。
可以通过PCIe插槽地址实现网卡的命名,具体实现步骤如下:
找到每个网卡设备的PCIe插槽地址。可以使用以下命令查询:
readlink /sys/class/net/<interface>/device
其中,是网卡设备的名称,如enp0s3、eth0等。
例如,对于enp0s3网卡设备,可以使用以下命令查询PCIe插槽地址:
readlink /sys/class/net/enp0s3/device
../../../0000:00:03.0
上述输出中,0000:00:03.0就是该网卡设备所在的PCIe插槽地址。
编写udev规则文件。在/etc/udev/rules.d/目录下创建一个规则文件,例如70-persistent-net.rules,写入以下规则:
ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="pci", KERNELS=="0000:00:03.0", NAME="eth0"
其中,KERNELS属性指定了PCIe插槽地址,NAME属性指定了命名规则。
上述规则中,eth0是网卡设备的新名称。如果有多个网卡设备,可以分别编写对应的规则。
重启系统或重新加载udev规则。
$ sudo udevadm control --reload
$ sudo udevadm trigger
重新加载udev规则后,系统会根据规则对网卡设备进行重新命名,以使其按照PCIe插槽地址排序。
网卡名称命名原理和修改方法 https://blog.csdn.net/jerryleon007/article/details/123401643