编写udev规则

4案例4:编写udev规则

4.1问题

编写udev规则,实现以下目标:

  1. 当插入一个U盘时,该U盘自动出现一个链接称为udisk
  2. U盘上的第一个分区名称为udisk1,以此类推
  3. 终端上出现提示信息“udisk plugged in”

4.2方案

问题:加载一个USB设备后,系统可能识别为sda也可能是识别为sdb,能不能固定呢?

对于Linux kernel 2.6及更新的操作系统版本会将设备的相关信息动态写入/sys文件系统中,而udev程序可以通过读取这些设备信息,并根据自己的udev规则进行设备管理器,实现如下功能:

  • 处理设备名
  • 决定要创建哪些设备文件或链接
  • 决定如何设置属性
  • 决定触发哪些事件

udev默认规则存放在/etc/udev/rules.d目录下,通过修改次目录下的规则实现设备的命名,属性、链接文件等。

4.3步骤

实现此案例需要按照如下步骤进行。

步骤一:编写udev规则

准备usb设备(如果使用真机演示,下面为虚拟机添加USB设备可以忽略)

使用virt-manager为虚拟机添加USB设备,如图所示。注意添加设备时一定要选择正确的USB设备,图示仅仅是参考案例,每个人的USB品牌与型号都有可能不一样!

1)查看设备属性

加载USB设备的同时实时查看设备的相关属性,可以使用monitor指令。

[root@proxy ~]# udevadm monitor --property

如果设备已经加载则无法使用monitor查看相关属性。可以使用下面的命令查看设备属性。

[root@proxy ~]# udevadm info --query=path --name=/dev/sda
[root@proxy ~]# udevadm info --query=property --path=/block/sda

单独查看某个磁盘分区的属性信息

[root@proxy ~]# udevadm info --query=property --path=/block/sda1

2)编写udev规则文件(实现插拔USB设备时有屏幕信息)

注意:修改规则文件不能照抄,这里的变量都是根据实际情况而修改的!!!

每个设备的属性都有所不同!!!一定要根据前面查询的info信息填写。

[root@proxy ~]# vim  /etc/udev/rules.d/70-usb.rules
SUBSYSTEMS=="usb",ENV{ID_VENDOR}=="TOSHIBA",ENV{serial}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/wall udisk plugged in"

在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功

拍错方法:通过查看/var/log/messages日志文件排错

3)继续修改规则文件(实现分区命名)

[root@proxy ~]# udevadm info --query=property --path=/block/sdb/sdb1
[root@proxy ~]# /etc/udev/rules.d/70-usb.rules
ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{DEVTYPE}=="partition",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",SYMLINK="usb%n"

 在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功

4)继续修改规则文件(修改设备所有者和权限)

[root@proxy ~]# /etc/udev/rules.d/70-usb.rules
ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{DEVTYPE}=="partition",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",SYMLINK="usb%n",OWNER="root",GROUP="root",MODE="0644"

在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功

5)继续修改规则文件(插拔U盘等于启停服务)

注意:启动服务的程序systemctl,必须使用绝对路径

[root@proxy ~]# /etc/udev/rules.d/70-usb.rules
ACTION=="add",ENV{ID_VENDOR}=="TOSHIBA",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/systemctl start httpd"
ACTION=="remove",ENV{ID_VENDOR}=="TOSHIBA",ENV{ID_SERIAL_SHORT}=="60A44CB4665EEE4133500001",RUN+="/usr/bin/systemctl stop httpd" 

 在virt-manager中删除、添加USB设备,测试自己的udev规则是否成功

总结知识点:

udev规则文件,常见指令操作符如表所示。

udev常用替代变量:

  • %k:内核所识别出来的设备名,如sdb1
  • %n:设备的内核编号,如sda3中的3
  • %p:设备路径,如/sys/block/sdb/sdb1

 

 

 

 

 

udev规则是Linux系统中用于管理设备文件的一种机制,它允许管理员根据设备的属性定制设备文件的行为。编写udev规则需要对Linux系统中的udev规则语法有所了解,同时要对打印机设备的识别信息有一定的认识。 打印机的udev规则通常涉及特定的设备属性,例如设备的制造商ID、产品ID、序列号或者设备的总线类型等。下面是一个简单的打印机udev规则编写示例: 1. 首先,需要确定打印机的设备信息,这可以通过`lsusb`(对于USB设备)或者`lspci`(对于PCI设备)等命令获得。 2. 确定设备信息后,创建一个新的udev规则文件,一般位于`/etc/udev/rules.d/`目录下。例如,创建一个名为`80-printer.rules`的文件。 3. 在这个文件中,编写规则来匹配打印机的特定属性,并设置相应的设备文件权限和所有权。以下是一个基本的udev规则示例: ``` ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE:="0666", GROUP:="lp" ``` 这条规则的意思是当匹配到USB子系统中,且设备的制造商ID为`1234`,产品ID为`5678`时,将设备文件的权限设置为`0666`,并将其所有者组设置为`lp`(Linux系统中的打印守护进程组)。 4. 保存规则文件,并给其适当的权限,通常是644。 5. 重新加载udev规则或重启udev服务以应用新规则。 6. 插入打印机或重新连接USB设备,udev会根据规则自动创建设备文件,并应用指定的权限和所有权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值