![Bash 스크립트를 사용하여 /sys에서 문자 장치를 찾으시겠습니까?](https://linux55.com/image/3738/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%2Fsys%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%20%EC%9E%A5%EC%B9%98%EB%A5%BC%20%EC%B0%BE%EC%9C%BC%EC%8B%9C%EA%B2%A0%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
나는이것들./sys
내 접근 방식은 다음과 같습니다.
/sys/modules/usbled
장치가 연결될 때 로드되는 커널 모듈의 이름이므로 시작하세요 .cd
todrivers/usb:usbled
, 이는 장치 드라이버의 버스 및 이름으로 나타납니다(다음에 따름).usbled.c:229)- ???
디렉토리에 다음이 포함되어 있으므로 마지막 단계에서 멈췄습니다.
$ ls
1-1.2:1.0 bind module new_id remove_id uevent unbind
1-1.2:1.0
이제 저는 이 경우 디렉토리에 LED를 제어하는 데 필요한 문자 장치가 포함되어 있다는 것을 알게 되었습니다 . 하지만 내 스크립트는 이것을 어떻게 알 수 있습니까? 디렉토리 뒤에 특정 명명 규칙이 있습니까? 동일한 유형의 여러 장치가 연결되어 있으면 어떻게 되나요?
답변1
좋아, 내 생각엔 귀하의 질문 제목이 의도치 않게 약간 오해의 소지가 있는 것 같습니다. 텍스트에서 귀하가 장치를 찾았다고 말하고 프로그래밍 방식으로 이를 수행하는 방법을 묻고 있기 때문입니다. 마음속에 떠오르는 한 가지 질문은 그것을 수동으로 찾는 방법과 그 주위에 스크립트를 작성할 수 없는 이유입니다. 저는 이 질문에 현재의 형태로 답변하기 위해 최선을 다할 것이며, 명확하게 답변하지 못한 점 미리 사과드립니다.
이와 같은 것들은 매우 다양하며 장치마다 다릅니다. 이러한 이유로 더 높은 수준의 소프트웨어에서도 드라이버/소프트웨어 어댑터가 필요합니다. 따라서 여러분은 아마도 일반적인 절차로 추상화되기보다는 이 스크립트가 특정 작업을 수행한다는 생각에 익숙해져야 할 것입니다.
약간의 배경 지식: 모든 버스형 시스템(USB, SCSI, PCI 등)에는 특정 형태의 주소 지정 장치가 필요합니다. 이는 lspci
기본 출력에서 각 줄의 가장 왼쪽에 표시되는 값입니다.
약어 예:
[root@hypervisor pyadmin]# lspci
00:00.0 Host bridge: Intel Corporation 5400 Chipset Memory Controller Hub (rev 20)
00:1d.1 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (rev 09)
00:1d.2 USB controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (rev 09)
04:00.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E1 (rev 01)
04:01.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E2 (rev 01)
07:05.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
07:06.0 Fibre Channel: QLogic Corp. ISP2422-based 4Gb Fibre Channel to PCI-X HBA (rev 02)
08:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5754 Gigabit Ethernet PCI Express (rev 02)
PCI 주소는 08:00.0, 07:06.0 등입니다.
말씀하신 대로, 여러분이 보고 있는 sysfs 디렉토리는 모듈( usbled
) 중 하나에 대한 것이므로 해당 모듈을 사용하는 장치를 포함하여 해당 모듈에 대한 sysfs 정보를 보고 있습니다(원하는 경우 그 반대의 경우도 마찬가지). 보고 있는 장치 1-1.2:1.0
는 USB 주소(USB 용어로 "엔드포인트")를 나타내고 참조됩니다.
그래서 이미 모듈을 알고 계시다면 기본적으로 알려진 값을 필터링하고 다음을 포함하는 dentry만 검색하겠습니다.둘 다sysfs
콜론과 마침표. 연결된 장치가 아닌 경우 비슷한 이름을 가진 다른 디렉터리 항목이 해당 특정 디렉터리에 생성될 가능성이 적기 때문입니다.
나는 이것이 약간 혼란스럽다는 것을 알고 있지만, 나는 당신의 대답이 거기에 있다고 확신합니다.