#systemd #mount #udev #cardreader
#systemd #монтировать #udev #cardreader
Вопрос:
Вопрос (TL; DR):
Для SDcard с несколькими разделами, как получить хотя бы событие «изменить» для смонтированных узлов из udev, когда USD или SDcard извлекается из устройства чтения USB-SD, не отсоединяя USB-кабель от вашего ПК?
Бонус: Получите событие «добавить / удалить» для узлов «раздела» (например, «/ dev / sdh2»)
Что не работает:
Когда раздел смонтирован, udev не выводит никаких событий для узла раздела, когда карта извлекается!!!
Шаги для воспроизведения:
- Вам нужно устройство чтения USB-SD (я настоятельно рекомендую:https://www.kingston.com/en/flash/readers/FCR-HS4 ). Но я тестировал на многих других устройствах чтения USB-SD (например, на основе GenesysLogic), ситуация такая же.
- Вам нужна карта USD или SD, по крайней мере, с 1 или 2 разделами.
Шаг 1:
Создайте новое правило 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"
Шаг 2:
Установите ccze (sudo apt install 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:
Теперь извлеките карту USD из гнезда, но не отсоединяйте 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:
Теперь снова вставьте вашу карту USD, вы увидите:
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 … etc)
Шаг5:
Теперь, пока раздел смонтирован, извлеките вашу карту USD из слота. Посмотрите журнал:
Mar 09 23:12:32 Ev-Turbo root[23049]: *****Received change event for sdh*****
Ничего более… Почему больше нет события «удалить»???
ДОПОЛНИТЕЛЬНЫЕ ПРИМЕЧАНИЯ (не относящиеся к приведенному выше вопросу):
1) Большая часть информации в Интернете, касающейся udev / systemd / systemd-udevd и сценариев монтирования, устарела. Особенно для 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
Комментарии:
1. Этот вопрос принадлежит суперпользователю .
2. Спасибо @emix, я перенесу это через 40 минут…