下面是我要做的一个测试,我的系统是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优盘的信息:
udevadminfo -a -p /sys/block/sdc
Udevadminfo starts with the device specified by the devpath and then
walksup the chain of parent devices. It prints for every device
found,all possible attributes in the udev rules key format.
Arule to match, can be composed by the attributes of the device
andthe attributes from one single parent device.
lookingat 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"
lookingat 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的设备所在。
udevadminfo -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的信息了,运行如下的命令:
udevadminfo -a -p $(udevadm info -q path -n /dev/sdc4)
我机子的输出如下(省略了一部分):
Udevadminfo starts with the device specified by the devpath and then
walksup the chain of parent devices. It prints for every device
found,all possible attributes in the udev rules key format.
Arule to match, can be composed by the attributes of the device
andthe attributes from one single parent device.
lookingat 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"
lookingat 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文件了。
sudovim /etc/udev/rules.d/10-local.rules
在里面加入这几个变量信息,如下。
KERNEL=="sdc4",SUBSYSTEMS=="block", NAME+="kinstonusb",SYMLINK+="kinstonusb_link"
上面的KERNEL=="sdc4",SUBSYSTEMS=="block"我们可以根据上面的输出直接拷贝过去的。我们保存这个文件。
一般我们要使这个规则文件生效,要热插拔我们的设备以产生一个事件或在设备中的event文件中增加信息以达到发送事件的目的来更新我们的udev规则,但这里有个更加方便的方法,我们可以运行下面这个命令。
sudoudevadm test /sys/class/block/sdc4
这样我们就更新了我们的规则。
好,我们来看下我们的/dev里的情况,如下图:
在看下我们的sdc,如下图:
我们的sdc4不见了,即是我们命名我们的sdc4为kinstonusb了,而且还有个kinstonusb_link链接到它,以后我们就可用/dev/kinstonusb或/dev/kinstonusb_link来操作我们的优盘而不是/dev/sdc4了。