Вопрос (TL; DR):
Для SD-карты с несколькими разделами, как получить по крайней мере событие «изменения» для смонтированных узлов из udev, когда uSD или SDcardудален из USB-SD-ридера, без отсоединения USB-кабеля от вашего ПК?
Бонус: получить событие «добавить / удалить» для узлов «раздела» (например, «/ dev / sdh2»)
Что не работает:
Когда смонтирован раздел, udev не выводит никакого события для узла раздела, когда извлекается карта !!!
Шаги для воспроизведения:
- Вам необходим USB-SD ридер (я настоятельно рекомендую: https://www.kingston.com/en/flash/readers/FCR-HS4).Но я тестировал на многих других USB-SD ридерах (таких как основанные на GenesysLogic), ситуация та же.
- Вам нужна карта памяти USB или SD, как минимум с 1 или 2 разделами.
Step1:
Создайте новое правило udev с именем: /etc/udev/rules.d/98-test.rules Содержимое:
KERNEL!="sd*" , SUBSYSTEM!="block", GOTO="END"
LABEL="WORK"
ACTION=="add", RUN+="/usr/bin/logger *****Received add event for %k*****"
ACTION=="remove", RUN+="/usr/bin/logger *****Received remove event for %k*****"
ACTION=="change", RUN+="/usr/bin/logger *****Received change event for %k*****"
LABEL="END"
Step2:
Установить ccze (sudo apt установить ccze).Это даст вам красивую цветную регистрацию событий.
Откройте терминал, выполните следующую команду:
journalctl -f | ccze -A
Результат:
Mar 09 23:01:32 Ev-Turbo kernel: sd 6:0:0:3: [sdh] 30408704 512-byte logical blocks: (15.6 GB/14.5 GiB)
Mar 09 23:01:32 Ev-Turbo kernel: sdh: sdh1 sdh2
Mar 09 23:01:33 Ev-Turbo root[19519]: *****Received change event for sdh*****
Mar 09 23:01:33 Ev-Turbo root[19523]: *****Received change event for sdh*****
Mar 09 23:01:33 Ev-Turbo root[19545]: *****Received add event for sdh2*****
Mar 09 23:01:33 Ev-Turbo root[19552]: *****Received add event for sdh1*****
Шаг 3:
Теперь выньте карту USB из слота, но не отсоединяйте USB-кабель от вашего ПК.Посмотрите журнал:
Mar 09 23:06:56 Ev-Turbo root[21220]: *****Received change event for sdh*****
Mar 09 23:06:56 Ev-Turbo root[21223]: *****Received remove event for sdh2*****
Mar 09 23:06:56 Ev-Turbo root[21222]: *****Received remove event for sdh1*****
Шаг 4:
Теперь, вставьте карту USB снова, вы увидите:
Mar 09 23:11:21 Ev-Turbo kernel: sd 6:0:0:3: [sdh] 30408704 512-byte logical blocks: (15.6 GB/14.5 GiB)
Mar 09 23:11:21 Ev-Turbo kernel: sdh: sdh1 sdh2
Mar 09 23:11:21 Ev-Turbo root[22652]: *****Received change event for sdh*****
Mar 09 23:11:21 Ev-Turbo root[22653]: *****Received change event for sdh*****
Mar 09 23:11:21 Ev-Turbo root[22679]: *****Received add event for sdh2*****
Mar 09 23:11:21 Ev-Turbo root[22682]: *****Received add event for sdh1*****
А теперь попробуйте смонтировать один изразделы где-то в вашей системе:
sudo mount /dev/sdh2 /media/uSD2
Вы можете дважды проверить, действительно ли он смонтирован (запустите команды: lsblk, mount ... и т.д.)
Шаг 5:
Теперь, пока раздел установлен, извлеките карту памяти из слота.Посмотрите журнал:
Mar 09 23:12:32 Ev-Turbo root[23049]: *****Received change event for sdh*****
Ничего больше ... Почему больше нет события "удалить" ???
БОНУСНЫЕ ЗАМЕТКИ (не имеет отношения к вышеуказанному вопросу):
1) Большая часть информации в Интернете, касающейся сценариев udev / systemd / systemd-udevd и mount, устарела.В частности, для systemd v239 многие из «решенных / рабочих» ответов не пригодны для использования (работая над проблемой в течение 2 недель, прочитайте большинство решений в Интернете, протестировано на Debian 9.7, Linux Mint 18.3, Ubuntu 18.04)
2) Для версий systemd> 212 вам нужны служебные файлы для подключения ваших съемных устройств.Пример: https://serverfault.com/questions/766506/automount-usb-drives-with-systemd
3) Специально для systemd v239 необходимо отключить PrivateMounts для автоматического монтирования через модули systemd.Подробнее: https://unix.stackexchange.com/questions/464959/udev-rule-to-automount-media-devices-stopped-working-after-systemd-was-updated-t
4) Файлы монтирования монтирования не подходят для каждого случая, например, когда вы хотите монтировать определенные каталоги на основе USB-хоста, порта, номеров LUN ... Но дляв некоторых случаях такой подход очень прост: https://dev.to/adarshkkumar/mount-a-volume-using-systemd-1h2f