中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux6.5 udev指的是什么

發布時間:2023-04-10 11:32:37 來源:億速云 閱讀:114 作者:iii 欄目:建站服務器

本篇內容介紹了“linux6.5 udev指的是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

linux 6.5 udev是Linux內核的設備管理器;它主要的功能是管理“/dev”目錄底下的設備節點,它同時也是用來接替devfs(設備文件系統)及hotplug(熱拔插)的功能;在傳統的Linux系統中,“/dev”目錄下的設備節點為一系列靜態存在的文件,而“udev”則動態提供了在系統中實際存在的設備節點。

linux 6.5 udev是什么?

udev udevadm介紹及linux設備重命名和自動掛載應用實例分析

(一)UDEV介紹

udev在維基百科中的定義是:udev (userspace /dev) is a device manager for the Linux kernel. As the successor of devfsd and hotplug, udev primarily manages device nodes in the /dev directory. At the same time, udev also handles all user space events raised when hardware devices are added into the system or removed from it, including firmware loading as required by certain devices。用中文來說就是:udev是Linux內核的設備管理器。它主要的功能是管理/dev目錄底下的設備節點。它同時也是用來接替devfs(設備文件系統)及hotplug(熱拔插)的功能,這意味著它要在添加/刪除硬件時處理/dev目錄以及所有用戶空間的行為,包括加載firmware時。

(1)udev概要:

在傳統的Linux系統中,/dev目錄下的設備節點為一系列靜態存在的文件,而udev則動態提供了在系統中實際存在的設備節點。雖然devfs提供了類似功能,但udev有比devfs更加好的地方:

  • udev支持設備的固定命名,而并不依賴于設備插入系統的順序。默認的udev設置提供了存儲設備的固定命名。可以使用其vid(vendor)、pid(device)、設備名稱(model)等屬性或其父設備的對應屬性來確認某一設備。

  • udev完全在用戶空間執行,而不是像devfs在內核空間一樣執行。結果就是udev將命名策略從內核中移走,并可以在節點創建前用任意程序在設備屬性中為設備命名。

(2)udev運行方式:

udev是一個通用的內核設備管理器。它以守護進程的方式運行于Linux系統,并監聽在新設備初始化或設備從系統中移除時,內核(通過netlink socket)所發出的uevent。
    系統提供了一套規則用于匹配可發現的設備事件和屬性的導出值。匹配規則可能命名并創建設備節點,并運行配置程序來對設備進行設置。udev規則可以匹配像內核子系統、內核設備名稱、設備的物理等屬性,或設備序列號的屬性。規則也可以請求外部程序提供信息來命名設備,或指定一個永遠一樣的自定義名稱來命名設備,而不管設備什么時候被系統發現.

(3)udev系統架構:

udev系統可以分為三個部分:

  • libudev函數庫,可以用來獲取設備的信息。

  • udevd守護進程,處于用戶空間,用于管理虛擬/dev

  • 管理命令udevadm,用來診斷出錯情況。

系統獲取內核通過netlink socket發出的信息。早期的版本使用hotplug,并在/etc/hotplug.d/default添加一個鏈接到自身來達到目的。

(二)udevadm 命令介紹

在Linux man page 中它是這么描述的。udevadm - udev management tool 。也就是說udevadm命令是管理udev的一個工具。實際我們如果要實現設備的重命名或是設備的自動掛載,我們也是使用udevadm來查看和跟蹤udev的信息。
    udevadm可以用來監視和控制udev運行時的行為,請求內核事件,管理事件隊列,以及提供簡單的調試機制。

(1)udevadm主命令:

  • info      查詢sysfs或者udev的數據庫

  • trigger 從內核請求events

  • settle   查看udev事件隊列,如果所有的events已處理則退出

  • control  修改udev后臺的內部狀態信息

  • monitor 監控內核的uevents

  • hwdb    處理硬件數據庫索引

  • test      調試

(2)命令應用:

(a)查看設備信息:

udevadm info --query=all --name=sda 查詢sda的所有信息
udevadm info --query=path --name=sda 查看sda的path
udevadm info --attribute-walk --name=/dev/nvme0n1  查看nvme0n1的所有父設備一直到sysfs的根節點

--query=type     從數據庫中查詢指定類型的設備。需要--path和--name來指定設備。合法的查詢文件是:設備名,鏈接,路徑,屬性
--path=devpath      設備的路徑
--name=file       設備節點或者鏈接
--attribute-walk    打印指定設備的所有sysfs記錄的屬性,以用來udev規則匹配特殊的設備。該選項打印鏈上的所有設備信息,最大可能到sys目錄。
--device-id-of-file=file 打印主/從設備號
--export-db       輸出udev數據庫中的內容

(b)監控設備事件:

udevadm monitor [options] 監聽內核事件和udev發送的events事件。打印事件發出的設備。可以通過比較內核或者udev事件的時間戳來分析事件時序。

udevadm monitor --property   輸出事件的屬性
udevadm monitor --kernel --property --subsystem-match=usb    過濾監聽符合條件的時間

--kernel  輸出內核事件
--udev  輸出udev規則執行時的udev事件
--property  輸出事件的屬性
--subsystem-match=string  通過子系統或者設備類型過濾事件。只有匹配了子系統值的udev設備事件通過。
--tag-match=string  通過屬性過濾事件,只有匹配了標簽的udev事件通過。

(c)模擬一個udev事件

udevadm test [options] devpath  模擬一個udev事件,打印出debug信息。

(d)接收內核發送來的設備事件

udevadm trigger [options]  接收內核發送來的設備事件。主要用于重放coldplug事件信息
(內核在啟動時已經檢測到了系統的硬件設備,并把硬件設備信息通過sysfs內核虛擬文件系統導出。udev掃描sysfs文件系統,根據硬件設備信息生成熱插拔(hotplug)事件,udev再讀取這些事件,生成對應的硬件設備文件。由于沒有實際的硬件插拔動作,所以這一過程被稱為coldplug。)
--verbose     輸出將要被觸發的設備列表。
--dry-run      不真的觸發事件
--type=type     觸發一個特殊的設備。合法的類型:devices,subsystem,failed.默認是devices
--action=action  被觸發的事件,默認是change
--subsystem-match=subsystem  觸發匹配子系統的設備事件。這個選項可以被多次指定,并且支持shell模式匹配。
--attr-match=attribute=value     觸發匹配sysfs屬性的設備事件。如果屬性值和屬性一起指定,屬性的值可以使用shell模式匹配。如果沒有指定值,會重新確認現有屬性。這個選項可以被多次指定。
--attr-nomatch=attribute=value   不要觸發匹配屬性的設備事件。如果可以使用模式匹配。也可以多次指定
--property-match=property=value 匹配屬性吻合的設備。可以多次指定支持模式匹配
--tag-match=property       匹配標簽吻合的設備。可以多次指定。
--sysname-match=name     匹配sys設備名相同的設備。可以多次指定支持模式匹配。

(e)查看udev事件隊列

udevadm settle [options]  查看udev事件隊列,如果所有事件全部處理完就退出。
--timeout=seconds     等待事件隊列空的最大時間。默認是180秒。如果是0則立即退出。
--seq-start=seqnum     只等待到給定的順序號。
--seq-end=seqnum    只等待到給定順序號之前。
--exit-if-exists=file      如果文件存在就退出
--quiet    不輸出任何信息

(二)應用實例:

使用udev實現USB,SD卡設備的重命名、自動掛載、自動卸載。

該功能的簡單應用可以參考另外一博客《udev 重命名設備節點名 自動掛載、卸載存儲設備分區》

在本文中主要記錄在使用時遇到的問題以及注意事項。

(三)注意事項:

(1)設備沖突問題:

在海思平臺,對于有些SD卡或是USB自動掛載有些時候會出現沖突的問題,問題現象就是自動掛載的時候有時候有時候U盤和SD卡自動掛載相互干擾。主要原因點是因為海思的HI35XX的很多設備不具備SDIO總線,所以如果要使用SD的設備,一般都是將SD卡通過讀卡器轉換為USB總線信號。對于對于這類問題,可以通過SD卡的讀卡器ID來區分是USB還是SD卡設備。

在海思平臺可以使用下面命令查看USB設備信息:

lsusb:

~ # lsusb
Bus 001 Device 002: ID 1c9e:9b3c
Bus 001 Device 003: ID 05e3:0610
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 008: ID 0951:1642
Bus 001 Device 009: ID 05e3:0716
Bus 001 Device 006: ID 0bda:8176
~ #

cat device

~ # cat /sys/kernel/debug/usb/devices 
T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12   MxCh= 2
B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 1.10 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0001 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ohci_hcd
S:  Product=HIUSB OHCI
S:  SerialNumber=hiusb-ohci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=255ms

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 2
B:  Alloc=  0/800 us ( 0%), #Int=  5, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 3.10
S:  Manufacturer=Linux 3.10.0 ehci_hcd
S:  Product=HIUSB EHCI
S:  SerialNumber=hiusb-ehci
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms

T:  Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  2 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1c9e ProdID=9b3c Rev= 3.18
S:  Manufacturer=LONGSUNG
S:  Product=USB Modem
C:* #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=option
E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=83(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=85(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=84(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=option
E:  Ad=87(I) Atr=03(Int.) MxPS=  10 Ivl=32ms
E:  Ad=86(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=GobiNet
E:  Ad=89(I) Atr=03(Int.) MxPS=   8 Ivl=32ms
E:  Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=480  MxCh= 4
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=02 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0610 Rev=32.98
S:  Product=USB2.0 Hub
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=01 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms
I:* If#= 0 Alt= 1 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=02 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   1 Ivl=256ms

T:  Bus=01 Lev=02 Prnt=03 Port=00 Cnt=01 Dev#=  8 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0951 ProdID=1642 Rev= 1.00
S:  Manufacturer=Kingston
S:  Product=DT 101 G2
S:  SerialNumber=001CC0EC32F7BB40F71300BF
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=02 Cnt=02 Dev#=  9 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=05e3 ProdID=0716 Rev=97.27
S:  Manufacturer=Genesys
S:  Product=USB Reader
S:  SerialNumber=000000000013
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms

T:  Bus=01 Lev=02 Prnt=03 Port=03 Cnt=03 Dev#=  6 Spd=480  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0bda ProdID=8176 Rev= 2.00
S:  Manufacturer=Realtek
S:  Product=802.11n WLAN Adapter
S:  SerialNumber=00e04c000001
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA
I:* If#= 0 Alt= 0 #EPs= 4 Cls=ff(vend.) Sub=ff Prot=ff Driver=rtl8192cu
E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=125us
~ #

查看上面信息可以知道USB相關的設備有:
Product=HIUSB EHCI   #海思USB總線
Product=USB Modem  #上網模塊
Product=USB2.0 Hub   #USB HUB
Product=DT 101 G2    # U盤
Product=USB Reader # usb 讀卡器
Product=802.11n WLAN Adapter #USB網卡

(2)多屬性匹配問題

對于一個設備如果要匹配他的多個屬性,或者是同一個屬性,它在不同的層級中有不同的值,那么這個時候需要使用GOTO功能。比如在一個設備中要重名名一個USB設備,它的命令如下:

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" ,ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"

這里涉及到多個屬性ATTRS 值的匹配,另外該USB因為有些經過了usbHUB,所以他的idVendor 和 idProduct 有多個,就有總線的,也有HUB的,還有USB設備的,這樣的情況下是匹配不上設備的。具體是什么原因我沒有找到一個合理的解釋,但是我又一個可用的解決方案,那就是使用GOTO。將上面命令改成如下就可以了。

KERNEL=="sd*",KERNELS=="*:0:0:1",ATTRS{scsi_level}=="0" GOTO="hisi_end"
ATTRS{product}=="USB Reader",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",SYMLINK+="usbsda%n",OPTIONS="ignore_remove"
LABEL="hisi_end"

(3)監控設備事件

udev的一些匹配規則有些時候比較的莫名其妙,我也沒有找到哪里有比較詳細的說明,網上的介紹都它過于簡單,實際應用的時候還是很多的問題,比如針對上面介紹的設備,如果要寫一條卸載設備的命令,可以使用下面語句:

ACTION=="remove",KERNELS=="*:0:0:1",ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716",RUN+="/bin/umount -l /opt/usb_sd1_1"

但是在實際使用的時候,他們匹配不上,ACTION=="remove",KERNELS=="*:0:0:1"與ATTRS{idVendor}=="05e3",ATTRS{idProduct}=="0716" 不能同時使用,如果直接改成:

ACTION=="remove",KERNELS=="*:0:0:1",RUN+="/bin/umount -l /opt/usb_sd1_1"

命令功能可以實現,但是這樣會出現于設備沖突的情況,在拔出該設備的時候,會把KERNELS=="*:0:0:1" 的其他設備也卸載掉。

在這個時候,我們可以使用 devadm monitor --property  去監控設備拔出的時候它有哪些事件,有哪些屬性可以被捕捉到并且與其他的設備屬性不同以便區分不同的設備。下面是截取到的一部分數據:

[10:00:33]KERNEL[1555639338.737818] remove   /devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3 (usb)
[10:00:33]UDEV_LOG=3
[10:00:33]ACTION=remove
[10:00:33]DEVPATH=/devices/platform/hiusb-ehci.0/usb1/1-2/1-2.3
[10:00:33]SUBSYSTEM=usb
[10:00:33]DEVNAME=bus/usb/001/007
[10:00:33]DEVTYPE=usb_device
[10:00:33]PRODUCT=5e3/716/9727
[10:00:33]TYPE=0/0/0
[10:00:33]BUSNUM=001
[10:00:33]DEVNUM=007
[10:00:33]SEQNUM=1024
[10:00:33]MAJOR=189
[10:00:33]MINOR=6

從上面可以看出,拔出的時候有個PRODUCT ,它是 idVendor 和 idProduct 值的一個組合,可以使用它來區分不同的設備。最終可以正常卸載設備的命令如下:

ACTION=="remove",SUBSYSTEM=="usb",ENV{PRODUCT}=="5e3/716/9727",RUN+="/bin/umount -l /opt/usb_sd1_1"

“linux6.5 udev指的是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

本溪市| 仁寿县| 南郑县| 曲阳县| 肥东县| 涿鹿县| 开远市| 栾川县| 讷河市| 安多县| 凤城市| 雅江县| 三河市| 德阳市| 顺义区| 新化县| 观塘区| 扬中市| 梧州市| 区。| 富平县| 康乐县| 天台县| 丰县| 平遥县| 天祝| 兴业县| 始兴县| 铜鼓县| 牡丹江市| 同江市| 正宁县| 巫溪县| 安图县| 张北县| 南澳县| 库尔勒市| 广安市| 乌拉特前旗| 乐平市| 奉节县|