原创文章,转载请注明出处,谢谢!
作者:清林,博客名: 飞 空静渡
udev的规则的编写,我这里就不说了,大家可以在udev的文档中可以了解,有时间的话我在安排一章在说明udev 的规则了。
下面是我要做的一个测试,我的系统是ubuntu9.10,我有一个usb优盘,是kinston的4G的优盘。
运行:
sudo fdisk -l
看下我的优盘的情况,如下图:
大家可以看到,我的usb设备是sdc,里面有一个分区是sdc4。
运行 ls /dev -l可以看到我的usb的优盘的设备有sdc和sdc4。
这里说说udev的规则,用户自定义的规则一般放在/etc/udev/rules.d目录下,里面有很多规则都是以数字开头的,数字越小就表示规则越优先。
我的/etc/udev/rules.d目录下有这几个规则文件:
10-vboxdrv.rules 70-persistent-cd.rules 70-persistent-net.rules README
一般,我们可以在这个目录里新建一个规则文件作为我们自己使用的规则文件:10-local.rules,如果有这个文件就不用建了。
现在我所要做的就是在/dev 目录下更改我的usb 优盘的设备名,就是说由/dev/sdc4 改名成/dev/kinstonusb 并为了演示增加了一个链接到/dev/kinstonusb ,这个链接为/dev/kinstonusb_link 。
好了,我们怎么来写这个规则呢,我们要记住的一点是我们写的这些规则可以唯一确定我们的设备,不然系统会认不出来的。
udev 的规则文件里定义了很多变量,如KERNELS ,SUBSYSTEMS ,DRIVERS 等等,我们可以用这些变量中的几个来确定我们的设备,并修改我们其中的NAME 和SYMLINK 变量,这样我们就可以改变我们的设备在/dev 目录下的名字和链接了。
其实,我们并不真的需要很了解这些变量,我们只需要知道几个就可以了,而且我们在写这些规则文件的时候也不需要记住怎么写,很方便,下面看我怎么一步一步做。
首先,我们来看下我们都有什么块设备:
运行 ls /sys/block
loop0 loop2 loop4 loop6 ram0 ram10 ram12 ram14 ram2 ram4 ram6 ram8 sda sdc sde
loop1 loop3 loop5 loop7 ram1 ram11 ram13 ram15 ram3 ram5 ram7 ram9 sdb sdd
大
家看到我的系统里有 sda , sdb , sdc , sdd , sde 这 5 个设备。我们可以用下面这个命令来查看我的 usb 优盘的信息:
udevadm info -a -p /sys/block/sdc
U devadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc':
KERNEL=="sdc"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="1"
ATTR{ro}=="0"
ATTR{size}=="7830528"
ATTR{alignment_offset}=="0"
ATTR{capability}=="53"
ATTR{stat}==" 48 966 1714 344 0 0 0 0 0 328 344"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0':
KERNELS=="5:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{device_blocked}=="0"
…..........................
上面省略了后面的信息信息,大家都可以看到,这些信息就是我们需要定义我们规则文件里的变量的信息。
这些信息是以最里一层的一层一层向外显示的信息,如上,第一部分是 sdc 的信息,第二部分是 sdc 父目录的信息,即它的上一层设备的信息等等。
但这里我们不是需要 sdc 的信息,我们需要的是 sdc4 的信息,而 /sys/block 目录下并没有 sdc4 这一项,那么我们怎么看到 sdc4 分区的信息呢。
运行下面的命令可以得到 sdc4 的设备所在。
udevadm info -q path -n /dev/sdc4
我的输出如下:
/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc/sdc4
那么我们就可以用上面的命令来得到 sdc4 的信息了,运行如下的命令:
udevadm info -a -p $(udevadm info -q path -n /dev/sdc4)
我机子的输出如下(省略了一部分):
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc/sdc4':
KERNEL=="sdc4"
SUBSYSTEM=="block"
DRIVER==""
ATTR{partition}=="4"
ATTR{start}=="63"
ATTR{size}=="7830465"
ATTR{alignment_offset}=="0"
ATTR{stat}==" 35 910 1162 280 0 0 0 0 0 272 280"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/host5/target5:0:0/5:0:0:0/block/sdc':
KERNELS=="sdc"
SUBSYSTEMS=="block"
…..........................
好,我们就可以编写我们的 /etc/udev/rules.d/10-local.rules 文件了。
sudo vim /etc/udev/rules.d/10-local.rules
在里面加入这几个变量信息,如下。
KERNEL=="sdc4", SUBSYSTEMS=="block", NAME+="kinstonusb", SYMLINK+="kinstonusb_link"
上面的 KERNEL=="sdc4", SUBSYSTEMS=="block" 我们可以根据上面的输出直接拷贝过去的。我们保存这个文件。
一般我们要使这个规则文件生效,要热插拔我们的设备以产生一个事件或在设备中的 event 文件中增加信息以达到发送事件的目的来更新我们的 udev 规则,但这里有个更加方便的方法,我们可以运行下面这个命令。
sudo udevadm test /sys/class/block/sdc4
这样我们就更新了我们的规则。
好,我们来看下我们的 /dev 里的情况,如下图:
在看下我们的sdc,如下图:
我们的sdc4不见了,即是我们命名我们的sdc4为kinstonusb了,而且还有个kinstonusb_link链接到它,以后我们就可用/dev/kinstonusb或/dev/kinstonusb_link来操作我们的优盘而不是/dev/sdc4了。
详细:可以参考udev的官方文档。