USB 드라이브가 연결되었을 때 포함된 모든 파일 시스템에 대해 USB 드라이브를 검색한 다음 감지된 파일 시스템 유형에 따라 작업을 수행하는 사용자 지정 기능을 구현하려고 합니다. 장치 노드에 대해 udev
인스턴스화된 "원샷" 서비스를 트리거하기 위해 규칙을 "권장"으로 작성했습니다. systemd
그러면 "모든 매직(TM)을 수행합니다" 셸 스크립트가 실행됩니다(플랫폼 독립상의 이유로 컴파일 프로그램의 옵션은 고려되지 않습니다). 여기).
ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", RUN{program}="/bin/systemctl start usb-drive-manager@$devnode.service"
그리고
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/usb_drive_manager.sh attach %I
ExecStop=/usr/local/bin/usb_drive_manager.sh detach %I
셸 스크립트에서는 ls /sys/.../sdX/sdX*
드라이브의 장치 경로에서 작업을 수행하여 파티션을 찾은 다음 호출을 통해 해당 파티션에 대한 정보를 쿼리합니다.
udevadm info /dev/sdXn
( n
파티션 번호는 어디에 있습니까?) 처리된 각 파티션에 대해.
질문이제 이는 쉘 스크립트의 "콜드 플러그" 테스트 중에 작동하지만 스크립트 가 규칙에서 트리거될 때는 작동하지 않습니다 udev
.udev
운전하다처리된 후 정보는 다음과 같습니다.분할드라이브의 정보는 아직 커널에 의해 수집되지 않았습니다. 즉, 호출은 udevadm info
기본 정보만 반환합니다.
P: /devices/.../block/sdb/sdb1
N: sdb1
E: DEVNAME=/dev/sdb1
E: DEVPATH=/devices/.../block/sdb/sdb1
E: DEVTYPE=partition
E: MAJOR=8
E: MINOR=17
E: SUBSYSTEM=block
그리고 모든 관련 정보, 특히 환경 변수 ID_FS_TYPE
는 ID_FS_LABEL
(여전히) 손실됩니다. 이벤트를 udevadm settle
처리하는 동안 호출하는 것은 나쁜 생각이고(도움이 되지 않음) 호출 사이에 잠자고 있는 0.5초 폴링 루프도 작동하지 않기 때문에 (정보가 최종적으로 사용 가능해질 때까지 약 1분 정도 소요) 여기서 약간의 조치가 손실되었습니다.udev
udevadm info
안타깝게도 udev
다음에 적용되도록 규칙을 다시 작성합니다.분할바꾸다운전사또한 어떤 경우에는 전체 장치에 걸쳐 파일 시스템을 포함하는 단일 파티션을 생성하는 대신 전체 USB 장치에 파일 시스템을 생성하기 때문에 이는 바람직하지 않습니다.
질문지금은
udev
특정 장치에 대한 규칙 처리는 모든 장치가 완료될 때까지 지연될 수 있습니다 .어린이들장치의 일부가 처리되었거나- 쉘 스크립트에서 시스템 호출을 사용하여 모든 것을 "대기"할 수 있습니다.어린이데이터 쿼리를 계속하기
udev
전에 완료할 이벤트 (있는 경우!)
질문이 다소 긴 것 같습니다. 도움을 주시면 대단히 감사하겠습니다.
답변1
blkid
더 많은 연구 끝에 in의 사용법을 발견했습니다.우데브규칙(참조예를 들어이것ArchLinux-Wiki 기사, 아쉽게도 독일어로만 제공됨) 전화를 해서 알게 되었습니다.
blkid -o udev -p /dev/sdXn
바꾸다
udeavdm info /dev/sdXn
-triggered 스크립트 내에서는 systemd
"추가" 규칙에 대해 처리 중인 USB 메모리 스틱 하위 장치에 대한 전체 정보를 검색하는 것도 가능합니다.
-p
캐시된 정보(예 :매뉴얼 페이지또는소스 코드의 blkid
).
이 옵션은 출력의 선행 식별자 태그(예 : 등)가 여기에 없기 때문에 100% 직접 교체는 아니지만 -o udev
호출과 유사한 방식으로 출력 형식을 지정합니다 .udevadm
udevadm
E:
P: