天天看点

udev规则以及编写

涓昏鍐呭锛?

  • 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宸ヤ綔娴佺▼

udev规则以及编写

2.聽濡備綍閰嶇疆鍜屼娇鐢╱dev

2.1 udev鐨勯厤缃枃浠?/etc/udev/udev.conf)

udev规则以及编写
[[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"      
udev规则以及编写

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閰嶇疆鏂囦欢锛?

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"      
udev规则以及编写

璇ユ枃浠堕兘鏄敞閲婏紝璇存槑閮界敤榛樿鍊笺€?

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銆傝鏂囦欢濡備笅锛?

udev规则以及编写
# 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"      
udev规则以及编写

璇存槑锛氬綋鏈塙鐩樼儹鎻掓嫈鏃堕兘浼氬幓璺?etc/udev/rules.d/mount.sh鑴氭湰銆傚叾涓璖UBSYSTEM=="block"锛孶鐩榮da鐨勫瓙绯荤粺灏辨槸block銆?

mount.sh濡備笅锛?

udev规则以及编写
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      
udev规则以及编写

杩欓噷鍙槸涓句竴涓緥瀛愯€屽凡銆傚彲浠ョ紪鍐欐垜浠兂瑕佺殑瑙勫垯鏂囦欢銆?

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 $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細

udev规则以及编写
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==""      
udev规则以及编写

浠庝腑鍙互寰楀埌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宸ヤ綔娴佺▼

udev规则以及编写

2.聽濡備綍閰嶇疆鍜屼娇鐢╱dev

2.1 udev鐨勯厤缃枃浠?/etc/udev/udev.conf)

udev规则以及编写
[[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"      
udev规则以及编写

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閰嶇疆鏂囦欢锛?

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"      
udev规则以及编写

璇ユ枃浠堕兘鏄敞閲婏紝璇存槑閮界敤榛樿鍊笺€?

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銆傝鏂囦欢濡備笅锛?

udev规则以及编写
# 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"      
udev规则以及编写

璇存槑锛氬綋鏈塙鐩樼儹鎻掓嫈鏃堕兘浼氬幓璺?etc/udev/rules.d/mount.sh鑴氭湰銆傚叾涓璖UBSYSTEM=="block"锛孶鐩榮da鐨勫瓙绯荤粺灏辨槸block銆?

mount.sh濡備笅锛?

udev规则以及编写
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      
udev规则以及编写

杩欓噷鍙槸涓句竴涓緥瀛愯€屽凡銆傚彲浠ョ紪鍐欐垜浠兂瑕佺殑瑙勫垯鏂囦欢銆?

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 $(璁惧璺緞)锛岃繖灏嗘煡璇㈣繖涓澶囪矾寰勶紝鎶婄粨鏋滀俊鎭緭鍑烘潵锛氬涓嬶細

udev规则以及编写
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==""      
udev规则以及编写

浠庝腑鍙互寰楀埌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规则以及编写
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==""      
udev规则以及编写

鏌ユ壘涓婇潰淇℃伅锛屽氨鍙互鍒╃敤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},浣嗗尮閰嶅け璐ワ紝鎵€浠ヤ笂闈㈣繖鏉¤鍒欎笉鎵ц

继续阅读