1.综述
本文简单介绍udev机制,并编写udev规则,实现手机即U盘自动挂载
2.udev介绍
udev 是 Linux2.6 内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行,通过帧听内核发出来的 uevent 来管理 /dev 目录下的设备文件。不像之前的设备管理工具,udev 在用户空间(User space)运行,而不在内核空间(kernel space)运行。
udev工作流程图:
3.规则文件
规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rule.d/ 下。所有的规则文件必须以".rules" 为后缀名。
下面是一个简单的规则:
KERNEL=="sda", NAME="my_root_disk", MODE="0660"
KERNEL 是匹配键,NAME 和 MODE 是赋值键。这条规则的意思是:如果有一个设备的内核名称为
sda,则该条件生效,执行后面的赋值:在 /dev 下产生一个名为my_root_disk 的设备文件,并把设备
文件的权限设为 0660。
3.1 udev 规则的所有操作符:
"==" :比较键、值,若等于,则该条件满足;
"!=":比较键、值,若不等于,则该条件满足;
"=":对一个键赋值;
"+=":为一个表示多个条目的键赋值;
":=":对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。
3.2 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" 里的内容;
ENV{key}:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键; PROGRAM:调用外部命令;
RESULT:外部命令 PROGRAM 的返回结果。
4.udev 规则文件编写应用举例
4.1 手机接入的规则文件编写
(1)接入手机后,将手机的模式设置为开发者模式,并通过键入dmesg查看设备信息:
或者通过:
udevadm info --attribute-walk --name=/dev/设备名字
指令查看设备的具体信息
这里手机设备一般在/dev/bus/usb/001/中
这里我的设备为025:
故通过键入:
udevadm info --attribute-walk --name=/dev/bus/usb/001/025
查看插入设备的具体信息:
(2)配置.rules文件
将路径切换至 /etc/udev/rules.d 路径中,键入:
sudo vi 51-android.rules
编写规则文件:
UBSYSTEM=="usb", ATTR{idVendor}=="2d95",ATTR{dProduct}=="6013", MODE="0666"
这里的键值对选用ATTR{idVendor}和ATTR{dProduct},可以在前面获得的信息中选择相应键值对。
(3)运行结果
编写完.rules文件后,插入手机便可使用adb指令连接手机:
4.2 usb自动挂载的规则文件编写
(1)插入U盘后,可通过同样的方法查看U盘设备信息
这里U盘设备的路径有所不同为:
/dev/sdb1
udevadm info --attribute-walk --name=/dev/sdb1
查看信息:
(2)根据信息在/etc/udev/rules.d 中创建.rules文件:并编写以下规则实现u盘自动挂载:
sudo vi usbblock.rules
ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", RUN{program}+="/bin/mkdir /media/%k" ,RUN{program}+="/usr/bin/systemd-mount --no-block --collect $devnode /media/%k"
(3)运行结果
编写完之后通过tree /media
查看U盘内容
【补充】若没有编写.rules文件,需要用到mount命令挂载U盘:
sudo mount /dev/sdb1 /mnt/
将U盘挂载到/mnt目录下才可以显示