LINUX.ORG.RU

Как спровоцировать событие remove для udev?

 


0

1

У меня на внешнем жестаке лежит запасная система, которая с помощью udev сама монтируется при подключении, сама монтирует раздел с корнем, монтирует proc, sys и dev, чрутируется и вызывает git pull, чтобы подцепить свежие конфиги. Проблема в том, что когда я хочу отцепить жёсткий диск и унести с собой (обычно я делал udisks --detach /dev/sdX), этот самый udisks говорит, что 「Detach failed: One or more partitions are busy on /dev/sdb」. Вот собственно, правила, по которым udev монтирует и размонтирует диск

ACTION=="add", KERNEL=="sd[b-z]2", DRIVERS=="usb", ATTRS{product}=="StoreJet Transcend", ATTRS{serial}=="322549CB7013", RUN+="/bin/bash -c '/bin/mount /chroot/rescue &>/tmp/mlog  && …'" 

ACTION=="remove", KERNEL=="sd[b-z]", DRIVERS=="usb", ATTRS{product}=="StoreJet Transcend", ATTRS{serial}=="322549CB7013", RUN+="/bin/bash -c '/bin/umount -l /chroot/rescue/sys; /bin/umount -l /chroot/rescue/dev; /bin/umount -l /chroot/rescue/proc; /bin/umount /chroot/rescue'"
Пробовал подставить в RUN на remove создание файла в /tmp — работает, но только когда диск физически вынимается. А надо, чтобы как-то одной командой отмонтировать всё добро, и чтоб вся возня с отмонтированием подкаталогов производилась желательно там же, в правилах для udev, чтоб не разносить код в разные стороны. Да, можно и скрипт повесить на алиас, но как-то не комильфо.

Проверить, точно ли провоцирует udisks --detach событие remove я не могу, потому что udevd даже с ключом --debug, даже с udev_log=«debug» в /etc/udev/udev.conf в /var/log/messages выводит ошибки о том что SMART не удалось записать что-то там, когда диск детачит udisks, а в /run/udevdebug.log всего пара строчек о том, что udev не нашёл medium на sdc и sdd (это диски смартфона, который заряжается, но не подсоединён, как накопитель).

Deleted

i-rinat, я помню, ты мне про udisks в своё время подсказал.

Deleted ()

вынеси длиннющую команду в shell-файл

MyTrooName ★★★★★ ()

А вот зачем ты udev'ом mount вызываешь? mount надо ручками вызывать!

И в чем проблема ручками написать umount перед отключением диска.

// Совсем уже вантузятники зажрались!

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

В принципе, да, отмонтировать так и так из консоли, лучше перенести весь длинный код в скрипт и вызывать его во время события add с параметрами для add.

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

И в чем проблема ручками написать umount перед отключением диска.

Отмонтировать руками

  • /chroot/rescue/home
  • /chroot/rescue/boot
  • /chroot/rescue/sys
  • /chroot/rescue/dev
  • /chroot/rescue/proc
  • /chroot/rescue

— это же так просто!

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

У меня, например, на подключение/отключение хуявейного модема скриптик лежит в /etc/udev/rules.d, а вызывается он уже правилом:

SUBSYSTEM=="usb", ACTION=="add", ATTRS{idProduct}=="1436", ATTRS{idVendor}=="12d1", MODE:="0666", RUN+="/etc/udev/rules.d/huawei on"
SUBSYSTEM=="usb", ACTION=="remove", ATTRS{idProduct}=="1436", ATTRS{idVendor}=="12d1", RUN+="/etc/udev/rules.d/huawei off"

Сделал бы ты так же. Только remove у тебя должен лишь директорию удалять и запись из fstab, все равно ведь будешь этот скрипт ручками вызывать.

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

— это же так просто!

угу.
# umount /chroot/rescue/{home,boot,sys,dev,proc,}

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

На StoreJet вроде кнопка есть. Вот неплохо было бы её как-то задействовать.

i-rinat ★★★★★ ()

Да уж. Нет числа смелым парням, что сначала вытаскивают флешку, а только затем отмонтируют её.

Событие udev remove происходит когда ты вытащил диск из разъёма.

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