涓昏鍐呭锛?
- 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},浣嗗尮閰嶅け璐ワ紝鎵€浠ヤ笂闈㈣繖鏉¤鍒欎笉鎵ц