udev
CF 카드를 USB 카드 리더에 삽입하면 CF 카드에서 사진을 복사하는 쉘 스크립트가 실행된다는 규칙이 있습니다 . 이것은 한동안 잘 작동했습니다. 그러나 최근 업그레이드 이후 작동이 멈췄습니다.
문제(AFAICT)는 CF 카드를 USB 카드 리더에 삽입해도 더 이상 udev
이벤트가 트리거되지 않아 스크립트가 실행되지 않는다는 것입니다. (에 있는 항목도 /dev/disk/by-label/
삽입물에 표시되지 않으며 dmesg
삽입물에 대한 내용도 표시되지 않습니다.)
udev
실행하면 fdisk -l /dev/sdf
(또는 sdh
CF 카드로 보이는 장치) 이벤트를 트리거할 수 있습니다. 을 udev
사용하여 실행 중인 udevadm monitor
이벤트를 확인 했습니다 udevd --debug
. 시스템을 수동으로 트리거했을 때 이 시점부터 스크립트가 제대로 작동했습니다.
나는 Debian 6.0(Squeeze)을 실행하고 있으며 몇 달 전 Lenny의 업그레이드로 인해 동작이 바뀌었다고 확신합니다. 그러나 그것이 미묘한 변화인지는 확실하지 않습니다 udev
(어쩌면 버그가 있는 이벤트를 듣고 있는 걸까요? ) 또는 커널이나 USB 스택의 일부 변경 사항이 있습니까? 어쨌든, 이 문제를 해결하는 방법에 대한 제안이 있는 사람이 있습니까? 아니면 USB 메모리 모듈에서 더 많은 디버깅 정보를 얻기 위한 제안 사항이 있습니까?
내가 사용하는 udev 규칙은 다음과 같습니다.
KERNEL=="sd??", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add"
업데이트 #1: blockdev 및 파티션 변경 트리거
가능한 경우 파티션이 아닌 블록 장치에서만 트리거하는 규칙을 추가했지만 CF 카드를 삽입해도 실행되지 않습니다.
KERNEL=="sd?", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add-disk"
이상한 점은 fdisk -l /dev/sdf
CF 카드 인식을 트리거하기 위해 실행하면 "변경됨" 이벤트가 발생한다는 것입니다 /dev/sdf
("추가" 이벤트는 발생하지 않지만).
업데이트 #2: add
uevent 트리거
열려 있고 불완전한 부분이 있습니다.데비안 오류비슷한 내용을 다룹니다(다음으로 건너뛰세요).업데이트 #25관련 비트의 경우). 거기에는 몇 가지 유용한 팁이 있습니다.
내 설정의 경우 루트로 echo add > /sys/block/sdf/uevent
CF 카드를 삽입했는데 인식되지 않으면 udev
모든 이벤트가 올바르게 실행되고 모든 스크립트가 올바르게 실행됩니다.
udevadm info --query=all --name=sdf
CF 카드를 삽입하기 전과 삽입한 후에 실행해봐도 아무런 차이가 나타나지 않았습니다. "add" 이벤트를 삽입하고 명령을 다시 실행하면 udevadm
더 많은 출력을 얻을 수 있습니다(디스크 파티션에 대한 일부 정보 포함).
업데이트 #3: USB 리더의 USB 키와 CF 카드 비교
일반 USB 키를 삽입하면 udev
모든 이벤트가 즉시 트리거되고 제대로 작동합니다. CF 카드를 USB 카드 리더기에 삽입해도 작동하지 않습니다. 카드 리더기에서는 /sys/block/sdf
CF 카드를 삽입하지 않아도 USB 장치가 '존재'하는 것처럼(그래서 항목이 있는) 것처럼 보이지만, USB 키에서는 /sys/block/sdj
USB 키를 삽입해야만 존재합니다.
업데이트 #4: 2.6.38에서 수정되었을 수 있음
이것우분투 오류2.6.38 커널에 버그가 더 이상 존재하지 않는다고 주장하는 업데이트(마지막 업데이트)가 있습니다.
업데이트 #5: 수정되지 않음(3.2.0에서)
커널을 몇 번 업그레이드하고 사용하던 마더보드도 변경했는데 여전히 같은 문제가 발생합니다. 현재 3.2.0.0 커널을 사용하고 있습니다. udev
164 버전 도 있습니다 .
답변1
간단히 말해서:아래 업데이트 2의 솔루션을 참조하세요.
슬프게도, 이것은 실제로 대답이 아니거나 적어도 좋은 소식이 아닙니다. 어쨌든 이것이 작동하지 않을 것 같은 느낌이 듭니다. 과거에는 이것이 효과가 있었다고 확실히 생각했기 때문에 조금 믿기지 않습니다!
이것이 일반적으로 작동하는 방식과 이유입니다. 대부분의 노트북 SD 카드 리더기입니다. SD 카드를 삽입하고 udev
확인하면 Linux가 파티션을 검색하고 자동 마운트가 정상적으로 작동하는 것을 볼 수 있습니다. 이것이 작동하는 이유는 무엇입니까? lsusb
카드 삽입 전과 삽입 후의 상황을 살펴보세요 . SD 카드가 삽입되어 있지 않으면 USB 장치가 없는 것입니다. 따라서 SD 카드를 삽입하면 USB 핫플러그가 가득 참 이벤트가 발생합니다.
내 모니터의 카드 리더는 이렇게 작동하지 않는 것 같습니다. 항상 거기에 있습니다. SD 카드를 삽입해도 이벤트가 생성되지 않습니다. 먼저 시스템 로그를 살펴본 udevadm monitor
다음 usbmon
원시 USB 이벤트 로깅을 살펴보았습니다. 불행히도 내 모니터의 카드 리더기나 내 컴퓨터의 저렴한 DealExtreme 카드 리더기에서 삽입/팝업 알림/이벤트가 전혀 없는 것 같습니다.
원시 장치에 액세스하려고 하면 커널이 깨어나고 파티션이 나타납니다. 마찬가지로 전화를 걸면 udevadm trigger
장치에 기록됩니다. 카드를 제거한 후 장치에 다시 액세스하려고 시도하고 커널이 카드가 없어졌다는 것을 인식할 때까지 아무 일도 일어나지 않습니다.
지금 내가 궁금한 것은 이것이 어떻게 작동할 수 있는가 하는 것입니다(즉, 내가 이 기억을 만들어내지 않았다면)? 어쩌면 일부 데몬이 몇 초마다 원시 장치를 폴링하는 데 사용되다가 그 작업을 중단했을 수도 있습니다. 이에 대한 문서를 찾기가 정말 어렵습니다.
업데이트 #1
위 내용은 데비안 스톡 커널의 전체 내용입니다. 방금 SD 카드 핫 스와핑이 작동하는 Ubuntu 커널로 몇 가지 실험을 수행했습니다. 당연히 usbmon
저는 2초마다 여론조사를 봅니다. 이는 카드가 즉시 감지되지 않고 약간 지연되는 이유도 설명합니다.
폴링은 커널에 의해 수행되는 것으로 보입니다. 이는 단일 사용자 모드에서도 발생하며 사용자 영역 프로세스는 루프에 갇히는 것 외에는 아무것도 수행하지 않습니다 select()
. 커널에서 이 작업이 수행되는 위치를 알 수 없습니다. 알게 되면 이 게시물을 업데이트하겠습니다.
업데이트 #2
중요한 차이점은 /sys/block/sd?/events_poll_msecs
. 내 Debian 컴퓨터에서는 -1이고 Ubuntu 컴퓨터에서는 2000입니다. 이 udev
규칙이 효과가 있는 것 같습니다.
# enable in-kernel media-presence polling
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
ACTION=="add", ATTR{removable}=="1", ATTR{events_poll_msecs}=="-1", ATTR{events_poll_msecs}="2000"