首页 > 编程知识 正文

linux系统界面,linux重命名网卡

时间:2023-05-05 14:16:10 阅读:46423 作者:856

本文参考了网上的许多资料进行总结,这里只是为了便于学习和记忆,没有其他目的。 如果有侵犯版权的情况,请尽快联系我。

udev介绍udev是Linux kernel2.6系列中新添加的设备文件管理模块。 其功能主要是动态管理设备文件的添加、删除等操作。 驱动程序检测到新插入的设备后,将在sysfs中注册新数据(与此设备相关的信息文件)。 内核将设备的uevent发送到udev,并在接收到udev时访问配置规则。 然后根据配置规则执行相应的操作,如创建和装载设备文件所属的组、组、权限和链接文件。 设备被拔出后,udev仍将接收内核发送的uevent事件,udev将根据uevnet规则执行删除、卸载设备文件、删除链接文件等操作。这样就能很好的动态地管理设备文件,可以支持设备的热插拔。而无需预先在/dev目录下创建一大堆的静态设备文件

除了上述动态管理设备文件之外,udev的另一个亮点是在用户空间中运行,并且可以根据客户定制的规则执行相应的操作。 例如,设备有多个USB接口,其中有两个USB接口指针。 同时连接到设备时,将在/dev/目录下生成两个设备文件,例如/dev/sda和/dev/sdb。 那么他们的应对关系如何呢? sda支持打印机1还是打印机2? 与客户的操作相关,如插入的优先顺序和中途设备相关机构的状况等。 这无法由以前的静态设备文件管理和devfs处理。 只需简单地更改udev规则,即可实现一对一映射。 例如,基于设备序列号、厂商id等创建设备文件链接printer1和printer2。 只要插入打印机1就会生成链接文件printer1,所以不再需要插入计时器设备的优先顺序等限制。 由于udev是在用户空间中运行的模块,因此内核仍然会生成sda、sdab等设备文件。

udev的工作原理: Linux 2.6版引入了sysfs文件系统。 sysfs将连接到系统的设备和总线组织为一个分层文件,以提供对用户空间的访问。udev运行在用户模式,而非内核中udev初始化脚本在系统启动时创建设备节点,如果检测到新设备,它将在sysfs上生成一系列文件,udev将创建新的设备节点。udev必须需要内核中的sysfs和tmpfs支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间下图是udev的工作流程图,配置文件存储在/etc/udev/udev.conf文件中。

为什么要使用udev,是因为以前使用的设备文件管理方法(静态文件和devfs )有一些缺陷。

未知的设备映射。 从设备文件到实际设备的映射不可靠,尤其是在动态设备(如USB设备)中。 举个例子吧。 如果有两个USB打印机。 一个称为/dev/usb/lp0,另一个称为/dev/usb/lp1。 但是,哪个是哪个还不清楚。 lp0、lp1和实际设备不一一对应。 因为他可能因为找到设备的顺序、打印机本身已关闭等原因而无法确定此映射。 理想情况下,两台打印机必须使用基于序列号或其他标识的唯一设备文件进行映射。 但是,静态文件和devfs都无法实现这一点。 主/次设备编号不够。 我们知道每个设备文件都有两个8位数字。 一个按主设备编号分配,另一个按从设备编号分配。 这两个8位数字和设备类型(块设备或字符设备)唯一标识设备。 不幸的是,把这些身边的数字联系起来是不够的。 /dev目录中文件太多。 如果系统采用静态设备文件相关方式,则此目录下的文件必然足够多。 我不知道这些设备文件在系统上是否处于活动状态。 命名灵活性不够。 devfs解决了以前的一些问题,但本身带来了一些问题。 一是命名不灵活。不要认为很容易修改设备文件的名称。 缺省的devfs命令机制本身也很奇怪,需要修改大量的配置文件和程序。 内核存储器的使用,devfs特有的另一个问题是,作为内核驱动模块,devfs需要消耗大量的存储器。 特别是在系统中有大量设备的情况下(例如,在上述系统中的一个系统上有数千张盘的情况下),udev的目标是解决上述问题,并且使用用户空间工具来管理/dev/目录树了解如何自定义自己的系统,包括创建设备字符连接、更改设备文件所属的组和权限。

udev规则如上所述,udev根据用户规则执行相关操作。 那么,这些规则文件放在哪里,有什么规则? 其中关于规则的部分,本文只说明共同的东西。 详情请查看man udev文档。

的主要udev配置文件为**/etc/udev/udev.conf**。 该文件通常很短,常见的是下图。 其中udev_root指定存储设备文件的根目录,udev_rules指定规则的存储路径,udev_log指定记录日志的级别。 其他一些配置不在此说明,例如存储在日志中的数据库。

udev _ root='/dev/' udev_rules='/etc/udev/rules.d/' udev _ log=' err '规则文件由udev _ rules指定

的先后顺序是安装ASCII码来进行的。如找到了比配的规则,则暂停匹配,不在去匹配后续的规则文件。所以自定义的规则文件基本上都是以数字开头,这样提高了规则文件的优先级。下图是简单的规则文件规则文件以行为单位,一行就是一条规则

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sxsdsy/modprobe sg"

在规则文件中,规则是由一系列的键值对组成,键值对以逗号分隔。键值对分为匹配键和赋值键。匹配键用来指定匹配规则,而赋值键则用来进行赋值的,赋值键可以处理一个多值列表。

udev规则所有操作符 “==”:  比较键、值,若等于,则该条件满足;“!=”:   比较键、值,若不等于,则该条件满足;“=”:    对一个键赋值;“+=”:  为一个表示多个条目的键赋值。“:=”:  对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。 udev规则的匹配键 ACTION:           事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。KERNEL:          内核设备名称,例如:sda, cdrom。DEVPATH:        设备的 devpath 路径。SUBSYSTEM:        设备的子系统名称,例如:sda 的子系统为 block。BUS:            设备在 devpath 里的总线名称,例如:usb。DRIVER:           设备在 devpath 里的设备驱动名称,例如:ide-cdrom。ID:             设备在 devpath 里的识别号。SYSFS{filename}:      设备的 devpath 路径下,设备的属性文件“filename”里的内容。例如:SYSFS{model}==“ST936701SS”表示:如果设备的型号为 ST936701SS,则该设备匹配该匹配键。ENV{key}:          环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。PROGRAM:        调用外部命令。RESULT:          外部命令 PROGRAM 的返回结果。 udev的重要赋值键 NAME:  在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。SYMLINK:  为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。OWNER, GROUP, MODE:  为设备设定权限。ENV{key}:         导入一个环境变量。 udev的值和可调用的替换操作符 $kernel, %k:        设备的内核设备名称,例如:sda、cdrom。$number, %n:        设备的内核号码,例如:sda3 的内核号码是 3。$devpath, %p:       设备的 devpath路径。$id, %b:          设备在 devpath里的 ID 号。$sysfs{file}, %s{file}:   设备的 sysfs里 file 的内容。其实就是设备的属性值。$env{key}, %E{key}:    一个环境变量的值。$major, %M:        设备的 major 号。$minor %m:        设备的 minor 号。$result, %c:        PROGRAM 返回的结果。$parent, %P:       父设备的设备文件名。$root, %r:         udev_root的值,默认是 /dev/。$tempnode, %N:      临时设备名。%%:            符号 % 本身。$$:             符号 $ 本身。

下图的规则是根据扫描仪的IDvendor 和IDproduct来生产指定的链接名,每次打开扫描仪后其链接都是固定的,所以能很好的确定映射关系。

SYSFS{idVendor}=="0686",SYSFS{idProduct}=="400e", SYMLINK+="scanner", MODE="0664", group="scanner"

在修改规则后要是规则生效,我们可以插拔我们的设备产生一个事件或在设备中的event文件增加信息以达到发送事件的目的来更新我们的udev规则。更加方便的方法是运行下列命令

udevadm test /sys/class/block/sdc4 udevinfo -q path -n /dev/sda 这个命令会产生一个该设备名对应的在sysfs下的路径udevinfo -a -p /sys/block/sda 这个命令会显示一堆信息,这些信息实际来自于操作系统维护的sysfs链表。 udev移植

从udev下载网址可以下载到udev的源码。下面为移植步骤。

下载udev源码包,并解压修改Makefile中的CROSS交叉编译工具为自己开发板的编译器执行make进行编译。然后执行strip udev uded udevstart udevinfo udevtest。并将这些文件拷贝到rootfs/xsdsy目录下。添加对udev的支持,修改/etc/init.d/rcS脚本,添加如下命令: /xsdsy/mount -t sysfs sysfs /sys/xsdsy/mount -t tmpfs tmpfs /dev/xsdsy/udevd --deamon/xsdsy/udevstart 在/etc下创建目录udev在/etc/udev下创建rules.d和文件udev.conf,udev.conf内容如下: # udev.conf # The initial syslog(3) priority: 'err', 'info', 'debug' or its # numerical equivalent. For runtime debugging, the daemons internal # state can be changed with: 'udevcontrol log_priority='. udev_root="/dev/" udev_rules="/etc/udev/rules.d" udev_log="err" 在rules.d目录中创建自己的规则文件。文件必须使用.rules后缀。
由于udev需要sysfs的支持以及tmpfs的支持,所以在启动udev前需要先挂载这两个目录。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。