Apakah itu linux 6.5 udev

藏色散人
藏色散人asal
2023-04-10 11:00:171094semak imbas

linux 6.5 udev ialah pengurus peranti kernel Linux; fungsi utamanya adalah untuk menguruskan nod peranti di bawah direktori "/dev" Ia juga digunakan untuk menggantikan devfs (sistem fail peranti) dan hotplug (. palam panas) Masukkan) fungsi; dalam sistem Linux tradisional, nod peranti dalam direktori "/dev" ialah satu siri fail sedia ada secara statik, manakala "udev" secara dinamik menyediakan nod peranti yang sebenarnya wujud dalam sistem.

Apakah itu linux 6.5 udev

Persekitaran pengendalian tutorial ini: sistem Linux 6.5, komputer Dell G3.

Apakah itu linux 6.5 udev?

Pengenalan kepada udev udevadm dan analisis penamaan semula peranti Linux dan contoh aplikasi pemasangan automatik

(1) Pengenalan kepada UDEV

Definisi udev dalam Wikipedia ialah: udev (ruang pengguna /dev) ialah pengurus peranti untuk kernel Linux Sebagai pengganti devfsd dan hotplug, udev menguruskan nod peranti dalam direktori /dev pada masa yang sama, udev juga mengendalikan semua peristiwa ruang pengguna yang dibangkitkan apabila peranti perkakasan ditambahkan ke dalam sistem atau dialih keluar daripadanya, termasuk pemuatan perisian tegar seperti yang diperlukan oleh peranti tertentu. Dalam bahasa Cina: udev ialah pengurus peranti kernel Linux. Fungsi utamanya ialah untuk mengurus nod peranti di bawah direktori /dev. Ia juga digunakan untuk mengambil alih fungsi devfs (sistem fail peranti) dan hotplug (palam panas), yang bermaksud bahawa ia perlu mengendalikan direktori /dev dan semua gelagat ruang pengguna apabila menambah/mengalih keluar perkakasan, termasuk semasa memuatkan perisian tegar.

(1) ringkasan udev:

Dalam sistem Linux tradisional, nod peranti dalam direktori /dev ialah satu siri fail statik, manakala udev adalah dinamik Menyediakan nod peranti yang sebenarnya wujud dalam sistem. Walaupun devfs menyediakan fungsi yang serupa, udev mempunyai kelebihan berbanding devfs:

  • udev menyokong penamaan tetap peranti dan tidak bergantung pada susunan peranti dimasukkan ke dalam sistem. Tetapan udev lalai menyediakan penamaan tetap peranti storan. Peranti boleh disahkan menggunakan vid (vendor), pid (peranti), nama peranti (model) dan atribut lain atau atribut sepadan peranti induknya.
  • udev dilaksanakan sepenuhnya dalam ruang pengguna, bukannya dalam ruang kernel seperti devfs. Hasilnya ialah udev mengalih keluar dasar penamaan daripada kernel dan membenarkan sebarang program menamakan peranti dalam sifat peranti sebelum nod dibuat.

(2) mod jalan udev:

udev ialah pengurus peranti kernel universal. Ia berjalan sebagai daemon pada sistem Linux dan mendengar uevents yang dikeluarkan oleh kernel (melalui soket netlink) apabila peranti baharu dimulakan atau peranti dialih keluar daripada sistem.
Sistem ini menyediakan satu set peraturan untuk memadankan nilai yang dieksport bagi peristiwa dan sifat peranti yang boleh ditemui. Peraturan padanan mungkin menamakan dan mencipta nod peranti dan menjalankan program konfigurasi untuk mengkonfigurasi peranti. Peraturan udev boleh memadankan atribut seperti subsistem kernel, nama peranti kernel, sifat fizikal peranti atau nombor siri peranti. Peraturan juga boleh meminta maklumat daripada program luaran untuk menamakan peranti, atau menentukan nama tersuai yang akan sentiasa sama, tidak kira bila peranti ditemui oleh sistem

(3) sistem udev seni bina:

sistem udev boleh dibahagikan kepada tiga bahagian:

  • pustaka fungsi libudev, yang boleh digunakan untuk mendapatkan maklumat peranti.
  • daemon udevd, terletak di ruang pengguna, digunakan untuk mengurus maya /dev
  • Arahan pengurusan udevadm digunakan untuk mendiagnosis ralat.

Sistem mendapatkan maklumat yang dihantar oleh kernel melalui soket netlink. Versi terdahulu menggunakan palam panas dan menambah pautan kepada dirinya sendiri dalam /etc/hotplug.d/default untuk mencapai tujuan ini.

(2) Pengenalan kepada arahan udevadm

Beginilah ia diterangkan dalam halaman manual Linux. udevadm - alat pengurusan udev. Dalam erti kata lain, arahan udevadm ialah alat untuk menguruskan udev. Malah, jika kami ingin menamakan semula peranti atau memasang peranti secara automatik, kami juga menggunakan udevadm untuk melihat dan menjejak maklumat udev.
udevadm boleh digunakan untuk memantau dan mengawal gelagat masa jalan udev, meminta acara kernel, mengurus baris gilir acara dan menyediakan mekanisme penyahpepijatan yang mudah.

(1) arahan utama udevadm:

  • info Tanya pangkalan data sysfs atau udev
  • cetus Minta peristiwa daripada kernel
  • settle Lihat baris gilir acara udev , jika Keluar apabila semua acara telah diproses
  • kawalan Ubah suai maklumat status dalaman latar belakang udev
  • pantau Pantau uevents kernel
  • hwdb Proses indeks pangkalan data perkakasan
  • uji Penyahpepijatan

(2) Aplikasi arahan:

(a) Lihat maklumat peranti:

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   Soal yang dinyatakan taip daripada peralatan pangkalan data. --path dan --name diperlukan untuk menentukan peranti. Fail pertanyaan undang-undang ialah: nama peranti, pautan, laluan, atribut
--path=devpath   Laluan peranti
--name=file   Nod atau pautan peranti
--attribute-walk  Cetak semua maklumat tentang peranti tertentu Atribut yang direkodkan oleh sysfs untuk memadankan peranti tertentu dengan peraturan udev. Pilihan ini mencetak semua maklumat peranti pada rantai, sehingga direktori sys mungkin.
--device-id-of-file=file Cetak nombor peranti induk/hamba
--eksport-db Keluarkan kandungan pangkalan data udev

(b) Pantau peristiwa peranti:

monitor udevadm [pilihan] Pantau acara dan acara kernel yang dihantar oleh udev. Peranti dari mana acara cetakan dipancarkan. Masa acara boleh dianalisis dengan membandingkan cap masa acara kernel atau udev.

udevadm monitor --property   输出事件的属性
udevadm monitor --kernel --property --subsystem-match=usb    过滤监听符合条件的时间

--kernel Output kernel events
--udev Output udev events apabila peraturan udev dilaksanakan
--property Output event properties
--subsystem-match=string Pass Filter peristiwa mengikut subsistem atau jenis peranti. Hanya peristiwa peranti udev yang sepadan dengan nilai subsistem diluluskan.
--tag-match=string  Tapis acara mengikut atribut dan hanya acara udev yang sepadan dengan teg akan lulus.

(c) Simulasikan acara udev

ujian udevadm [pilihan] devpath Simulasikan acara udev dan cetak maklumat nyahpepijat.

(d) Terima peristiwa peranti dihantar daripada kernel

pencetus udevadm [pilihan] Terima peristiwa peranti dihantar daripada kernel. Digunakan terutamanya untuk memainkan semula maklumat acara coldplug
(Inti telah mengesan peranti perkakasan sistem semasa permulaan dan mengeksport maklumat peranti perkakasan melalui sistem fail maya kernel sysfs. udev mengimbas sistem fail sysfs dan menjana palam panas berdasarkan peranti perkakasan maklumat. peristiwa Hotplug, udev kemudian membaca peristiwa ini dan menghasilkan fail peranti perkakasan yang sepadan Memandangkan tiada tindakan memasang dan mencabut perkakasan sebenar, proses ini dipanggil palam sejuk)
--verbose  Senarai peranti.
--dry-run    Tidak sebenarnya mencetuskan acara
--type=type    Mencetuskan peranti khas. Jenis undang-undang: peranti, subsistem, gagal. Lalai ialah peranti
--action=action Peristiwa yang dicetuskan ialah perubahan
--subsystem-match=subsystem. Pilihan ini boleh ditentukan beberapa kali dan menyokong padanan corak shell.
--attr-match=attribute=value   Cetuskan peristiwa peranti yang sepadan dengan atribut sysfs. Jika nilai atribut ditentukan bersama dengan atribut, nilai atribut boleh dipadankan menggunakan corak shell. Jika tiada nilai dinyatakan, sifat sedia ada akan disahkan semula. Pilihan ini boleh ditentukan beberapa kali.
--attr-nomatch=attribute=value Jangan cetuskan peristiwa peranti yang sepadan dengan atribut. Jika boleh gunakan padanan corak. Anda juga boleh menentukan
--property-match=property=value beberapa kali untuk memadankan peranti dengan sifat yang sepadan. Anda boleh menentukan beberapa kali yang menyokong padanan corak
--tag-match=property untuk memadankan peranti dengan tag yang sepadan. Boleh dinyatakan beberapa kali.
--sysname-match=name Memadankan peranti dengan nama peranti sys yang sama. Padanan corak sokongan boleh ditentukan beberapa kali.

(e) Semak baris gilir acara udev

udevadm settle [pilihan] Lihat baris gilir acara udev dan keluar jika semua acara diproses.
--timeout=saat  Masa maksimum untuk menunggu baris gilir acara kosong. Lalai ialah 180 saat. Jika 0, keluar dengan segera.
--seq-start=seqnum  Hanya tunggu sehingga nombor urutan yang diberikan.
--seq-end=seqnum  Hanya tunggu sehingga nombor urutan yang diberikan.
--exit-if-exists=file  Keluar jika fail wujud
--quiet Jangan keluarkan sebarang maklumat

(2) Contoh aplikasi:

Gunakan udev untuk melaksanakan USB, Menamakan semula, pemasangan automatik dan nyahlekap automatik peranti kad SD.

Untuk aplikasi mudah fungsi ini, anda boleh merujuk blog lain "udev menamakan semula nama nod peranti dan secara automatik melekap dan menyahlekap partition peranti storan"

Artikel ini merekodkan masalah yang dihadapi terutamanya semasa penggunaan dan langkah berjaga-jaga.

(三)注意事项:

(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"

相关推荐:《Linux视频教程

Atas ialah kandungan terperinci Apakah itu linux 6.5 udev. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:apa itu linux vcsArtikel seterusnya:apa itu linux vcs