涓昏鍐呭锛?
- udev绠€浠?/li>
- 濡備綍閰嶇疆鍜屼娇鐢╱dev
- 濡備綍缂栧啓udev瑙勫垯
- 瀛楃涓叉浛鎹㈠拰鍖归厤
- udev涓昏浣滅敤
- 缂栧啓udev瑙勫垯瀹炰緥
- 闅剧偣瑙f瀽
1. udev绠€浠?
1.1 浠€涔堟槸udev锛?
udev鏄疞inux锛坙inux2.6鍐呮牳涔嬪悗锛夐粯璁ょ殑璁惧绠$悊宸ュ叿銆倁dev 浠ュ畧鎶よ繘绋嬬殑褰㈠紡杩愯锛岄€氳繃渚﹀惉鍐呮牳鍙戝嚭鏉ョ殑 uevent 鏉ョ鐞?/dev鐩綍涓嬬殑璁惧鏂囦欢銆?
濡備綍鐞嗚Вudev鏄畧鎶よ繘绋嬪憿锛熷嵆绯荤粺鍐呮牳鍚姩鍚巌nit杩涚▼锛堟瘮濡俠usybox鐨刬nit绋嬪簭銆乻ysinit銆乁pstart鎴杝ystemd锛夋牴鎹畆unlevel杩愯绛夌骇杩涘叆鏌愮妯″紡锛岀劧鍚庤В鏋愬紑鍚摢浜涙湇鍔¤繘绋嬨€傚叾涓璾dev灏辨槸鍝簺鏈嶅姟杩涚▼涓殑涓€涓紝鏈嶅姟杩涚▼鏄湪鍚庡彴杩愯鐨勩€傚彲浠ラ€氳繃鍛戒护ps -aux鏉ヨ幏鍙栵紝姣斿鍦╱buntu缁堢涓璸s -aux | grep udev
root 聽 聽 聽 328 聽0.0 聽0.0 聽52220 聽 852 ? 聽 聽 聽 聽Ss 聽 聽2鏈?3 聽 0:00 /lib/systemd/systemd-udevd --daemon
鎵€浠ュ彧瑕佹湁璁惧鎻掑叆鎴栧垹闄わ紝瀹堟姢杩涚▼udev灏变細绠$悊瀹冦€?
涔熷氨鏄浣跨敤浜唘dev锛屾墍鏈夌殑璁惧閮借兘鍦?dev/鐩綍涓嬫壘鍒板搴旂殑璁惧鏂囦欢銆?
1.2 浣跨敤udev鐨勫ソ澶?
鍔ㄦ€佺鐞嗭細褰撹澶囨坊鍔?/ 鍒犻櫎鏃讹紝udev 鐨勫畧鎶よ繘绋嬩睛鍚潵鑷唴鏍哥殑 uevent锛屼互姝ゆ坊鍔犳垨鑰呭垹闄?/dev涓嬬殑璁惧鏂囦欢锛屾墍浠?udev 鍙负宸茬粡杩炴帴鐨勮澶囦骇鐢熻澶囨枃浠讹紝鑰屼笉浼氬湪 /dev涓嬩骇鐢熷ぇ閲忚櫄鏃犵殑璁惧鏂囦欢銆?
鑷畾涔夊懡鍚嶈鍒欙細閫氳繃 Linux 榛樿鐨勮鍒欐枃浠讹紝udev 鍦?/dev/ 閲屼负鎵€鏈夌殑璁惧瀹氫箟浜嗗唴鏍歌澶囧悕绉帮紝姣斿 /dev/sda銆?dev/hda銆?dev/fd绛夌瓑銆傜敱浜?udev 鏄湪鐢ㄦ埛绌洪棿 (user space) 杩愯锛孡inux 鐢ㄦ埛鍙互閫氳繃鑷畾涔夌殑瑙勫垯鏂囦欢锛岀伒娲诲湴浜х敓鏍囪瘑鎬у己鐨勮澶囨枃浠跺悕锛屾瘮濡?/dev/boot_disk銆?dev/root_disk銆?dev/color_printer绛夌瓑銆?
璁惧畾璁惧鐨勬潈闄愬拰鎵€鏈夎€?/ 缁勶細udev 鍙互鎸変竴瀹氱殑鏉′欢鏉ヨ缃澶囨枃浠剁殑鏉冮檺鍜岃澶囨枃浠舵墍鏈夎€?/ 缁?
1.3 udev宸ヤ綔娴佺▼

2.聽濡備綍閰嶇疆鍜屼娇鐢╱dev
2.1 udev鐨勯厤缃枃浠?/etc/udev/udev.conf)
[[email聽protected]_RHEL4 dev]# cat /etc/udev/udev.conf
# udev.conf
# The main config file for udev
#
# This file can be used to override some of udev's default values
# for where it looks for files, and where it places device nodes.
#
# WARNING: changing any value, can cause serious system breakage!
#
# udev_root - where in the filesystem to place the device nodes
udev_root="/dev/"
# udev_db - The name and location of the udev database.
udev_db="/dev/.udev.tdb"
# udev_rules - The name and location of the udev rules file
udev_rules="/etc/udev/rules.d/"
# udev_permissions - The name and location of the udev permission file
udev_permissions="/etc/udev/permissions.d/"
# default_mode - set the default mode for all nodes that have no
# explicit match in the permissions file
default_mode="0600"
# default_owner - set the default owner for all nodes that have no
# explicit match in the permissions file
default_owner="root"
# default_group - set the default group for all nodes that have no
# explicit match in the permissions file
default_group="root"
# udev_log - set to "yes" if you want logging, else "no"
udev_log="no"
Linux 鐢ㄦ埛鍙互閫氳繃璇ユ枃浠惰缃互涓嬪弬鏁帮細
udev_root锛歶dev 浜х敓鐨勮澶囨墍瀛樻斁鐨勭洰褰曪紝榛樿鍊兼槸 /dev/銆傚缓璁笉瑕佷慨鏀硅鍙傛暟锛屽洜涓哄緢澶氬簲鐢ㄧ▼搴忛粯璁や細浠庤鐩綍璋冪敤璁惧鏂囦欢銆? udev_db锛歶dev 淇℃伅瀛樻斁鐨勬暟鎹簱鎴栬€呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /dev/.udev.tdb銆? udev_rules锛歶dev 瑙勫垯鏂囦欢鐨勫悕瀛楁垨鑰呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /etc/udev/rules.d/鎴?lib/udev/rules.d銆? udev_permissions锛歶dev 鏉冮檺鏂囦欢鐨勫悕瀛楁垨鑰呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /etc/udev/permissions.d/銆? default_mode/ default_owner/ default_group锛氬鏋滆澶囨枃浠剁殑鏉冮檺娌℃湁鍦ㄦ潈闄愭枃浠堕噷鎸囧畾锛屽氨浣跨敤璇ュ弬鏁颁綔涓洪粯璁ゆ潈闄愶紝榛樿鍊煎垎鍒槸锛?600/root/root銆? udev_log锛氭槸鍚﹂渶瑕?syslog璁板綍 udev 鏃ュ織鐨勫紑鍏筹紝榛樿鍊兼槸 no銆俿yslog璁板綍鏃ュ織鐨勭骇鍒紝榛樿鍊兼槸 err銆傚鏋滄敼涓?info 鎴栬€?debug 鐨勮瘽锛屼細鏈夊啑闀跨殑 udev 鏃ュ織琚褰曚笅鏉ャ€?
鍏跺疄锛屽湪鎴戜滑鐨勭粓绔笂锛寀dev閰嶇疆鏂囦欢娌℃湁閭d箞澶嶆潅锛屽洜涓哄ぇ閮ㄥ垎閮芥槸榛樿鍊硷紝鎵€浠ヤ笉鐢ㄩ厤缃紝鐪嬫垜ubuntu涓嬬殑udev閰嶇疆鏂囦欢锛?
$cat /etc/udev/udev.conf
# see udev(7) for details
#
# udevd is started in the initramfs, so when this file is modified the
# initramfs should be rebuilt.
#udev_log="info"
璇ユ枃浠堕兘鏄敞閲婏紝璇存槑閮界敤榛樿鍊笺€?
2.2 udev鐨勮鍒欏拰瑙勫垯鏂囦欢
瑙勫垯鏂囦欢鏄?udev 閲屾渶閲嶈鐨勯儴鍒嗭紝榛樿鏄瓨鏀惧湪 /etc/udev/rules.d/涓嬨€傛墍鏈夌殑瑙勫垯鏂囦欢蹇呴』浠モ€?rules鈥濅负鍚庣紑鍚嶃€?
瑙勫垯鏂囦欢閲岀殑瑙勫垯鏈変竴绯诲垪鐨勯敭/鍊煎缁勬垚锛岄敭/鍊煎涔嬮棿鐢ㄩ€楀彿(,)鍒嗗壊銆傛瘡涓€涓敭鎴栬€呮槸鐢ㄦ埛鍖归厤閿紝鎴栬€呮槸涓€涓祴鍊奸敭銆傚尮閰嶉敭纭畾瑙勫垯鏄惁琚簲鐢紝鑰岃祴 鍊奸敭琛ㄧず鍒嗛厤鏌愬€肩粰璇ラ敭銆傝繖浜涘€煎皢褰卞搷udev鍒涘缓鐨勮澶囨枃浠躲€傝祴鍊奸敭鍙互澶勭悊涓€涓鍊煎垪琛ㄣ€傚尮閰嶉敭鍜岃祴鍊奸敭鎿嶄綔绗﹁В閲婅涓嬭〃锛?
2.2.1 udev 閿?鍊煎鎿嶄綔绗?
鎿嶄綔绗?銆€銆€鍖归厤鎴栬祴鍊?銆€聽瑙i噴
锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞
== 銆€銆€銆€聽鍖归厤 銆€銆€銆€銆€ 鐩哥瓑姣旇緝
!= 銆€銆€銆€ 聽鍖归厤 銆€銆€銆€ 聽聽聽涓嶇瓑姣旇緝
= 銆€銆€銆€銆€璧嬪€?銆€銆€銆€銆€聽鍒嗛厤涓€涓壒瀹氱殑鍊肩粰璇ラ敭锛屼粬鍙互瑕嗙洊涔嬪墠鐨勮祴鍊笺€? +=銆€銆€銆€聽聽璧嬪€?聽 聽 聽 聽 聽 聽 杩藉姞鐗瑰畾鐨勫€肩粰宸茬粡瀛樺湪鐨勯敭
:= 聽 聽 聽 聽 聽 璧嬪€?聽 聽 聽 聽 聽 聽 鍒嗛厤涓€涓壒瀹氱殑鍊肩粰璇ラ敭锛屽悗闈㈢殑瑙勫垯涓嶅彲鑳借鐩栧畠銆?
2.2.2 udev 瑙勫垯鐨勫尮閰嶉敭
ACTION锛?浜嬩欢 (uevent) 鐨勮涓猴紝渚嬪锛歛dd( 娣诲姞璁惧 )銆乺emove( 鍒犻櫎璁惧 )銆?
KERNEL锛?鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda, cdrom銆?
DEVPATH锛氳澶囩殑 devpath 璺緞銆?
SUBSYSTEM锛?璁惧鐨勫瓙绯荤粺鍚嶇О锛屼緥濡傦細sda 鐨勫瓙绯荤粺涓?block銆?
BUS锛?璁惧鍦?devpath 閲岀殑鎬荤嚎鍚嶇О锛屼緥濡傦細usb銆?
DRIVER锛?璁惧鍦?devpath 閲岀殑璁惧椹卞姩鍚嶇О锛屼緥濡傦細ide-cdrom銆?
ID锛?璁惧鍦?devpath 閲岀殑璇嗗埆鍙枫€?
SYSFS{filename}锛?璁惧鐨?devpath 璺緞涓嬶紝璁惧鐨勫睘鎬ф枃浠垛€渇ilename鈥濋噷鐨勫唴瀹广€?
渚嬪锛歋YSFS{model}==鈥淪T936701SS鈥濊〃绀猴細濡傛灉璁惧鐨勫瀷鍙蜂负 ST936701SS锛屽垯璇ヨ澶囧尮閰嶈 鍖归厤閿€?
鍦ㄤ竴鏉¤鍒欎腑锛屽彲浠ヨ瀹氭渶澶氫簲鏉?SYSFS 鐨?鍖归厤閿€?
ENV{key}锛?鐜鍙橀噺銆傚湪涓€鏉¤鍒欎腑锛屽彲浠ヨ瀹氭渶澶氫簲鏉$幆澧冨彉閲忕殑 鍖归厤閿€?
PROGRAM锛氳皟鐢ㄥ閮ㄥ懡浠ゃ€?
RESULT锛?澶栭儴鍛戒护 PROGRAM 鐨勮繑鍥炵粨鏋溿€備緥濡傦細
PROGRAM=="/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67"
璋冪敤澶栭儴鍛戒护 /lib/udev/scsi_id鏌ヨ璁惧鐨?SCSI ID锛屽鏋滆繑鍥炵粨鏋滀负 35000c50000a7ef67锛屽垯璇ヨ澶囧尮閰嶈 鍖归厤閿€?
2.2.3 udev 鐨勯噸瑕佽祴鍊奸敭
NAME锛氬湪 /dev涓嬩骇鐢熺殑璁惧鏂囦欢鍚嶃€傚彧鏈夌涓€娆″鏌愪釜璁惧鐨?NAME 鐨勮祴鍊艰涓虹敓鏁堬紝涔嬪悗鍖归厤鐨勮鍒欏啀瀵硅璁惧鐨?NAME 璧嬪€艰涓哄皢琚拷鐣ャ€傚鏋滄病鏈変换浣曡鍒欏璁惧鐨?NAME 璧嬪€硷紝udev 灏嗕娇鐢ㄥ唴鏍歌澶囧悕绉版潵浜х敓璁惧鏂囦欢銆?
SYMLINK锛氫负 /dev/涓嬬殑璁惧鏂囦欢浜х敓绗﹀彿閾炬帴銆傜敱浜?udev 鍙兘涓烘煇涓澶囦骇鐢熶竴涓澶囨枃浠讹紝鎵€浠ヤ负浜嗕笉瑕嗙洊绯荤粺榛樿鐨?udev 瑙勫垯鎵€浜х敓鐨勬枃浠讹紝鎺ㄨ崘浣跨敤绗﹀彿閾炬帴銆?
OWNER, GROUP, MODE锛氫负璁惧璁惧畾鏉冮檺銆?
ENV{key}锛氬鍏ヤ竴涓幆澧冨彉閲忋€?
2.2.4 udev 鐨勫€煎拰鍙皟鐢ㄧ殑鏇挎崲鎿嶄綔绗?
鍦ㄩ敭鍊煎涓殑閿拰鎿嶄綔绗﹂兘浠嬬粛瀹屼簡锛屾渶鍚庢槸鍊?(value)銆侺inux 鐢ㄦ埛鍙互闅忔剰鍦板畾鍒?udev 瑙勫垯鏂囦欢鐨勫€笺€備緥濡傦細my_root_disk, my_printer銆傚悓鏃朵篃鍙互寮曠敤涓嬮潰鐨勬浛鎹㈡搷浣滅锛?
$kernel, %k锛氳澶囩殑鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda銆乧drom銆?
$number, %n锛氳澶囩殑鍐呮牳鍙风爜锛屼緥濡傦細sda3 鐨勫唴鏍稿彿鐮佹槸 3銆?
$devpath, %p锛氳澶囩殑 devpath璺緞銆?
$id, %b锛氳澶囧湪 devpath閲岀殑 ID 鍙枫€?
$sysfs{file}, %s{file}锛氳澶囩殑 sysfs閲?file 鐨勫唴瀹广€傚叾瀹炲氨鏄澶囩殑灞炴€у€笺€? 渚嬪锛?sysfs{size} 琛ㄧず璇ヨ澶?( 纾佺洏 ) 鐨勫ぇ灏忋€?
$env{key}, %E{key}锛氫竴涓幆澧冨彉閲忕殑鍊笺€?
$major, %M锛氳澶囩殑 major 鍙枫€?
$minor %m锛氳澶囩殑 minor 鍙枫€?
$result, %c锛歅ROGRAM 杩斿洖鐨勭粨鏋溿€?
$parent, %P锛氱埗璁惧鐨勮澶囨枃浠跺悕銆?
$root, %r锛歶dev_root鐨勫€硷紝榛樿鏄?/dev/銆?
$tempnode, %N锛氫复鏃惰澶囧悕銆?
%%锛氱鍙?% 鏈韩銆?
$$锛氱鍙?$ 鏈韩銆?
3. 濡備綍缂栧啓udev瑙勫垯
鍏跺疄锛屽湪瀹夎udev鏃讹紝浼氱敓鎴愪竴绯诲垪鐨剈dev瑙勫垯鏂囦欢鏀惧湪/etc/udev/rules.d/鎴?lib/udev/rules.d/鐩綍涓嬶紝姣斿/lib/udev/rules.d/50-udev-default.rules绛夐粯璁ょ殑udev瑙勫垯鏂囦欢銆?
鎴戜滑鍙渶娣诲姞鑷繁鎯虫敼鐨剈dev瑙勫垯鏂囦欢璁╁叾鍋氭垜浠兂鍋氱殑浜嬶紝姣斿褰揢鐩樻彃鍏ユ椂锛屾垜瑕佽嚜鍔ㄦ寕杞藉畠锛堟垨鑰呭叾浠栦粈涔堝姩浣滐級锛屽叾瀹炲畨瑁呬簡udev锛屽綋U鐩樻彃鍏ユ椂锛屽畠鏈夌浉搴旂殑.rules瑙勫垯鏂囦欢鍘昏В鏋愬畠锛堝嵆udev浼氬姩鎬佺鐞嗗畠锛夛紝鍦?dev/鐩綍涓嬩骇鐢熺浉搴旂殑璁惧鏂囦欢锛屾瘮濡?dev/sda4.浣嗙幇鍦ㄦ垜闇€瑕佸湪U鐩樻彃鍏ユ椂锛屾垜鑷姩鎸傝浇瀹冿紙姣斿鎸傝浇鍒?mnt/udisk/鐩綍涓嬶級锛岄偅涔堟垜灏卞彲浠ョ紪鍐欒嚜宸辩殑udev瑙勫垯鏂囦欢automount.rules銆傝鏂囦欢濡備笅锛?
# There are a number of modifiers that are allowed to be used in some
# of the different fields. They provide the following subsitutions:
#
# %n the "kernel number" of the device.
# For example, 'sda3' has a "kernel number" of '3'
# %e the smallest number for that name which does not matches an existing node
# %k the kernel name for the device
# %M the kernel major number for the device
# %m the kernel minor number for the device
# %b the bus id for the device
# %c the string returned by the PROGRAM
# %s{filename} the content of a sysfs attribute
# %% the '%' char itself
#
# Media automounting
SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/rules.d/mount.sh"
SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/rules.d/mount.sh"
SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/rules.d/mount.sh"
璇存槑锛氬綋鏈塙鐩樼儹鎻掓嫈鏃堕兘浼氬幓璺?etc/udev/rules.d/mount.sh鑴氭湰銆傚叾涓璖UBSYSTEM=="block"锛孶鐩榮da鐨勫瓙绯荤粺灏辨槸block銆?
mount.sh濡備笅锛?
MOUNT="/bin/mount"
PMOUNT="/usr/bin/pmount"
UMOUNT="/bin/umount"
for line in `grep -v ^# /etc/udev/mount.blacklist`
do
name="`basename "$DEVNAME"`"
if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ] || [ ` expr match "$name" "$line" ` -gt 0 ]
then
logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring"
exit 0
fi
done
automount() {
name="`basename "$DEVNAME"`"
if [[ $name =~ sd ]];then
mount_dir=/mnt/udisk
! test -d $mount_dir && mkdir -p $mount_dir
elif [[ $name =~ mmcblk ]];then
mount_dir=/mnt/sdisk
! test -d $mount_dir && mkdir -p $mount_dir
fi
# Silent util-linux's version of mounting auto
if [ "x`readlink $MOUNT`" = "x/bin/mount.util-linux" ] ;
then
MOUNT="$MOUNT -o silent"
fi
# If filesystem type is vfat, change the ownership group to 'disk', and
# grant it with w/r/x permissions.
case $ID_FS_TYPE in
vfat|fat)
MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
;;
# TODO
*)
;;
esac
if ! $MOUNT -t auto -o iocharset=cp936 $DEVNAME $mount_dir
then
logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME $mount_dir failed!"
rm_dir "/run/media/$name"
else
logger "mount.sh/automount" "Auto-mount of [ $mount_dir] successful"
touch "/tmp/.automount-$name"
killall -USR1 adas.exe
fi
}
rm_dir() {
# We do not want to rm -r populated directories
if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
then
! test -z "$1" && rm -r "$1"
killall -USR1 adas.exe
else
logger "mount.sh/automount" "Not removing non-empty directory [$1]"
fi
}
# No ID_FS_TYPE for cdrom device, yet it should be mounted
name="`basename "$DEVNAME"`"
[ -e /sys/block/$name/device/media ] && media_type=`cat /sys/block/$name/device/media`
if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_type" = "cdrom" ]; then
if [ -x "$PMOUNT" ]; then
$PMOUNT $DEVNAME 2> /dev/null
elif [ -x $MOUNT ]; then
$MOUNT $DEVNAME 2> /dev/null
fi
# If the device isn't mounted at this point, it isn't
# configured in fstab (note the root filesystem can show up as
# /dev/root in /proc/mounts, so check the device number too)
if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
grep -q "^$DEVNAME " /proc/mounts || automount
fi
fi
if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
do
$UMOUNT $mnt
done
# Remove empty directories from auto-mounter
name="`basename "$DEVNAME"`"
if [[ $name =~ sd ]];then
mount_dir=/mnt/udisk
elif [[ $name =~ mmcblk ]];then
mount_dir=/mnt/sdisk
fi
test -e "/tmp/.automount-$name" && rm_dir $mount_dir
fi
杩欓噷鍙槸涓句竴涓緥瀛愯€屽凡銆傚彲浠ョ紪鍐欐垜浠兂瑕佺殑瑙勫垯鏂囦欢銆?
3.1 濡備綍缂栧啓瑙勫垯鏂囦欢鍛紵
鍏跺疄灏辨槸涓ょ偣锛氬尮閰嶉敭鍜岃祴鍊奸敭锛屽彧闇€瀹屽杽杩欎袱鐐瑰氨鍙互缂栧啓鎴戜滑鎯宠鐨勮鍒欐枃浠?
姣斿锛欿ERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
璇ヨ鍒欒鏄庯細濡傛灉鏈変竴涓澶囩殑鍐呮牳璁惧鍚嶇О涓簍ty(KERNEL=="tty")锛岄偅涔堣缃柊鐨勬潈闄愪负0600(MODE="0666")锛屾墍鍦ㄧ殑缁勬槸tty(GROUP="tty")銆傚畠涔熻缃簡涓€涓壒鍒殑璁惧鏂囦欢鍚?%K銆傚湪杩欓噷渚嬪瓙閲岋紝%k浠h〃璁惧鐨勫唴鏍稿悕瀛椼€傞偅涔熷氨鎰忓懗鐫€鍐呮牳璇嗗埆鍑鸿繖浜涜澶囨槸浠€涔堝悕瀛楋紝灏卞垱寤轰粈涔堟牱鐨勮澶囨枃浠跺悕銆?
鍦ㄨ繖閲屽氨鏄瀹屽杽涓ょ偣,鍖归厤閿甂ERNEL=="tty";璧嬪€奸敭NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
鍏跺疄鍏抽敭鏄濡備綍鎵惧埌璁惧鐨勫睘鎬у憿锛屽嵆鎷夸粈涔堝尯鍖归厤锛岃鍒欐墍闇€瑕佺殑淇℃伅濡備綍鑾峰彇锛?
鍙互鍒╃敤udev鐨勫懡浠わ細姣斿udevadm info -a -p $(udevadm info -q path -n /dev/sda4). 鍏朵腑udevadm info -q path -n /dev/sda4杩斿洖sysfs涓殑璁惧璺緞锛泆devadm info -a -p $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細
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:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb/sdb4':
KERNEL=="sdb4"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="15177600"
ATTR{stat}==" 202 382 1562 212 0 0 0 0 0 164 212"
ATTR{partition}=="4"
ATTR{start}=="14880"
ATTR{discard_alignment}=="0"
ATTR{alignment_offset}=="0"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{ro}=="0"
ATTRS{size}=="15204352"
ATTRS{stat}==" 295 382 2306 1208 0 0 0 0 0 1156 1204"
ATTRS{range}=="16"
ATTRS{discard_alignment}=="0"
ATTRS{events}=="media_change"
ATTRS{ext_range}=="256"
ATTRS{events_poll_msecs}=="2000"
ATTRS{alignment_offset}=="0"
ATTRS{inflight}==" 0 0"
ATTRS{removable}=="1"
ATTRS{capability}=="51"
ATTRS{events_async}==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0':
KERNELS=="18:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{rev}=="1.00"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{model}==" "
ATTRS{state}=="running"
ATTRS{queue_type}=="none"
ATTRS{iodone_cnt}=="0x152"
ATTRS{iorequest_cnt}=="0x152"
ATTRS{device_busy}=="0"
ATTRS{evt_capacity_change_reported}=="0"
ATTRS{timeout}=="30"
ATTRS{evt_media_change}=="0"
ATTRS{max_sectors}=="240"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{queue_depth}=="1"
ATTRS{vendor}==" "
ATTRS{evt_soft_threshold_reached}=="0"
ATTRS{device_blocked}=="0"
ATTRS{evt_mode_parameter_change_reported}=="0"
ATTRS{evt_lun_change_reported}=="0"
ATTRS{evt_inquiry_change_reported}=="0"
ATTRS{iocounterbits}=="32"
ATTRS{eh_timeout}=="10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0':
KERNELS=="target18:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18':
KERNELS=="host18"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0':
KERNELS=="1-8:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{bNumEndpoints}=="02"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8':
KERNELS=="1-8"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="8"
ATTRS{idVendor}=="1516"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="17"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="500mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0100"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="1001"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="SKYMEDI"
ATTRS{removable}=="removable"
ATTRS{idProduct}=="1226"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="USB Drive"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="15"
ATTRS{bcdDevice}=="0402"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:14.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="348"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 4.2.0-42-generic xhci-hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="xHCI Host Controller"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{irq}=="27"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="f"
ATTRS{device}=="0x8c31"
ATTRS{enable}=="1"
ATTRS{msi_bus}=="1"
ATTRS{local_cpulist}=="0-3"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x05a5"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
浠庝腑鍙互寰楀埌KERNEL,SUBSYSTEM绛変俊鎭紝杩欐牱灏卞彲浠ュ埄鐢ㄨ繖浜涘睘鎬у€煎幓鍖归厤銆傚叾瀹炴垜浠彲浠ヤ粠閭i噷鐪嬪埌鈥渓ooking at parent device鈥濇槸涓€灞傚線涓€灞傛墦鍗板嚭璇ヨ澶囩殑淇℃伅銆?
杩欐牱鎴戜滑灏卞彲浠ERNEL=="sdb4", SUBSYSTEM=="block"鍘诲尮閰嶏紝姣斿鍐檜dev瑙勫垯濡備笅锛?
KERNEL=="sdb4", SUBSYSTEM=="block",聽RUN+="/etc/udev/rules.d/mount.sh"
4. 瀛楃涓叉浛鎹㈠拰鍖归厤
4.1 瀛楃涓叉浛鎹?
$kernel,聽%k锛氳澶囩殑鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda銆乧drom銆?
$number,聽%n锛氳澶囩殑鍐呮牳鍙风爜锛屼緥濡傦細sda3 鐨勫唴鏍稿彿鐮佹槸 3銆?
$devpath,聽%p锛氳澶囩殑 devpath璺緞銆?
$id,聽%b锛氳澶囧湪 devpath閲岀殑 ID聽鍙枫€?
$sysfs{file},聽%s{file}锛氳澶囩殑 sysfs閲?file 鐨勫唴瀹广€傚叾瀹炲氨鏄澶囩殑灞炴€у€笺€?
渚嬪锛?sysfs{size} 琛ㄧず璇ヨ澶?( 纾佺洏 ) 鐨勫ぇ灏忋€?
$env{key},聽%E{key}锛氫竴涓幆澧冨彉閲忕殑鍊笺€?
$major,聽%M锛氳澶囩殑 major 鍙枫€?
$minor聽%m锛氳澶囩殑 minor 鍙枫€?
$result,聽%c锛歅ROGRAM 杩斿洖鐨勭粨鏋?
$parent,聽%P锛氱埗璁惧鐨勮澶囨枃浠跺悕銆?
$root,聽%r锛歶dev_root鐨勫€硷紝榛樿鏄?/dev/銆?
$tempnode,聽%N锛氫复鏃惰澶囧悕銆?
%%锛氱鍙?% 鏈韩銆?
$$锛氱鍙?$ 鏈韩銆?
渚嬪瓙濡備笅锛?
KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负fb[0-9]鐨勮澶囷紝鐒跺悗缁欏畠鍛藉悕涓篺b/%n锛岀鍙烽摼鎺ヤ负%k
姣斿鏈変竴涓猣b3璁惧锛屽尮閰嶆垚鍔熷悗閭d箞涔呮湁涓€涓悕涓篺b/3,绗﹀彿閾炬帴涓篺b3
4.2 瀛楃涓插尮閰?
涓嶄粎鏈夊瓧绗︿覆绮剧‘鍖归厤, udev涔熷厑璁镐綘浣跨敤shell椋庢牸鐨勬ā寮忓尮閰? 鏀寔鐨?绉嶆ā寮忎负:
* - 鍖归厤浠讳綍瀛楃, 鍖归厤0娆℃垨澶氭
? - 鍖归厤浠讳綍瀛楃,浣嗗彧鍖归厤涓€娆?
[] - 鍖归厤浠讳綍鍗曚釜瀛楃, 杩欎簺瀛楃鍦ㄦ柟鎷彿閲岄潰鎸囧畾, 鑼冨洿鏄彈闄愮殑.
杩欓噷鏈変竴浜涗緥瀛? 娉ㄦ剰瀛楃涓叉浛鎹㈢鐨勪娇鐢?
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k"
KERNEL=="hiddev*", NAME="usb/%k"
绗竴鏉¤鍒欏尮閰嶆墍鏈夎蒋鐩橀┍鍔ㄥ苟纭繚璁惧鑺傜偣鏀剧疆鍦?dev/floppy鐩綍涓? 涔熷垱寤轰竴涓己鐪佸悕瀛楃殑绗﹀彿閾炬帴. 绗簩鏉¤鍒欑‘淇漢iddev璁惧鑺傜偣鏀惧湪/dev/usb鐩綍涓嬮潰.
5. udev涓昏浣滅敤
- 閲嶅懡鍚嶈澶囪妭鐐圭殑缂虹渷鍚嶅瓧涓哄叾浠栧悕瀛?/li>
- 閫氳繃鍒涘缓绗﹀彿閾炬帴鍒扮己鐪佽澶囪妭鐐规潵鎻愪緵涓€涓彲閫夌殑鍥哄畾鐨勮澶囪妭鐐瑰悕瀛?/li>
- 鍩轰簬绋嬪簭鐨勮緭鍑哄懡鍚嶈澶囪妭鐐?/li>
- 鏀瑰彉璁惧鑺傜偣鐨勬潈闄愬拰鎵€鏈夋潈
- 鍦ㄨ澶囪妭鐐硅鍒涘缓鎴栧垹闄ゆ椂(閫氬父鏄坊鍔犺澶囨垨鎷斿嚭璁惧鏃?鎵ц涓€涓剼鏈?/li>
- 閲嶅懡鍚嶇綉缁滄帴鍙?/li>
5.1聽閲嶅懡鍚嶈澶囪妭鐐圭殑缂虹渷鍚嶅瓧涓哄叾浠栧悕瀛?
姝ゆ椂浣跨敤NAME璧嬪€奸敭锛屼緥瀛愬涓嬶細
涓€涓‖鐩橈紝瀹冪殑璁惧灞炴€ERNEL鏄痟db锛屽湪/dev/鐩綍涓嬫槸/dev/hdb锛岄偅涔堟垜浠彲浠ョ粰浠栭噸鍛藉悕涓?
KERNEL=="hdb", NAME="my_spare_disk"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓澶囧懡鍚嶄负hdb鐨勮澶?鎶婂畠閲嶆柊鍛藉悕涓簃y_spare_disk. 璁惧鑺傜偣鍑虹幇鍦?dev/my_spare_disk
鎵ц浠ヤ笅鍛戒护锛歭s /dev/my_spare_disk -l
/dev/my_spare_disk ---> /dev/hdb浜х敓涓€涓鍙烽摼鎺ユ寚鍚?dev/hdb
娉ㄦ剰锛氫粎浠呯涓€琛岀殑NAME鎻忚堪鏄湁鏁堢殑锛屽悗闈㈢殑鍧囧拷鐣ャ€傚嵆udev鎸夐『搴忚В鏋恥dev瑙勫垯鏂囦欢鏃讹紝绗竴涓狽AME璧嬪€奸敭鐨勫悕瀛楁湁鐢紝鍋囧鍚庨潰瀵瑰悓涓€涓澶囪繕鏈塏AME璧嬪€奸敭锛岄偅涔堥偅涓祴鍊肩殑鍚嶇О灏嗚蹇界暐銆傚鏋滀綘鎯充娇鐢ㄤ娇鐢ㄤ袱涓互涓婄殑鍚嶅瓧鏉ヨ闂竴涓澶囩殑璇濓紝鍙互鑰冭檻SYMLINK閿€?
濡傛灉浣犳兂浣犲懡鍚嶇殑鍚嶅瓧寰楀埌瀹炵幇锛屼綘蹇呴』鎶婁綘鐨勮鍒欐枃浠跺懡鍚嶉『搴忓湪鍓嶉潰銆?
5.2聽閫氳繃鍒涘缓绗﹀彿閾炬帴鍒扮己鐪佽澶囪妭鐐规潵鎻愪緵涓€涓彲閫夌殑鍥哄畾鐨勮澶囪妭鐐瑰悕瀛?
渚嬪瓙濡備笅锛?
KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="sparedisk"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负hdb浠ュ強椹卞姩涓篿de-disk鐨勮澶囷紝鍛藉悕璁惧鑺傜偣涓虹己鐪佸悕瀛楀苟鍒涘缓涓€涓寚鍚戝畠鐨剆paredisk绗﹀彿閾炬帴锛岃澶囪妭鐐瑰嚭鐜板湪/dev/sparedisk
娉ㄦ剰锛氱鍙烽摼鎺ュ彲浠ユ槸澶氫釜锛岃繖浜涚鍙烽摼鎺ラ兘鎸囧悜/dev/hdb
5.3聽鍩轰簬绋嬪簭鐨勮緭鍑哄懡鍚嶈澶囪妭鐐?
鏌愪簺鎯呭喌涓嬩綘鍙兘瑕佹眰姣攗dev鏍囧噯瑙勫垯鎻愪緵鐨勬洿澶氬脊鎬? 杩欑鎯呭喌涓嬩綘鍙互璇锋眰udev杩愯涓€涓▼搴忓苟杩愮敤绋嬪簭鐨勬爣鍑嗚緭鍑烘潵鎻愪緵璁惧鍛藉悕.
瑕佷娇鐢ㄨ繖涓姛鑳?浣犲彧闇€绠€鍗曠殑鍦≒ROGRAM璧嬪€间腑鎸囧畾瑕佽繍琛岀▼搴?浠ュ強浠讳綍闃愯堪)鐨勫畬鏁磋矾寰? 鐒跺悗鍦∟AME/SYMLINK璧嬪€间腑浣跨敤涓€浜?c鏇挎崲.
渚嬪瓙濡備笅锛?
寮曠敤涓€涓綅浜?bin/device_namer鐨勮櫄鏋勭▼搴? device_namer甯︿竴涓〃绀哄唴鏍稿悕瀛楃殑鍛戒护琛屽弬鏁? 鍩轰簬鍐呮牳鍚峝evice_namer鍋氫竴浜涘彉鍖栫劧鍚庤緭鍑?
KERNEL=="hda", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负hdb鐨勮澶囷紝鐒跺悗杩愯涓€涓?bin/device_name绋嬪簭锛岃繖涓▼搴忛渶瑕佸甫涓€涓〃绀哄唴鏍稿悕瀛楃殑鍛戒护琛屽弬鏁板嵆%k銆傜劧鍚庤繖涓▼搴忚繍琛岀殑缁撴灉锛堝嵆杈撳嚭锛夋妸瀹冭祴鍊肩粰SYMLINK锛岃繖鏍峰氨鍙互婊¤冻瑕佹眰锛堜娇鐢ㄥ閮ㄧ▼搴忔潵鍛藉悕璁惧锛?
4.4聽鏀瑰彉璁惧鑺傜偣鐨勬潈闄愬拰鎵€鏈夋潈
udev鍏佽浣犲湪瑙勫垯涓娇鐢ㄥ彟澶栫殑璧嬪€兼潵鎺у埗姣忎釜璁惧鐨勬墍鏈夋潈鍜屾潈闄愬睘鎬?
渚嬪瓙濡備笅锛?
KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k", GROUP="video", MODE="0666"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负fb[0-9]鐨勮澶囷紝鐒跺悗缁欏畠鍛藉悕涓篺b/%n,绗﹀彿閾炬帴涓?k, 灞炰簬video缁? 鏉冮檺涓?666
姣斿鏈変竴涓猣b3璁惧锛屽尮閰嶆垚鍔熷悗閭d箞涔呮湁涓€涓悕涓篺b/3,绗﹀彿閾炬帴涓篺b3锛屽睘缁勪负video锛屾潈闄愪负0666
5.5 鍦ㄨ澶囪妭鐐硅鍒涘缓鎴栧垹闄ゆ椂(閫氬父鏄坊鍔犺澶囨垨鎷斿嚭璁惧鏃?鎵ц涓€涓剼鏈?
鐗瑰埆閽堝鐑彃鎷旂殑璁惧锛岀洰鐨勬槸涓轰簡鍦ㄨ澶囪繛鎺ユ垨鑰呮柇寮€鏃惰繍琛屼竴涓壒瀹氱▼搴? 渚嬪, 浣犲彲鑳芥兂鍦ㄤ綘鐨勬暟鐮佺浉鏈鸿繛鍒扮郴缁熸椂鎵ц涓€涓剼鏈潵鑷姩涓嬭浇鐩告満閲岄潰鐨勬墍鏈夌収鐗?
渚嬪瓙濡備笅锛?
KERNEL=="sdb", ACTION=="add", RUN+="/usr/bin/my_program"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿悕涓簊db鐨勮澶囷紝褰撴彃鍏ユ椂锛屾墽琛岀▼搴?usr/bin/my_program
5.6聽閲嶅懡鍚嶇綉缁滄帴鍙?
鍦ㄨ鍒欎腑绠€鍗曠殑鍖归厤缃戝崱MAC鍦板潃鏄湁鎰忎箟鐨?鍥犱负瀹冧滑鏄敮涓€鐨?聽
# udevadm info -a -p /sys/class/net/eth0
looking at class device '/sys/class/net/eth0':
KERNEL=="eth0"
ATTR{address}=="00:52:8b:d5:04:48"
瑙勫垯濡備笅:
KERNEL=="eth*", ATTR{address}=="00:52:8b:d5:04:48", NAME="lan"
杩欐牱灏遍噸鍛藉悕浜唀th*涓簂an
6. 缂栧啓udev瑙勫垯瀹炰緥
USB鎵撳嵃鏈? 鎴戝惎鍔ㄦ垜鐨勬墦鍗版満, 瀹冨氨琚祴浜堜簡涓€涓澶囪妭鐐?dev/lp0. 鎴戝杩欐牱鐨勫崟璋冪殑鍚嶅瓧涓嶆弧鎰忓苟鎵撶畻浣跨敤udevinfo甯垜鍐欎竴涓鍒欐潵鎻愪緵涓€涓彲閫夊悕瀛?
# udevinfo -a -p $(udevinfo -q path -n /dev/lp0)
looking at device '/class/usb/lp0':
KERNEL=="lp0"
SUBSYSTEM=="usb"
DRIVER==""
ATTR{dev}=="180:0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1':
SUBSYSTEMS=="usb"
ATTRS{manufacturer}=="EPSON"
ATTRS{product}=="USB Printer"
ATTRS{serial}=="L72010011070626380"
鎴戠殑瑙勫垯鍙樻垚浜嗚繖鏍?
SUBSYSTEM=="usb", ATTRS{serial}=="L72010011070626380", SYMLINK+="epson_680"
7. 闅剧偣瑙f瀽
7.1 ATTR
ATTR{value}銆€銆€sysfs璁惧灞炴€у€硷紝鍙互涓轰换鎰忓€硷紝鐢ㄤ簬鍖归厤
鍙互鍒╃敤udev鐨勫懡浠わ細姣斿udevadm info -a -p $(udevadm info -q path -n /dev/sda4). 鍏朵腑udevadm info -q path -n /dev/sda4杩斿洖sysfs涓殑璁惧璺緞锛泆devadm info -a -p $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細
涓昏鍐呭锛?
- udev绠€浠?/li>
- 濡備綍閰嶇疆鍜屼娇鐢╱dev
- 濡備綍缂栧啓udev瑙勫垯
- 瀛楃涓叉浛鎹㈠拰鍖归厤
- udev涓昏浣滅敤
- 缂栧啓udev瑙勫垯瀹炰緥
- 闅剧偣瑙f瀽
1. udev绠€浠?
1.1 浠€涔堟槸udev锛?
udev鏄疞inux锛坙inux2.6鍐呮牳涔嬪悗锛夐粯璁ょ殑璁惧绠$悊宸ュ叿銆倁dev 浠ュ畧鎶よ繘绋嬬殑褰㈠紡杩愯锛岄€氳繃渚﹀惉鍐呮牳鍙戝嚭鏉ョ殑 uevent 鏉ョ鐞?/dev鐩綍涓嬬殑璁惧鏂囦欢銆?
濡備綍鐞嗚Вudev鏄畧鎶よ繘绋嬪憿锛熷嵆绯荤粺鍐呮牳鍚姩鍚巌nit杩涚▼锛堟瘮濡俠usybox鐨刬nit绋嬪簭銆乻ysinit銆乁pstart鎴杝ystemd锛夋牴鎹畆unlevel杩愯绛夌骇杩涘叆鏌愮妯″紡锛岀劧鍚庤В鏋愬紑鍚摢浜涙湇鍔¤繘绋嬨€傚叾涓璾dev灏辨槸鍝簺鏈嶅姟杩涚▼涓殑涓€涓紝鏈嶅姟杩涚▼鏄湪鍚庡彴杩愯鐨勩€傚彲浠ラ€氳繃鍛戒护ps -aux鏉ヨ幏鍙栵紝姣斿鍦╱buntu缁堢涓璸s -aux | grep udev
root 聽 聽 聽 328 聽0.0 聽0.0 聽52220 聽 852 ? 聽 聽 聽 聽Ss 聽 聽2鏈?3 聽 0:00 /lib/systemd/systemd-udevd --daemon
鎵€浠ュ彧瑕佹湁璁惧鎻掑叆鎴栧垹闄わ紝瀹堟姢杩涚▼udev灏变細绠$悊瀹冦€?
涔熷氨鏄浣跨敤浜唘dev锛屾墍鏈夌殑璁惧閮借兘鍦?dev/鐩綍涓嬫壘鍒板搴旂殑璁惧鏂囦欢銆?
1.2 浣跨敤udev鐨勫ソ澶?
鍔ㄦ€佺鐞嗭細褰撹澶囨坊鍔?/ 鍒犻櫎鏃讹紝udev 鐨勫畧鎶よ繘绋嬩睛鍚潵鑷唴鏍哥殑 uevent锛屼互姝ゆ坊鍔犳垨鑰呭垹闄?/dev涓嬬殑璁惧鏂囦欢锛屾墍浠?udev 鍙负宸茬粡杩炴帴鐨勮澶囦骇鐢熻澶囨枃浠讹紝鑰屼笉浼氬湪 /dev涓嬩骇鐢熷ぇ閲忚櫄鏃犵殑璁惧鏂囦欢銆?
鑷畾涔夊懡鍚嶈鍒欙細閫氳繃 Linux 榛樿鐨勮鍒欐枃浠讹紝udev 鍦?/dev/ 閲屼负鎵€鏈夌殑璁惧瀹氫箟浜嗗唴鏍歌澶囧悕绉帮紝姣斿 /dev/sda銆?dev/hda銆?dev/fd绛夌瓑銆傜敱浜?udev 鏄湪鐢ㄦ埛绌洪棿 (user space) 杩愯锛孡inux 鐢ㄦ埛鍙互閫氳繃鑷畾涔夌殑瑙勫垯鏂囦欢锛岀伒娲诲湴浜х敓鏍囪瘑鎬у己鐨勮澶囨枃浠跺悕锛屾瘮濡?/dev/boot_disk銆?dev/root_disk銆?dev/color_printer绛夌瓑銆?
璁惧畾璁惧鐨勬潈闄愬拰鎵€鏈夎€?/ 缁勶細udev 鍙互鎸変竴瀹氱殑鏉′欢鏉ヨ缃澶囨枃浠剁殑鏉冮檺鍜岃澶囨枃浠舵墍鏈夎€?/ 缁?
1.3 udev宸ヤ綔娴佺▼

2.聽濡備綍閰嶇疆鍜屼娇鐢╱dev
2.1 udev鐨勯厤缃枃浠?/etc/udev/udev.conf)
[[email聽protected]_RHEL4 dev]# cat /etc/udev/udev.conf
# udev.conf
# The main config file for udev
#
# This file can be used to override some of udev's default values
# for where it looks for files, and where it places device nodes.
#
# WARNING: changing any value, can cause serious system breakage!
#
# udev_root - where in the filesystem to place the device nodes
udev_root="/dev/"
# udev_db - The name and location of the udev database.
udev_db="/dev/.udev.tdb"
# udev_rules - The name and location of the udev rules file
udev_rules="/etc/udev/rules.d/"
# udev_permissions - The name and location of the udev permission file
udev_permissions="/etc/udev/permissions.d/"
# default_mode - set the default mode for all nodes that have no
# explicit match in the permissions file
default_mode="0600"
# default_owner - set the default owner for all nodes that have no
# explicit match in the permissions file
default_owner="root"
# default_group - set the default group for all nodes that have no
# explicit match in the permissions file
default_group="root"
# udev_log - set to "yes" if you want logging, else "no"
udev_log="no"
Linux 鐢ㄦ埛鍙互閫氳繃璇ユ枃浠惰缃互涓嬪弬鏁帮細
udev_root锛歶dev 浜х敓鐨勮澶囨墍瀛樻斁鐨勭洰褰曪紝榛樿鍊兼槸 /dev/銆傚缓璁笉瑕佷慨鏀硅鍙傛暟锛屽洜涓哄緢澶氬簲鐢ㄧ▼搴忛粯璁や細浠庤鐩綍璋冪敤璁惧鏂囦欢銆? udev_db锛歶dev 淇℃伅瀛樻斁鐨勬暟鎹簱鎴栬€呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /dev/.udev.tdb銆? udev_rules锛歶dev 瑙勫垯鏂囦欢鐨勫悕瀛楁垨鑰呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /etc/udev/rules.d/鎴?lib/udev/rules.d銆? udev_permissions锛歶dev 鏉冮檺鏂囦欢鐨勫悕瀛楁垨鑰呮墍鍦ㄧ洰褰曪紝榛樿鍊兼槸 /etc/udev/permissions.d/銆? default_mode/ default_owner/ default_group锛氬鏋滆澶囨枃浠剁殑鏉冮檺娌℃湁鍦ㄦ潈闄愭枃浠堕噷鎸囧畾锛屽氨浣跨敤璇ュ弬鏁颁綔涓洪粯璁ゆ潈闄愶紝榛樿鍊煎垎鍒槸锛?600/root/root銆? udev_log锛氭槸鍚﹂渶瑕?syslog璁板綍 udev 鏃ュ織鐨勫紑鍏筹紝榛樿鍊兼槸 no銆俿yslog璁板綍鏃ュ織鐨勭骇鍒紝榛樿鍊兼槸 err銆傚鏋滄敼涓?info 鎴栬€?debug 鐨勮瘽锛屼細鏈夊啑闀跨殑 udev 鏃ュ織琚褰曚笅鏉ャ€?
鍏跺疄锛屽湪鎴戜滑鐨勭粓绔笂锛寀dev閰嶇疆鏂囦欢娌℃湁閭d箞澶嶆潅锛屽洜涓哄ぇ閮ㄥ垎閮芥槸榛樿鍊硷紝鎵€浠ヤ笉鐢ㄩ厤缃紝鐪嬫垜ubuntu涓嬬殑udev閰嶇疆鏂囦欢锛?
$cat /etc/udev/udev.conf
# see udev(7) for details
#
# udevd is started in the initramfs, so when this file is modified the
# initramfs should be rebuilt.
#udev_log="info"
璇ユ枃浠堕兘鏄敞閲婏紝璇存槑閮界敤榛樿鍊笺€?
2.2 udev鐨勮鍒欏拰瑙勫垯鏂囦欢
瑙勫垯鏂囦欢鏄?udev 閲屾渶閲嶈鐨勯儴鍒嗭紝榛樿鏄瓨鏀惧湪 /etc/udev/rules.d/涓嬨€傛墍鏈夌殑瑙勫垯鏂囦欢蹇呴』浠モ€?rules鈥濅负鍚庣紑鍚嶃€?
瑙勫垯鏂囦欢閲岀殑瑙勫垯鏈変竴绯诲垪鐨勯敭/鍊煎缁勬垚锛岄敭/鍊煎涔嬮棿鐢ㄩ€楀彿(,)鍒嗗壊銆傛瘡涓€涓敭鎴栬€呮槸鐢ㄦ埛鍖归厤閿紝鎴栬€呮槸涓€涓祴鍊奸敭銆傚尮閰嶉敭纭畾瑙勫垯鏄惁琚簲鐢紝鑰岃祴 鍊奸敭琛ㄧず鍒嗛厤鏌愬€肩粰璇ラ敭銆傝繖浜涘€煎皢褰卞搷udev鍒涘缓鐨勮澶囨枃浠躲€傝祴鍊奸敭鍙互澶勭悊涓€涓鍊煎垪琛ㄣ€傚尮閰嶉敭鍜岃祴鍊奸敭鎿嶄綔绗﹁В閲婅涓嬭〃锛?
2.2.1 udev 閿?鍊煎鎿嶄綔绗?
鎿嶄綔绗?銆€銆€鍖归厤鎴栬祴鍊?銆€聽瑙i噴
锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞锛嶏紞
== 銆€銆€銆€聽鍖归厤 銆€銆€銆€銆€ 鐩哥瓑姣旇緝
!= 銆€銆€銆€ 聽鍖归厤 銆€銆€銆€ 聽聽聽涓嶇瓑姣旇緝
= 銆€銆€銆€銆€璧嬪€?銆€銆€銆€銆€聽鍒嗛厤涓€涓壒瀹氱殑鍊肩粰璇ラ敭锛屼粬鍙互瑕嗙洊涔嬪墠鐨勮祴鍊笺€? +=銆€銆€銆€聽聽璧嬪€?聽 聽 聽 聽 聽 聽 杩藉姞鐗瑰畾鐨勫€肩粰宸茬粡瀛樺湪鐨勯敭
:= 聽 聽 聽 聽 聽 璧嬪€?聽 聽 聽 聽 聽 聽 鍒嗛厤涓€涓壒瀹氱殑鍊肩粰璇ラ敭锛屽悗闈㈢殑瑙勫垯涓嶅彲鑳借鐩栧畠銆?
2.2.2 udev 瑙勫垯鐨勫尮閰嶉敭
ACTION锛?浜嬩欢 (uevent) 鐨勮涓猴紝渚嬪锛歛dd( 娣诲姞璁惧 )銆乺emove( 鍒犻櫎璁惧 )銆?
KERNEL锛?鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda, cdrom銆?
DEVPATH锛氳澶囩殑 devpath 璺緞銆?
SUBSYSTEM锛?璁惧鐨勫瓙绯荤粺鍚嶇О锛屼緥濡傦細sda 鐨勫瓙绯荤粺涓?block銆?
BUS锛?璁惧鍦?devpath 閲岀殑鎬荤嚎鍚嶇О锛屼緥濡傦細usb銆?
DRIVER锛?璁惧鍦?devpath 閲岀殑璁惧椹卞姩鍚嶇О锛屼緥濡傦細ide-cdrom銆?
ID锛?璁惧鍦?devpath 閲岀殑璇嗗埆鍙枫€?
SYSFS{filename}锛?璁惧鐨?devpath 璺緞涓嬶紝璁惧鐨勫睘鎬ф枃浠垛€渇ilename鈥濋噷鐨勫唴瀹广€?
渚嬪锛歋YSFS{model}==鈥淪T936701SS鈥濊〃绀猴細濡傛灉璁惧鐨勫瀷鍙蜂负 ST936701SS锛屽垯璇ヨ澶囧尮閰嶈 鍖归厤閿€?
鍦ㄤ竴鏉¤鍒欎腑锛屽彲浠ヨ瀹氭渶澶氫簲鏉?SYSFS 鐨?鍖归厤閿€?
ENV{key}锛?鐜鍙橀噺銆傚湪涓€鏉¤鍒欎腑锛屽彲浠ヨ瀹氭渶澶氫簲鏉$幆澧冨彉閲忕殑 鍖归厤閿€?
PROGRAM锛氳皟鐢ㄥ閮ㄥ懡浠ゃ€?
RESULT锛?澶栭儴鍛戒护 PROGRAM 鐨勮繑鍥炵粨鏋溿€備緥濡傦細
PROGRAM=="/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67"
璋冪敤澶栭儴鍛戒护 /lib/udev/scsi_id鏌ヨ璁惧鐨?SCSI ID锛屽鏋滆繑鍥炵粨鏋滀负 35000c50000a7ef67锛屽垯璇ヨ澶囧尮閰嶈 鍖归厤閿€?
2.2.3 udev 鐨勯噸瑕佽祴鍊奸敭
NAME锛氬湪 /dev涓嬩骇鐢熺殑璁惧鏂囦欢鍚嶃€傚彧鏈夌涓€娆″鏌愪釜璁惧鐨?NAME 鐨勮祴鍊艰涓虹敓鏁堬紝涔嬪悗鍖归厤鐨勮鍒欏啀瀵硅璁惧鐨?NAME 璧嬪€艰涓哄皢琚拷鐣ャ€傚鏋滄病鏈変换浣曡鍒欏璁惧鐨?NAME 璧嬪€硷紝udev 灏嗕娇鐢ㄥ唴鏍歌澶囧悕绉版潵浜х敓璁惧鏂囦欢銆?
SYMLINK锛氫负 /dev/涓嬬殑璁惧鏂囦欢浜х敓绗﹀彿閾炬帴銆傜敱浜?udev 鍙兘涓烘煇涓澶囦骇鐢熶竴涓澶囨枃浠讹紝鎵€浠ヤ负浜嗕笉瑕嗙洊绯荤粺榛樿鐨?udev 瑙勫垯鎵€浜х敓鐨勬枃浠讹紝鎺ㄨ崘浣跨敤绗﹀彿閾炬帴銆?
OWNER, GROUP, MODE锛氫负璁惧璁惧畾鏉冮檺銆?
ENV{key}锛氬鍏ヤ竴涓幆澧冨彉閲忋€?
2.2.4 udev 鐨勫€煎拰鍙皟鐢ㄧ殑鏇挎崲鎿嶄綔绗?
鍦ㄩ敭鍊煎涓殑閿拰鎿嶄綔绗﹂兘浠嬬粛瀹屼簡锛屾渶鍚庢槸鍊?(value)銆侺inux 鐢ㄦ埛鍙互闅忔剰鍦板畾鍒?udev 瑙勫垯鏂囦欢鐨勫€笺€備緥濡傦細my_root_disk, my_printer銆傚悓鏃朵篃鍙互寮曠敤涓嬮潰鐨勬浛鎹㈡搷浣滅锛?
$kernel, %k锛氳澶囩殑鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda銆乧drom銆?
$number, %n锛氳澶囩殑鍐呮牳鍙风爜锛屼緥濡傦細sda3 鐨勫唴鏍稿彿鐮佹槸 3銆?
$devpath, %p锛氳澶囩殑 devpath璺緞銆?
$id, %b锛氳澶囧湪 devpath閲岀殑 ID 鍙枫€?
$sysfs{file}, %s{file}锛氳澶囩殑 sysfs閲?file 鐨勫唴瀹广€傚叾瀹炲氨鏄澶囩殑灞炴€у€笺€? 渚嬪锛?sysfs{size} 琛ㄧず璇ヨ澶?( 纾佺洏 ) 鐨勫ぇ灏忋€?
$env{key}, %E{key}锛氫竴涓幆澧冨彉閲忕殑鍊笺€?
$major, %M锛氳澶囩殑 major 鍙枫€?
$minor %m锛氳澶囩殑 minor 鍙枫€?
$result, %c锛歅ROGRAM 杩斿洖鐨勭粨鏋溿€?
$parent, %P锛氱埗璁惧鐨勮澶囨枃浠跺悕銆?
$root, %r锛歶dev_root鐨勫€硷紝榛樿鏄?/dev/銆?
$tempnode, %N锛氫复鏃惰澶囧悕銆?
%%锛氱鍙?% 鏈韩銆?
$$锛氱鍙?$ 鏈韩銆?
3. 濡備綍缂栧啓udev瑙勫垯
鍏跺疄锛屽湪瀹夎udev鏃讹紝浼氱敓鎴愪竴绯诲垪鐨剈dev瑙勫垯鏂囦欢鏀惧湪/etc/udev/rules.d/鎴?lib/udev/rules.d/鐩綍涓嬶紝姣斿/lib/udev/rules.d/50-udev-default.rules绛夐粯璁ょ殑udev瑙勫垯鏂囦欢銆?
鎴戜滑鍙渶娣诲姞鑷繁鎯虫敼鐨剈dev瑙勫垯鏂囦欢璁╁叾鍋氭垜浠兂鍋氱殑浜嬶紝姣斿褰揢鐩樻彃鍏ユ椂锛屾垜瑕佽嚜鍔ㄦ寕杞藉畠锛堟垨鑰呭叾浠栦粈涔堝姩浣滐級锛屽叾瀹炲畨瑁呬簡udev锛屽綋U鐩樻彃鍏ユ椂锛屽畠鏈夌浉搴旂殑.rules瑙勫垯鏂囦欢鍘昏В鏋愬畠锛堝嵆udev浼氬姩鎬佺鐞嗗畠锛夛紝鍦?dev/鐩綍涓嬩骇鐢熺浉搴旂殑璁惧鏂囦欢锛屾瘮濡?dev/sda4.浣嗙幇鍦ㄦ垜闇€瑕佸湪U鐩樻彃鍏ユ椂锛屾垜鑷姩鎸傝浇瀹冿紙姣斿鎸傝浇鍒?mnt/udisk/鐩綍涓嬶級锛岄偅涔堟垜灏卞彲浠ョ紪鍐欒嚜宸辩殑udev瑙勫垯鏂囦欢automount.rules銆傝鏂囦欢濡備笅锛?
# There are a number of modifiers that are allowed to be used in some
# of the different fields. They provide the following subsitutions:
#
# %n the "kernel number" of the device.
# For example, 'sda3' has a "kernel number" of '3'
# %e the smallest number for that name which does not matches an existing node
# %k the kernel name for the device
# %M the kernel major number for the device
# %m the kernel minor number for the device
# %b the bus id for the device
# %c the string returned by the PROGRAM
# %s{filename} the content of a sysfs attribute
# %% the '%' char itself
#
# Media automounting
SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/rules.d/mount.sh"
SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/rules.d/mount.sh"
SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/rules.d/mount.sh"
璇存槑锛氬綋鏈塙鐩樼儹鎻掓嫈鏃堕兘浼氬幓璺?etc/udev/rules.d/mount.sh鑴氭湰銆傚叾涓璖UBSYSTEM=="block"锛孶鐩榮da鐨勫瓙绯荤粺灏辨槸block銆?
mount.sh濡備笅锛?
MOUNT="/bin/mount"
PMOUNT="/usr/bin/pmount"
UMOUNT="/bin/umount"
for line in `grep -v ^# /etc/udev/mount.blacklist`
do
name="`basename "$DEVNAME"`"
if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ] || [ ` expr match "$name" "$line" ` -gt 0 ]
then
logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring"
exit 0
fi
done
automount() {
name="`basename "$DEVNAME"`"
if [[ $name =~ sd ]];then
mount_dir=/mnt/udisk
! test -d $mount_dir && mkdir -p $mount_dir
elif [[ $name =~ mmcblk ]];then
mount_dir=/mnt/sdisk
! test -d $mount_dir && mkdir -p $mount_dir
fi
# Silent util-linux's version of mounting auto
if [ "x`readlink $MOUNT`" = "x/bin/mount.util-linux" ] ;
then
MOUNT="$MOUNT -o silent"
fi
# If filesystem type is vfat, change the ownership group to 'disk', and
# grant it with w/r/x permissions.
case $ID_FS_TYPE in
vfat|fat)
MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
;;
# TODO
*)
;;
esac
if ! $MOUNT -t auto -o iocharset=cp936 $DEVNAME $mount_dir
then
logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME $mount_dir failed!"
rm_dir "/run/media/$name"
else
logger "mount.sh/automount" "Auto-mount of [ $mount_dir] successful"
touch "/tmp/.automount-$name"
killall -USR1 adas.exe
fi
}
rm_dir() {
# We do not want to rm -r populated directories
if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
then
! test -z "$1" && rm -r "$1"
killall -USR1 adas.exe
else
logger "mount.sh/automount" "Not removing non-empty directory [$1]"
fi
}
# No ID_FS_TYPE for cdrom device, yet it should be mounted
name="`basename "$DEVNAME"`"
[ -e /sys/block/$name/device/media ] && media_type=`cat /sys/block/$name/device/media`
if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_type" = "cdrom" ]; then
if [ -x "$PMOUNT" ]; then
$PMOUNT $DEVNAME 2> /dev/null
elif [ -x $MOUNT ]; then
$MOUNT $DEVNAME 2> /dev/null
fi
# If the device isn't mounted at this point, it isn't
# configured in fstab (note the root filesystem can show up as
# /dev/root in /proc/mounts, so check the device number too)
if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
grep -q "^$DEVNAME " /proc/mounts || automount
fi
fi
if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
do
$UMOUNT $mnt
done
# Remove empty directories from auto-mounter
name="`basename "$DEVNAME"`"
if [[ $name =~ sd ]];then
mount_dir=/mnt/udisk
elif [[ $name =~ mmcblk ]];then
mount_dir=/mnt/sdisk
fi
test -e "/tmp/.automount-$name" && rm_dir $mount_dir
fi
杩欓噷鍙槸涓句竴涓緥瀛愯€屽凡銆傚彲浠ョ紪鍐欐垜浠兂瑕佺殑瑙勫垯鏂囦欢銆?
3.1 濡備綍缂栧啓瑙勫垯鏂囦欢鍛紵
鍏跺疄灏辨槸涓ょ偣锛氬尮閰嶉敭鍜岃祴鍊奸敭锛屽彧闇€瀹屽杽杩欎袱鐐瑰氨鍙互缂栧啓鎴戜滑鎯宠鐨勮鍒欐枃浠?
姣斿锛欿ERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
璇ヨ鍒欒鏄庯細濡傛灉鏈変竴涓澶囩殑鍐呮牳璁惧鍚嶇О涓簍ty(KERNEL=="tty")锛岄偅涔堣缃柊鐨勬潈闄愪负0600(MODE="0666")锛屾墍鍦ㄧ殑缁勬槸tty(GROUP="tty")銆傚畠涔熻缃簡涓€涓壒鍒殑璁惧鏂囦欢鍚?%K銆傚湪杩欓噷渚嬪瓙閲岋紝%k浠h〃璁惧鐨勫唴鏍稿悕瀛椼€傞偅涔熷氨鎰忓懗鐫€鍐呮牳璇嗗埆鍑鸿繖浜涜澶囨槸浠€涔堝悕瀛楋紝灏卞垱寤轰粈涔堟牱鐨勮澶囨枃浠跺悕銆?
鍦ㄨ繖閲屽氨鏄瀹屽杽涓ょ偣,鍖归厤閿甂ERNEL=="tty";璧嬪€奸敭NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
鍏跺疄鍏抽敭鏄濡備綍鎵惧埌璁惧鐨勫睘鎬у憿锛屽嵆鎷夸粈涔堝尯鍖归厤锛岃鍒欐墍闇€瑕佺殑淇℃伅濡備綍鑾峰彇锛?
鍙互鍒╃敤udev鐨勫懡浠わ細姣斿udevadm info -a -p $(udevadm info -q path -n /dev/sda4). 鍏朵腑udevadm info -q path -n /dev/sda4杩斿洖sysfs涓殑璁惧璺緞锛泆devadm info -a -p $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細
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:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb/sdb4':
KERNEL=="sdb4"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="15177600"
ATTR{stat}==" 202 382 1562 212 0 0 0 0 0 164 212"
ATTR{partition}=="4"
ATTR{start}=="14880"
ATTR{discard_alignment}=="0"
ATTR{alignment_offset}=="0"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{ro}=="0"
ATTRS{size}=="15204352"
ATTRS{stat}==" 295 382 2306 1208 0 0 0 0 0 1156 1204"
ATTRS{range}=="16"
ATTRS{discard_alignment}=="0"
ATTRS{events}=="media_change"
ATTRS{ext_range}=="256"
ATTRS{events_poll_msecs}=="2000"
ATTRS{alignment_offset}=="0"
ATTRS{inflight}==" 0 0"
ATTRS{removable}=="1"
ATTRS{capability}=="51"
ATTRS{events_async}==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0':
KERNELS=="18:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{rev}=="1.00"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{model}==" "
ATTRS{state}=="running"
ATTRS{queue_type}=="none"
ATTRS{iodone_cnt}=="0x152"
ATTRS{iorequest_cnt}=="0x152"
ATTRS{device_busy}=="0"
ATTRS{evt_capacity_change_reported}=="0"
ATTRS{timeout}=="30"
ATTRS{evt_media_change}=="0"
ATTRS{max_sectors}=="240"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{queue_depth}=="1"
ATTRS{vendor}==" "
ATTRS{evt_soft_threshold_reached}=="0"
ATTRS{device_blocked}=="0"
ATTRS{evt_mode_parameter_change_reported}=="0"
ATTRS{evt_lun_change_reported}=="0"
ATTRS{evt_inquiry_change_reported}=="0"
ATTRS{iocounterbits}=="32"
ATTRS{eh_timeout}=="10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0':
KERNELS=="target18:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18':
KERNELS=="host18"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0':
KERNELS=="1-8:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{bNumEndpoints}=="02"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8':
KERNELS=="1-8"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="8"
ATTRS{idVendor}=="1516"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="17"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="500mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0100"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="1001"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="SKYMEDI"
ATTRS{removable}=="removable"
ATTRS{idProduct}=="1226"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="USB Drive"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="15"
ATTRS{bcdDevice}=="0402"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:14.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="348"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 4.2.0-42-generic xhci-hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="xHCI Host Controller"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{irq}=="27"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="f"
ATTRS{device}=="0x8c31"
ATTRS{enable}=="1"
ATTRS{msi_bus}=="1"
ATTRS{local_cpulist}=="0-3"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x05a5"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
浠庝腑鍙互寰楀埌KERNEL,SUBSYSTEM绛変俊鎭紝杩欐牱灏卞彲浠ュ埄鐢ㄨ繖浜涘睘鎬у€煎幓鍖归厤銆傚叾瀹炴垜浠彲浠ヤ粠閭i噷鐪嬪埌鈥渓ooking at parent device鈥濇槸涓€灞傚線涓€灞傛墦鍗板嚭璇ヨ澶囩殑淇℃伅銆?
杩欐牱鎴戜滑灏卞彲浠ERNEL=="sdb4", SUBSYSTEM=="block"鍘诲尮閰嶏紝姣斿鍐檜dev瑙勫垯濡備笅锛?
KERNEL=="sdb4", SUBSYSTEM=="block",聽RUN+="/etc/udev/rules.d/mount.sh"
4. 瀛楃涓叉浛鎹㈠拰鍖归厤
4.1 瀛楃涓叉浛鎹?
$kernel,聽%k锛氳澶囩殑鍐呮牳璁惧鍚嶇О锛屼緥濡傦細sda銆乧drom銆?
$number,聽%n锛氳澶囩殑鍐呮牳鍙风爜锛屼緥濡傦細sda3 鐨勫唴鏍稿彿鐮佹槸 3銆?
$devpath,聽%p锛氳澶囩殑 devpath璺緞銆?
$id,聽%b锛氳澶囧湪 devpath閲岀殑 ID聽鍙枫€?
$sysfs{file},聽%s{file}锛氳澶囩殑 sysfs閲?file 鐨勫唴瀹广€傚叾瀹炲氨鏄澶囩殑灞炴€у€笺€?
渚嬪锛?sysfs{size} 琛ㄧず璇ヨ澶?( 纾佺洏 ) 鐨勫ぇ灏忋€?
$env{key},聽%E{key}锛氫竴涓幆澧冨彉閲忕殑鍊笺€?
$major,聽%M锛氳澶囩殑 major 鍙枫€?
$minor聽%m锛氳澶囩殑 minor 鍙枫€?
$result,聽%c锛歅ROGRAM 杩斿洖鐨勭粨鏋?
$parent,聽%P锛氱埗璁惧鐨勮澶囨枃浠跺悕銆?
$root,聽%r锛歶dev_root鐨勫€硷紝榛樿鏄?/dev/銆?
$tempnode,聽%N锛氫复鏃惰澶囧悕銆?
%%锛氱鍙?% 鏈韩銆?
$$锛氱鍙?$ 鏈韩銆?
渚嬪瓙濡備笅锛?
KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负fb[0-9]鐨勮澶囷紝鐒跺悗缁欏畠鍛藉悕涓篺b/%n锛岀鍙烽摼鎺ヤ负%k
姣斿鏈変竴涓猣b3璁惧锛屽尮閰嶆垚鍔熷悗閭d箞涔呮湁涓€涓悕涓篺b/3,绗﹀彿閾炬帴涓篺b3
4.2 瀛楃涓插尮閰?
涓嶄粎鏈夊瓧绗︿覆绮剧‘鍖归厤, udev涔熷厑璁镐綘浣跨敤shell椋庢牸鐨勬ā寮忓尮閰? 鏀寔鐨?绉嶆ā寮忎负:
* - 鍖归厤浠讳綍瀛楃, 鍖归厤0娆℃垨澶氭
? - 鍖归厤浠讳綍瀛楃,浣嗗彧鍖归厤涓€娆?
[] - 鍖归厤浠讳綍鍗曚釜瀛楃, 杩欎簺瀛楃鍦ㄦ柟鎷彿閲岄潰鎸囧畾, 鑼冨洿鏄彈闄愮殑.
杩欓噷鏈変竴浜涗緥瀛? 娉ㄦ剰瀛楃涓叉浛鎹㈢鐨勪娇鐢?
KERNEL=="fd[0-9]*", NAME="floppy/%n", SYMLINK+="%k"
KERNEL=="hiddev*", NAME="usb/%k"
绗竴鏉¤鍒欏尮閰嶆墍鏈夎蒋鐩橀┍鍔ㄥ苟纭繚璁惧鑺傜偣鏀剧疆鍦?dev/floppy鐩綍涓? 涔熷垱寤轰竴涓己鐪佸悕瀛楃殑绗﹀彿閾炬帴. 绗簩鏉¤鍒欑‘淇漢iddev璁惧鑺傜偣鏀惧湪/dev/usb鐩綍涓嬮潰.
5. udev涓昏浣滅敤
- 閲嶅懡鍚嶈澶囪妭鐐圭殑缂虹渷鍚嶅瓧涓哄叾浠栧悕瀛?/li>
- 閫氳繃鍒涘缓绗﹀彿閾炬帴鍒扮己鐪佽澶囪妭鐐规潵鎻愪緵涓€涓彲閫夌殑鍥哄畾鐨勮澶囪妭鐐瑰悕瀛?/li>
- 鍩轰簬绋嬪簭鐨勮緭鍑哄懡鍚嶈澶囪妭鐐?/li>
- 鏀瑰彉璁惧鑺傜偣鐨勬潈闄愬拰鎵€鏈夋潈
- 鍦ㄨ澶囪妭鐐硅鍒涘缓鎴栧垹闄ゆ椂(閫氬父鏄坊鍔犺澶囨垨鎷斿嚭璁惧鏃?鎵ц涓€涓剼鏈?/li>
- 閲嶅懡鍚嶇綉缁滄帴鍙?/li>
5.1聽閲嶅懡鍚嶈澶囪妭鐐圭殑缂虹渷鍚嶅瓧涓哄叾浠栧悕瀛?
姝ゆ椂浣跨敤NAME璧嬪€奸敭锛屼緥瀛愬涓嬶細
涓€涓‖鐩橈紝瀹冪殑璁惧灞炴€ERNEL鏄痟db锛屽湪/dev/鐩綍涓嬫槸/dev/hdb锛岄偅涔堟垜浠彲浠ョ粰浠栭噸鍛藉悕涓?
KERNEL=="hdb", NAME="my_spare_disk"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓澶囧懡鍚嶄负hdb鐨勮澶?鎶婂畠閲嶆柊鍛藉悕涓簃y_spare_disk. 璁惧鑺傜偣鍑虹幇鍦?dev/my_spare_disk
鎵ц浠ヤ笅鍛戒护锛歭s /dev/my_spare_disk -l
/dev/my_spare_disk ---> /dev/hdb浜х敓涓€涓鍙烽摼鎺ユ寚鍚?dev/hdb
娉ㄦ剰锛氫粎浠呯涓€琛岀殑NAME鎻忚堪鏄湁鏁堢殑锛屽悗闈㈢殑鍧囧拷鐣ャ€傚嵆udev鎸夐『搴忚В鏋恥dev瑙勫垯鏂囦欢鏃讹紝绗竴涓狽AME璧嬪€奸敭鐨勫悕瀛楁湁鐢紝鍋囧鍚庨潰瀵瑰悓涓€涓澶囪繕鏈塏AME璧嬪€奸敭锛岄偅涔堥偅涓祴鍊肩殑鍚嶇О灏嗚蹇界暐銆傚鏋滀綘鎯充娇鐢ㄤ娇鐢ㄤ袱涓互涓婄殑鍚嶅瓧鏉ヨ闂竴涓澶囩殑璇濓紝鍙互鑰冭檻SYMLINK閿€?
濡傛灉浣犳兂浣犲懡鍚嶇殑鍚嶅瓧寰楀埌瀹炵幇锛屼綘蹇呴』鎶婁綘鐨勮鍒欐枃浠跺懡鍚嶉『搴忓湪鍓嶉潰銆?
5.2聽閫氳繃鍒涘缓绗﹀彿閾炬帴鍒扮己鐪佽澶囪妭鐐规潵鎻愪緵涓€涓彲閫夌殑鍥哄畾鐨勮澶囪妭鐐瑰悕瀛?
渚嬪瓙濡備笅锛?
KERNEL=="hdb", DRIVER=="ide-disk", SYMLINK+="sparedisk"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负hdb浠ュ強椹卞姩涓篿de-disk鐨勮澶囷紝鍛藉悕璁惧鑺傜偣涓虹己鐪佸悕瀛楀苟鍒涘缓涓€涓寚鍚戝畠鐨剆paredisk绗﹀彿閾炬帴锛岃澶囪妭鐐瑰嚭鐜板湪/dev/sparedisk
娉ㄦ剰锛氱鍙烽摼鎺ュ彲浠ユ槸澶氫釜锛岃繖浜涚鍙烽摼鎺ラ兘鎸囧悜/dev/hdb
5.3聽鍩轰簬绋嬪簭鐨勮緭鍑哄懡鍚嶈澶囪妭鐐?
鏌愪簺鎯呭喌涓嬩綘鍙兘瑕佹眰姣攗dev鏍囧噯瑙勫垯鎻愪緵鐨勬洿澶氬脊鎬? 杩欑鎯呭喌涓嬩綘鍙互璇锋眰udev杩愯涓€涓▼搴忓苟杩愮敤绋嬪簭鐨勬爣鍑嗚緭鍑烘潵鎻愪緵璁惧鍛藉悕.
瑕佷娇鐢ㄨ繖涓姛鑳?浣犲彧闇€绠€鍗曠殑鍦≒ROGRAM璧嬪€间腑鎸囧畾瑕佽繍琛岀▼搴?浠ュ強浠讳綍闃愯堪)鐨勫畬鏁磋矾寰? 鐒跺悗鍦∟AME/SYMLINK璧嬪€间腑浣跨敤涓€浜?c鏇挎崲.
渚嬪瓙濡備笅锛?
寮曠敤涓€涓綅浜?bin/device_namer鐨勮櫄鏋勭▼搴? device_namer甯︿竴涓〃绀哄唴鏍稿悕瀛楃殑鍛戒护琛屽弬鏁? 鍩轰簬鍐呮牳鍚峝evice_namer鍋氫竴浜涘彉鍖栫劧鍚庤緭鍑?
KERNEL=="hda", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负hdb鐨勮澶囷紝鐒跺悗杩愯涓€涓?bin/device_name绋嬪簭锛岃繖涓▼搴忛渶瑕佸甫涓€涓〃绀哄唴鏍稿悕瀛楃殑鍛戒护琛屽弬鏁板嵆%k銆傜劧鍚庤繖涓▼搴忚繍琛岀殑缁撴灉锛堝嵆杈撳嚭锛夋妸瀹冭祴鍊肩粰SYMLINK锛岃繖鏍峰氨鍙互婊¤冻瑕佹眰锛堜娇鐢ㄥ閮ㄧ▼搴忔潵鍛藉悕璁惧锛?
4.4聽鏀瑰彉璁惧鑺傜偣鐨勬潈闄愬拰鎵€鏈夋潈
udev鍏佽浣犲湪瑙勫垯涓娇鐢ㄥ彟澶栫殑璧嬪€兼潵鎺у埗姣忎釜璁惧鐨勬墍鏈夋潈鍜屾潈闄愬睘鎬?
渚嬪瓙濡備笅锛?
KERNEL=="fb[0-9]*", NAME="fb/%n", SYMLINK+="%k", GROUP="video", MODE="0666"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿懡鍚嶄负fb[0-9]鐨勮澶囷紝鐒跺悗缁欏畠鍛藉悕涓篺b/%n,绗﹀彿閾炬帴涓?k, 灞炰簬video缁? 鏉冮檺涓?666
姣斿鏈変竴涓猣b3璁惧锛屽尮閰嶆垚鍔熷悗閭d箞涔呮湁涓€涓悕涓篺b/3,绗﹀彿閾炬帴涓篺b3锛屽睘缁勪负video锛屾潈闄愪负0666
5.5 鍦ㄨ澶囪妭鐐硅鍒涘缓鎴栧垹闄ゆ椂(閫氬父鏄坊鍔犺澶囨垨鎷斿嚭璁惧鏃?鎵ц涓€涓剼鏈?
鐗瑰埆閽堝鐑彃鎷旂殑璁惧锛岀洰鐨勬槸涓轰簡鍦ㄨ澶囪繛鎺ユ垨鑰呮柇寮€鏃惰繍琛屼竴涓壒瀹氱▼搴? 渚嬪, 浣犲彲鑳芥兂鍦ㄤ綘鐨勬暟鐮佺浉鏈鸿繛鍒扮郴缁熸椂鎵ц涓€涓剼鏈潵鑷姩涓嬭浇鐩告満閲岄潰鐨勬墍鏈夌収鐗?
渚嬪瓙濡備笅锛?
KERNEL=="sdb", ACTION=="add", RUN+="/usr/bin/my_program"
瑙勫垯鎰忔€濇槸锛氬尮閰嶄竴涓唴鏍稿悕涓簊db鐨勮澶囷紝褰撴彃鍏ユ椂锛屾墽琛岀▼搴?usr/bin/my_program
5.6聽閲嶅懡鍚嶇綉缁滄帴鍙?
鍦ㄨ鍒欎腑绠€鍗曠殑鍖归厤缃戝崱MAC鍦板潃鏄湁鎰忎箟鐨?鍥犱负瀹冧滑鏄敮涓€鐨?聽
# udevadm info -a -p /sys/class/net/eth0
looking at class device '/sys/class/net/eth0':
KERNEL=="eth0"
ATTR{address}=="00:52:8b:d5:04:48"
瑙勫垯濡備笅:
KERNEL=="eth*", ATTR{address}=="00:52:8b:d5:04:48", NAME="lan"
杩欐牱灏遍噸鍛藉悕浜唀th*涓簂an
6. 缂栧啓udev瑙勫垯瀹炰緥
USB鎵撳嵃鏈? 鎴戝惎鍔ㄦ垜鐨勬墦鍗版満, 瀹冨氨琚祴浜堜簡涓€涓澶囪妭鐐?dev/lp0. 鎴戝杩欐牱鐨勫崟璋冪殑鍚嶅瓧涓嶆弧鎰忓苟鎵撶畻浣跨敤udevinfo甯垜鍐欎竴涓鍒欐潵鎻愪緵涓€涓彲閫夊悕瀛?
# udevinfo -a -p $(udevinfo -q path -n /dev/lp0)
looking at device '/class/usb/lp0':
KERNEL=="lp0"
SUBSYSTEM=="usb"
DRIVER==""
ATTR{dev}=="180:0"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1':
SUBSYSTEMS=="usb"
ATTRS{manufacturer}=="EPSON"
ATTRS{product}=="USB Printer"
ATTRS{serial}=="L72010011070626380"
鎴戠殑瑙勫垯鍙樻垚浜嗚繖鏍?
SUBSYSTEM=="usb", ATTRS{serial}=="L72010011070626380", SYMLINK+="epson_680"
7. 闅剧偣瑙f瀽
7.1 ATTR
ATTR{value}銆€銆€sysfs璁惧灞炴€у€硷紝鍙互涓轰换鎰忓€硷紝鐢ㄤ簬鍖归厤
鍙互鍒╃敤udev鐨勫懡浠わ細姣斿udevadm info -a -p $(udevadm info -q path -n /dev/sda4). 鍏朵腑udevadm info -q path -n /dev/sda4杩斿洖sysfs涓殑璁惧璺緞锛泆devadm info -a -p $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細
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:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb/sdb4':
KERNEL=="sdb4"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="15177600"
ATTR{stat}==" 202 382 1562 212 0 0 0 0 0 164 212"
ATTR{partition}=="4"
ATTR{start}=="14880"
ATTR{discard_alignment}=="0"
ATTR{alignment_offset}=="0"
ATTR{inflight}==" 0 0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0/block/sdb':
KERNELS=="sdb"
SUBSYSTEMS=="block"
DRIVERS==""
ATTRS{ro}=="0"
ATTRS{size}=="15204352"
ATTRS{stat}==" 295 382 2306 1208 0 0 0 0 0 1156 1204"
ATTRS{range}=="16"
ATTRS{discard_alignment}=="0"
ATTRS{events}=="media_change"
ATTRS{ext_range}=="256"
ATTRS{events_poll_msecs}=="2000"
ATTRS{alignment_offset}=="0"
ATTRS{inflight}==" 0 0"
ATTRS{removable}=="1"
ATTRS{capability}=="51"
ATTRS{events_async}==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0/18:0:0:0':
KERNELS=="18:0:0:0"
SUBSYSTEMS=="scsi"
DRIVERS=="sd"
ATTRS{rev}=="1.00"
ATTRS{type}=="0"
ATTRS{scsi_level}=="3"
ATTRS{model}==" "
ATTRS{state}=="running"
ATTRS{queue_type}=="none"
ATTRS{iodone_cnt}=="0x152"
ATTRS{iorequest_cnt}=="0x152"
ATTRS{device_busy}=="0"
ATTRS{evt_capacity_change_reported}=="0"
ATTRS{timeout}=="30"
ATTRS{evt_media_change}=="0"
ATTRS{max_sectors}=="240"
ATTRS{ioerr_cnt}=="0x1"
ATTRS{queue_depth}=="1"
ATTRS{vendor}==" "
ATTRS{evt_soft_threshold_reached}=="0"
ATTRS{device_blocked}=="0"
ATTRS{evt_mode_parameter_change_reported}=="0"
ATTRS{evt_lun_change_reported}=="0"
ATTRS{evt_inquiry_change_reported}=="0"
ATTRS{iocounterbits}=="32"
ATTRS{eh_timeout}=="10"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18/target18:0:0':
KERNELS=="target18:0:0"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/host18':
KERNELS=="host18"
SUBSYSTEMS=="scsi"
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0':
KERNELS=="1-8:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usb-storage"
ATTRS{bInterfaceClass}=="08"
ATTRS{bInterfaceSubClass}=="06"
ATTRS{bInterfaceProtocol}=="50"
ATTRS{bNumEndpoints}=="02"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8':
KERNELS=="1-8"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="8"
ATTRS{idVendor}=="1516"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="17"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="500mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0100"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="1001"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="SKYMEDI"
ATTRS{removable}=="removable"
ATTRS{idProduct}=="1226"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="USB Drive"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="01"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="15"
ATTRS{bcdDevice}=="0402"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:14.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="348"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 4.2.0-42-generic xhci-hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="xHCI Host Controller"
looking at parent device '/devices/pci0000:00/0000:00:14.0':
KERNELS=="0000:00:14.0"
SUBSYSTEMS=="pci"
DRIVERS=="xhci_hcd"
ATTRS{irq}=="27"
ATTRS{subsystem_vendor}=="0x1028"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0330"
ATTRS{driver_override}=="(null)"
ATTRS{consistent_dma_mask_bits}=="64"
ATTRS{dma_mask_bits}=="64"
ATTRS{local_cpus}=="f"
ATTRS{device}=="0x8c31"
ATTRS{enable}=="1"
ATTRS{msi_bus}=="1"
ATTRS{local_cpulist}=="0-3"
ATTRS{vendor}=="0x8086"
ATTRS{subsystem_device}=="0x05a5"
ATTRS{numa_node}=="-1"
ATTRS{d3cold_allowed}=="1"
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
鏌ユ壘涓婇潰淇℃伅锛屽氨鍙互鍒╃敤ATTR浠讳綍鍊兼潵鍖归厤锛屾瘮濡侫TTR{size}=="15177600", ATTR{start}=="14880"绛夌瓑鏉ュ尮閰嶉兘鍙互
7.2 ENV
ENV{ key}銆€銆€鐜鍙橀噺锛屽彲浠ヨ〃绀轰换鎰?
鐢ㄤ簬璧嬪€煎拰鍖归厤閮藉彲浠?
渚嬪瓙濡備笅锛?
鍏堣祴鍊间竴涓狤NV锛岀劧鍚庡啀鐢ㄥ畠鏉ュ尮閰?
璧嬪€间竴涓狤NV锛?
KERNEL=="sda4", ENV{test_value}="value", SYMLINK+="udisk4"
杩欐牱灏辫祴鍊间簡涓€涓狤NV{test_value}涓簐alue锛岄偅涔堝彲浠ュ湪鍒殑璁惧鍖归厤鏃跺紩鐢ㄩ偅涓狤NV杩涜鍖归厤
鍖归厤ENV锛?
SUBSYSTEM=="block", ENV{test_value}=="value", NAME="hda"
鍖归厤ENV{test_value},骞朵笖鍖归厤鎴愬姛锛屾墍浠ヤ細杩涜鍛藉悕
鑻UBSYSTEM=="block", ENV{test_value}=="test", NAME="hda"
鍖归厤ENV{test_value},浣嗗尮閰嶅け璐ワ紝鎵€浠ヤ笂闈㈣繖鏉¤鍒欎笉鎵ц