LINUX.ORG.RU

Отловить событие монтирования любой флешки

 , , , ,


1

2

Привет, я бы хотел повестить скриптик на событие монтирования флешки.

Нашел 3 способа : udev, systemd, dbus

Udev завести не удалось, он отлично отлавливает подключение устройства, но монтирование не ловит. А мне нужно именно монтирование

KERNEL=="sd?",ACTION=="mount",RUN+="/home/alex/scripts/backup.sh"
Может я тут что-то делаю не так.

В systemd я нашел как повесить хук ка монтирование конкретной флешки

[Unit]
Description=Triggers backup script when usb backup drive is mounted
RequiresMountsFor=/user/media/alex/BackupFlash

[Service]
ExecStart=/usr/bin/env bash /home/alex/scripts/backup.sh

[Install]
WantedBy=user-media-alex-BackupFlash.mount
Но бы хотел хук на монтирование любой флешки.

Многообещающим был Dbus. И он даже работает почти. За исключением, что он ловит сигналы MountAdded и MountRemoved от интерфейса org.gtk.Private.RemoteVolumeMonitor только для файловой системы /run/media

Это значит, что если я делаю mount руками к примеру в /mnt, то никаких сигналов не тригерится. Ещё мне немного не нравится решение с dbus так как прийдётся зависеть олт glib, а не особо этого хочу.

Может ли мне кто-то подсказать как бы повесить скрипт на монтирование любой флешки с получением пути, к которому примонтирована флешка?

Ответ на: комментарий от r3lgar

Как через udev отловить событие монтирования? Я описал как пытался, у меня не удалось. Если модскажете ЧЯДНТ - буду благодарен

letitbe
() автор топика

1) Переименовать /bin/mount в /bin/mount.org, в /bin/mount положить свой скрипт-враппер;
2) Мониторить в цикле изменение /proc/mounts (кстати, такое уже есть: findmnt --poll).

Lavos ★★★★★
()
Последнее исправление: Lavos (всего исправлений: 1)
Ответ на: комментарий от Lavos

1) Переименовать /bin/mount в /bin/mount.org, в /bin/mount положить свой скрипт-враппер;

Костыльно слишком. Не вариант

2) Мониторить в цикле изменение /proc/mounts (кстати, такое уже есть: findmnt --poll).

Уже копаю в эту сторону, но никак не могу отловить с помощью питона изменение в /proc/mounts или /etc/mtab ни QFileSystemWatcher ни inotify не работают.

letitbe
() автор топика
Ответ на: комментарий от kostik87

тоже костыльно и совсем не универсально, не вариант подпиливать систему под простецкий скрипт.

letitbe
() автор топика
Ответ на: комментарий от letitbe

Ну с /proc наверное inotify и не должен работать? А с /etc странно..
А если сорцы findmnt посмотреть? Как они делают?

Lavos ★★★★★
()
Ответ на: комментарий от Lavos

Судя по беглому обзору https://github.com/karelzak/util-linux/blob/master/misc-utils/findmnt.c эьти ребята просто с какм-то таймаутом просматривают /etc/mtab и дифят его. Это конечно сработает, но как-то до расстройства несерьёзно.

letitbe
() автор топика
Ответ на: комментарий от false

Есть ли у вас мысли как рещить проблему?

letitbe
() автор топика
Ответ на: комментарий от Lavos

Моя идеалистическая натура хочет сделать production quality. Чтоб не стыдно было на github выкинуть, чтоб люди пользоваться могли.

letitbe
() автор топика

парси логи ( /var/log/messages ), там их уже отловили.

arson ★★★★★
()
Ответ на: комментарий от letitbe

Посмотри еще в строну audit и перехвата mount syscall.
Или допили udev до понимания mount event (сейчас там только connect/disconnect) и выложи патчи на github.

Lavos ★★★★★
()

Бесит!

Прям пичаль-бида.

Я теперь понимаю почему в моём несчастном ArchLinux всё работает через жопу или не работает вообще. Даже такая простая задача как повесить хук на монтирование флешки превращается в парсинг логов или допиливание udev, или циклическое чтение файла и сравнение с предыдущим состоянием или парсинг вывода утилиты командной строки с отдельного подпроцесса. Костыли, велосипеды и ничего нельзя сделать ровно... Бесит, наболело.

letitbe
() автор топика
Ответ на: комментарий от letitbe

У меня вот так: http://ix.io/1kl6

Там почему-то возникают мусорные события (PropertiesChanged на юнитах разделов, которые никто не трогал), но монтирование tmpfs на /mnt/test тем не менее вполне видно.

Другой вопрос, что это непарсибельно. Насколько мне известно, шелл-френдли утилит для ловли D-Bus сигналов не существует. С другой стороны, напиши, опенсорс тебя не забудет =)

intelfx ★★★★★
()
Ответ на: комментарий от letitbe

Ещё можно слушать udisks, если он у тебя есть (org.freedesktop.UDisks2).

Хотя там всё ещё более непарсибельно: точки монтирования энкодятся как массивы байт (ay), а не как строки (s).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

На разборки с тем, как через dbus монтировать/демонтировать и делать прочую хрень без всяких glib и прочей шняги в свое время пришлось потратить некоторое время. Теперь могу с этим работать в чистом Си (ну плюс libdbus естественно). Но я так понял это не вариант, так как нужно делать это через скрипт.

А вот насчет того, как отследить простой факт монтирования/демонтирования, то делается это весьма занимательным образом. Если мне не изменяет память, то через inotify отслеживается /proc/mounts (или что там у нас в /proc за это дело отвечает). Но весь нюанс в том, что так как это виртуальная фс, то отслеживать надо событие связанное с ошибкой на дескрипторе. Она свидетельствует о том, что файл обновился. Как то так. Подробнее можно посмотреть исходники udisks.

zloy_starper ★★★
()
Ответ на: комментарий от intelfx

Выполнил ту-же команду с dbus-monitor. И примонтировал с помощью

sudo mount /dev/sdb1 /mnt

Вывод схож. Но никакого упоминания про /mnt я не нашел http://pastebin.com/2iji7yXq

letitbe
() автор топика
Ответ на: комментарий от intelfx

Там почему-то возникают мусорные события (PropertiesChanged на юнитах разделов, которые никто не трогал), но монтирование tmpfs на /mnt/test тем не менее вполне видно.

Я не нашел где оно видно. Можете показать?

letitbe
() автор топика
Ответ на: комментарий от zloy_starper

Может и через Си был бы вариант, если написать на Си демон, который будет монирить DBus и запускать скрипт. Звучит не сложно. Но нужно не монтировать\демонтировать, а отслеживать события монтирования. Я постараюсь вникнуть в исходники с udisks и отследить как они это делают, как вы говорите с помошью трюка с ошибкой на дескрпторе. Звучит конечно костыльно, но менее костыльно чем парсить логи или подменять mount или читать /proc/mounts каждую секунду.

letitbe
() автор топика

Сейчас попробовал ручками смонтировать и отмонтировать флэшку в /mnt. Моя программулина, работающая с Udisks2, показала, что флэшка примонтировалась и отмонтировалась.

zloy_starper ★★★
()
Ответ на: комментарий от intelfx

Сигналы serial=8701 и serial=8702.

Я вижу, что произошло монтирование файловой системы tmpfs, но не вижу куда они примонтировалась, как из этих сообщения достать /mnt/test ?

В своём логе http://pastebin.com/ я могу тооже обнаружить, что примонтировалось устройство

 variant             string "/dev/sdb1"
Но, нет сообщений куда оно примонтировалось. Впринципе «куда» можно достать уже прочтением файла /proc/mounts Возможно это пока самое некостыльное решение, если сишная программа товарища zloy_starper не окажеся прямее.

Но может ли мне кто-то объяснить, что это за юнит mnt_2emount? Который генерирует эти DBus сигналы? Это часть ядра? Или какого-то пакета? Так-же ли это работает к примеру в убунте или федоре?

dokihot
()
Ответ на: комментарий от dokihot

Юнит — это абстрактная сущность в рамках systemd. В данном случае юнит описывает появившуюся точку монтирования. Путь до неё можно достать из имени:


mnt_2dtest_2emount -> mnt-test.mount -> /mnt/test

На первом шаге нужно заменить _xx на символы с кодом xx, а на втором шаге нужно убрать суффикс .mount и применить systemd-escape --path --unescape (почитай ман по этой команде).

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.