Триггеры Udev не запускают вставку CF-карты в устройство чтения карт USB (больше)

У меня есть правило udev которое запускает скрипт оболочки, который копирует фотографии с моей CF-карты, когда я вставляю карту в свой USB-кард-ридер. Это немного помогло. Но после недавнего обновления он перестает работать.

Проблема (AFAICT) заключается в том, что вставка CF-карты в USB-считыватель больше не вызывает никаких событий udev , поэтому мой сценарий никогда не запускается. (Даже записи в /dev/disk/by-label/ не отображаются на вставке, а dmesg ничего не показывает о вставке.)

Я могу привести к тому, что события udev будут запускаться, если я запустил fdisk -l /dev/sdf (или sdh или любое 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: запуск триггера смены блока и раздела

Я добавил правило для запуска только блочного устройства, а не на раздел (в случае, если это может появиться), но оно не срабатывает, когда я вставляю CF-карту:

 KERNEL=="sd?", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add-disk" 

Как ни странно, если я запускаю fdisk -l /dev/sdf чтобы инициировать распознавание CF-карты, я получаю «измененное» событие для /dev/sdf (хотя у меня никогда не было события «добавить»).

Обновление # 2: add триггеры uevent

Существует открытая, неполная ошибка Debian, которая покрывает некоторые аналогичные основания (пропустите Update # 25 для соответствующих бит). У этого есть несколько полезных советов.

Для моей настройки, если я сделаю (как root) echo add > /sys/block/sdf/uevent с вставленной CF-картой, но в остальном не распознанной, что приведет к правильному запуску всех событий udev и всех моих скриптов.

Запуск udevadm info --query=all --name=sdf до и после вставки CF-карты не показывает разницы. Если я добавляю событие «добавить» и повторно запускаю команду udevadm я получаю немного больше вывода (имеется некоторая информация о дисковых разделах).

Обновление №3: USB-ключ или CF-карта в USB-считывателе

Вставка ванильного USB-ключа немедленно запускает все события udev и отлично работает. Вставка CF-карты в устройство чтения карт USB не происходит. Для устройства для чтения карт памяти кажется, что USB-устройство «существует», даже если CF-карта не вставлена ​​(поэтому существует запись a /sys/block/sdf ), но с помощью USB-ключа /sys/block/sdj существует только тогда, когда ключ USB подключен.

Обновление №4: Возможно, исправлено в 2.6.38

У этой ошибки Ubuntu есть обновление (последнее), которое утверждает, что ошибка больше не присутствует в ядре 2.6.38.

Обновление № 5: Не исправлено (в 3.2.0)

Я обновил ядро ​​пару раз и даже изменил используемую материнскую плату, и я все еще вижу ту же проблему. Я сейчас в ядре 3.2.0.0. И udev версия 164.

tl; dr: см. решение в обновлении 2 ниже.

На самом деле это не очень печально, или, по крайней мере, не хорошие новости: у меня такое ощущение, что это никогда не сработает – я просто считаю, что мне трудно поверить, так как я уверен, что это сработало в прошлом!

Это то, что обычно работает, и почему: большинство ноутбуков SD-карт. Вы обнаружите, что вы подключаете SD-карту, udev видит ее, Linux сканирует ее на разделы, и автоматизация будет работать. Почему это работает? Посмотрите на lsusb до и после вставки карты. Вы заметите, что без подключения SD-карты USB-устройство не существует. Поэтому, когда вы вставляете SD-карту, есть полномасштабное событие USB hotplug.

Кард-ридер на моем мониторе, похоже, не работает так, он всегда там. И я не могу заставить его генерировать какое-либо событие, когда я вставляю SD-карту. Я начал с просмотра системных журналов, затем на udevadm monitor , а затем usbmon для регистрации событий USB. Не повезло, похоже, нет никаких уведомлений / событий извлечения / извлечения / из любого устройства чтения карт на моем мониторе или дешевого DealExtreme на моем ПК.

В тот момент, когда я пытаюсь получить доступ к необработанному устройству, ядро ​​просыпается и появляется раздел. Аналогичным образом вызовите udevadm trigger и он udevadm trigger устройство. Выньте карту, и ничего не произойдет, пока я не попытаюсь снова получить доступ к устройству, и ядро ​​осознает, что оно исчезло.

Теперь я удивляюсь, как это могло когда-либо работать (т. Е. Если я не восполняю эту память)? Может быть, какой-то демон каждый раз пробовал сырое устройство и прекратил это делать? На самом деле трудно найти документацию.

Обновление # 1

Выше всего есть ядро ​​Debian. Я только что сделал несколько экспериментов с ядром Ubuntu, где работает горячее включение SD-карты. И неудивительно, что в usbmon я наблюдаю опросы каждые две секунды. Это также объясняет, почему карты не обнаруживаются немедленно, но с небольшой задержкой.

Опрос, по-видимому, выполняется ядром, так как это происходит даже в однопользовательском режиме, при этом ни один пользовательский процесс не делает ничего, кроме застревания в цикле 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"