linux 6.5 udev는 Linux 커널의 장치 관리자입니다. 주요 기능은 "/dev" 디렉터리 아래의 장치 노드를 관리하는 것입니다. 또한 devfs(장치 파일 시스템) 및 hotplug(핫 플러그)의 기능을 대체하는 데에도 사용됩니다. 플러그) ;기존 Linux 시스템에서 "/dev" 디렉터리의 장치 노드는 정적으로 존재하는 일련의 파일인 반면, "udev"는 시스템에 실제로 존재하는 장치 노드를 동적으로 제공합니다.
이 튜토리얼의 운영 환경: Linux 6.5 시스템, Dell G3 컴퓨터.
linux 6.5 udev란 무엇인가요?
udev udevadm 소개 및 Linux 장치 이름 변경 및 자동 마운트 적용 사례 분석
위키피디아에서 udev의 정의는 다음과 같습니다. udev(사용자 공간 /dev)는 devfsd 및 hotplug의 후속 커널인 udev는 주로 /dev 디렉터리의 장치 노드를 관리합니다. 동시에 udev는 펌웨어를 포함하여 하드웨어 장치가 시스템에 추가되거나 제거될 때 발생하는 모든 사용자 공간 이벤트도 처리합니다. 특정 장치에서 필요에 따라 로드합니다. 중국어: udev는 Linux 커널의 장치 관리자입니다. 주요 기능은 /dev 디렉토리 아래의 장치 노드를 관리하는 것입니다. 또한 devfs(장치 파일 시스템) 및 hotplug(핫 플러그)의 기능을 대신하는 데 사용됩니다. 즉, 펌웨어 로드를 포함하여 하드웨어를 추가/제거할 때 /dev 디렉터리와 모든 사용자 공간 동작을 처리해야 함을 의미합니다.
기존 Linux 시스템에서 /dev 디렉터리의 장치 노드는 정적으로 존재하는 일련의 파일인 반면, udev는 시스템에 실제로 존재하는 장치 노드를 동적으로 제공합니다. devfs는 유사한 기능을 제공하지만 udev는 devfs에 비해 장점이 있습니다.
udev는 범용 커널 장치 관리자입니다. Linux 시스템에서 데몬으로 실행되며 새 장치가 초기화되거나 장치가 시스템에서 제거될 때 커널에서 발행한 uevent(netlink 소켓을 통해)를 수신합니다.
시스템은 검색 가능한 장치 이벤트 및 속성의 내보낸 값을 일치시키기 위한 일련의 규칙을 제공합니다. 일치 규칙은 장치 노드의 이름을 지정 및 생성하고 구성 프로그램을 실행하여 장치를 구성할 수 있습니다. udev 규칙은 커널 하위 시스템, 커널 장치 이름, 장치의 물리적 속성 또는 장치 일련 번호와 같은 속성을 일치시킬 수 있습니다. 규칙은 장치 이름을 지정하기 위해 외부 프로그램에 정보를 요청하거나 시스템에서 장치를 검색하는 시점에 관계없이 항상 동일한 사용자 정의 이름을 지정할 수도 있습니다. 시스템은 세 부분으로 나눌 수 있습니다:
Linux 맨페이지에 이렇게 설명되어 있습니다. udevadm - udev 관리 도구입니다. 즉, udevadm 명령은 udev를 관리하는 도구입니다. 실제로 장치 이름을 바꾸거나 장치를 자동으로 마운트하려는 경우 udevadm을 사용하여 udev 정보를 보고 추적합니다.
udevadm은 udev 런타임 동작을 모니터링 및 제어하고, 커널 이벤트를 요청하고, 이벤트 대기열을 관리하고, 간단한 디버깅 메커니즘을 제공하는 데 사용할 수 있습니다.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 데이터베이스의 내용 출력
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 이벤트 시뮬레이션
(d) 커널에서 전송된 장치 이벤트 수신
--verbose 트리거될 장치 목록을 출력합니다.
--dry-run 실제로 이벤트를 트리거하지 않습니다.
--type=type 특수 장치를 트리거합니다. 법적 유형: devices, subsystem, failed. 기본값은 devices
--action=action 발동되는 이벤트, 기본값은change입니다
--subsystem-match=subsystem 일치하는 하위 시스템을 발동시키는 장치 이벤트입니다. 이 옵션은 여러 번 지정할 수 있으며 셸 패턴 일치를 지원합니다.
--attr-match=attribute=value sysfs 속성과 일치하는 장치 이벤트를 트리거합니다. 속성 값이 속성과 함께 지정되면 쉘 패턴을 사용하여 속성 값을 일치시킬 수 있습니다. 값을 지정하지 않으면 기존 속성의 유효성이 다시 검사됩니다. 이 옵션은 여러 번 지정할 수 있습니다.
--attr-nomatch=attribute=value 속성과 일치하는 장치 이벤트를 트리거하지 않습니다. 가능하다면 패턴 일치를 사용하세요. 또한
--property-match=property=value를 여러 번 지정하여 속성이 일치하는 장치를 일치시킬 수도 있습니다. 패턴 일치를 지원하기 위해 여러 번 지정할 수 있습니다
--tag-match=property 일치하는 태그와 장치를 일치시킵니다. 여러 번 지정할 수 있습니다.
--sysname-match=name 동일한 sys 장치 이름을 가진 장치를 일치시킵니다. 지원 패턴 일치는 여러 번 지정할 수 있습니다.
(e) udev 이벤트 큐 보기
--seq-start=seqnum 주어진 시퀀스 번호까지만 기다리세요.
--seq-end=seqnum 주어진 시퀀스 번호까지만 기다리세요.
--exit-if-exists=file 파일이 존재하면 종료
--quiet 어떤 정보도 출력하지 않음
(2) 적용 예:
이 기능의 간단한 적용은 다른 블로그 "udev는 장치 노드 이름을 변경하고 저장 장치 파티션을 자동으로 마운트 및 마운트 해제합니다"를 참조할 수 있습니다.
이 문서에서는 주로 사용 중에 발생하는 문제와 주의 사항을 기록합니다.
在海思平台,对于有些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网卡
对于一个设备如果要匹配他的多个属性,或者是同一个属性,它在不同的层级中有不同的值,那么这个时候需要使用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"
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视频教程》
위 내용은 리눅스 6.5 udev 란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!