当前位置: 首页 > 科技观察

在Linux上使用systemd-udevd管理连接的硬件

时间:2023-03-14 23:20:11 科技观察

Linux在自动识别、加载和公开来自无数供应商的硬件设备方面做得非常出色。事实上,正是这个特性在很多年前就说服了我坚持让我的雇主将其整个基础设施转换为Linux。痛点是Re??dmond的一家公司(LCTT翻译注解:指Microsoft)无法在我们的Compaq台式机上加载集成网卡的驱动,Linux可以轻松实现。从那以后,Linux的识别设备库随着过程的复杂性而增长,而udev是解决这个问题的一个有希望的解决方案。udev负责监听Linux内核发送的事件来改变设备的状态。它可能是插入或拔出的新USB设备,或者是无线鼠标在浸入打翻的咖啡后离线。udev处理所有状态更改,例如分配名称和权限以用于访问设备。这些更改的记录可以通过dmesg获得。由于dmesg的输出通常是几千行,过滤结果通常是明智的。以下示例说明了Linux如何识别我的WiFi接口。此示例显示了我的无线设备使用的芯片组(ath9k)、在启动过程早期分配的原始名称(wlan0)以及正在使用的臭味长永久名称(wlxec086b1ef0b3):$dmesg|grepwlan[5.396874]ath9k_htc1-3:1.0wlxec086b1ef0b3:renamedfromwlan0在本文中,我讨论了为什么有人想要使用这样的名称。在此过程中,我将探索udev配置文件的结构,然后展示如何更改udev的设置,包括编辑系统命名设备的方式。本文档基于我的新课程中《Linux 系统优化》的一个模块。了解udev配置系统在使用systemd的机器上,udev操作由systemd-udevd守护进程管理,您可以使用systemctlstatussystemd-udevd以正常的systemd方式检查udev守护进程的状态。严格来说,udev的工作原理是尝试将它接收到的每个系统事件与/lib/udev/rules.d/和/etc/udev/rules.d/目录中的规则集相匹配。规则文件包括匹配键和分配键,可用的匹配键包括操作、名称和子系统。这意味着如果检测到属于子系统的具有特定名称的设备,则会将默认配置分配给该设备。接下来,“分配”键值对用于应用所需的配置。例如,您可以为设备分配一个新名称,将其与文件系统中的符号链接相关联,或者将访问权限限制为仅特定所有者或组。这是从我的工作站中提取的规则:$cat/lib/udev/rules.d/73-usb-net-by-mac.rules#UseMACbasednamesfornetworkinterfaceswhoharedirectlyorindirectly#onUSBandhaveanuniversallyadministered(stable)MACAddress(secondbit#is0).Don'tdothiswhenifnamesisdisabledviakernelcommandlineor#customizing/disabling99-default.link(orpreviously80-net-setup-link.rules).IMPORT{cmdline}="net.ifnames"ENV{net.ifnames}=="0",GOTO="usb_net_by_mac_end"ACTION=="添加",SUBSYSTEM=="net",SUBSYSTEMS=="usb",NAME=="",\ATTR{address}=="?[014589cd]:*",\TEST!="/etc/udev/rules.d/80-net-setup-link.rules",\TEST!="/etc/systemd/network/99-default.link",\IMPORT{builtin}="net_id",NAME="$env{ID_NET_NAME_MAC}"addaction告诉udev只要新插入的设备属于网络子系统并且是USB设备就执行操作。另外,如果我理解正确的话,只有当设备的MAC地址由一定范围内的字符组成并且80-net-setup-link.rules和99-default.link文件不存在时,这些规则才会起作用。假设满足所有条件,接口ID将更改以匹配设备的MAC地址。还记得之前显示我的接口名称已从wlan0更改为讨厌的wlxec086b1ef0b3的dmesg消息吗?这都归功于这条规则。我怎么知道?因为ec:08:6b:1e:f0:b3是设备的MAC地址(没有冒号)。$ifconfig-awlxec086b1ef0b3:flags=4163MTU1500INET192.168.0.0.103NETMASK255.255.255.255.0BROADCAST192.168.0.0.0.0.255555INET6FEENTERf0:b3txqueuelen1000(Ethernet)RXpackets682098bytes714517869(714.5MB)RXerrors0dropped0overruns0frame0TXpackets472448bytes201773965(201.7MB)TXerrors0dropped0overruns0carrier0collisions0ev默认情况下,我不需要在Linux中编写自己的规则。但为什么要费心这样的命名——尤其是在看到使用这样的接口命名有多么困难之后?仔细查看规则中包含的注释:对直接或间接插入USB的网络接口使用基于MAC的名称,并使用常用(稳定)的MAC地址(第二位为0)。当通过内核命令行或自定义/禁用99-default.link(或之前的80-net-setup-link.rules)禁用ifnames时,请勿执行此操作。请注意,此规则是为基于USB的网络接口设计的。与PCI网络接口卡(NIC)不同,USB设备可能会不时被移除或更换,这意味着它们的ID不能保证保持不变。该ID可能有一天是wlan0,第二天可能是wlan3。为避免混淆应用程序,请为设备分配绝对ID——例如分配给我的USB接口的ID。操纵udev的设置在下一个示例中,我将从VirtualBox虚拟机获取以太网接口的MAC地址和当前接口ID,并使用此信息创建一个新的udev规则来更改接口ID。为什么?也许我要从命令行操作设备,但必须输入那么长的名称很烦人。这是它的工作原理。在更改接口ID之前,我需要关闭Netplan当前的网络配置并强制Linux使用新配置。这是/etc/netplan/目录中我当前的网络接口配置文件:$less/etc/netplan/50-cloud-init.yaml#Thisfileisgeneratedfrominformationprovidedby#thedatasource.Changestoitwillnotpersistacrossaninstance.#Todisablecloud-init'snetworkconfigurationcapabilities,writeafile#/etc/cloud/cloud.cfg.d/99-disable-network-config.cfgwiththefollowing:#network:{config:disabled}network:ethernets:enp0s3:addresses:[]dhcp4:trueversion:250-cloud-init.yaml文件包含一个非常基本的接口定义,但注释也包含一些禁用配置的重要信息。为此,我将移动到/etc/cloud/cloud.cfg.d目录,创建一个名为/etc/cloud/cloud.cfg.d的新文件,插入network:{config:disabled}字符串。虽然我只在Ubuntu发行版上测试了这种方法,但它应该适用于任何带有systemd的Linux(几乎所有Linux发行版都有systemd)。无论您使用哪种,编写udev配置文件并测试它们都是一个好主意。接下来,我需要收集一些系统信息。执行ip命令显示我的以太网接口名为enp0s3,MAC地址为08:00:27:1d:28:10。$ipa2:enp0s3:mtu1500qdiscfq_codelstateUPgroupdefaultqlen1000link/ether08:00:27:1d:28:10brdff:ff:ff:ff:ff:ffinet192.168.0.115/24brd192.168.0ynscobbd5nowengl.25在/etc/udev/rules.d目录中创建一个名为persistent-net.rules的新文件。我会给文件起一个以小数字开头的名称,比如10:$cat/etc/udev/rules.d/10-persistent-network.rulesACTION="add",SUBSYSTEM="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"数字越小,Linux越早执行该文件。我想让这个文件早点执行。添加文件后,其中包含的代码会将名称eth3分配给网络设备——只要设备地址与08:00:27:1d:28:10匹配,即我的接口的MAC地址。保存文件并重新启动计算机后,我的新接口名称应该生效。我可能需要直接登录到VM并使用dhclient手动要求Linux为这个新命名的网络请求一个IP地址。在执行以下命令之前,可能无法打开SSH会话:$sudodhclienteth3大功告成。现在您可以强制udev控制计算机以您想要的方式指向网卡,但更重要的是,您拥有了确定如何管理任何行为不当设备的工具。