udev custom rule [Решено]

Доброго времени суток.
…далее упрощено для читабельности, левое выкинуто.
cat /usr/local/bin/backup_adata0.sh 
#!/bin/bash
_binder()
{
    mkdir -p ${_DEST[0]}
    mount /dev/disk/by-label/FTEMP /mnt/usb
    return 0
}
...
#sleep 3
echo -e "--------------------------------------------------\nProcess start at $_DATE\n--------------------------------------------------\n" > $_LOG
_checker >> $_LOG
_binder >> $_LOG
...
ver1
cat /etc/udev/rules.d/90-local.rules
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTRS{vendor}=="ADATA   ", ATTRS{model}=="USB Flash Drive ", ATTR{size}=="15773696", RUN+="/usr/local/bin/backup_adata0.sh"
ver2
cat /etc/udev/rules.d/90-local.rules
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]", ATTRS{vendor}=="ADATA   ", ATTRS{model}=="USB Flash Drive ", ATTR{size}=="15773696", RUN+="/usr/local/bin/backup_adata0.sh &"
В общем все составлено верно, удев реагирует на флешку , а скрипт отдельно от удева работает успешно. Но вот какая досада, как видно я использую метку как ссылку на раздел для монтирования. Методом тыка и анализа я пришел к выводу, что мой скрипт отрабатывает раньше всех остальных реакций удева и есс-но ссылки в /dev/disk/by-label нет. Костылем в этом положении выступает ver2, т.е. запуск в фоне, а в скрипте вешается слипом пауза. Интересуюсь можно ли избавиться от костыля. Т.е. сделать так, чтобы правило отработало после всех встроенных.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
Флешка отформатирована как устройство или на ней раздел?
sudo blkid | grep sdb
/dev/sdb1: LABEL="FTEMP" UUID="5B31-66F2" TYPE="vfat" 
/dev/sdb2: LABEL="archboot" UUID="c26290f0-6a1f-43ab-b736-bc7fd4e606af" TYPE="ext2" 
┌─[ Чт. нояб. 22 ] :: [archangel] - [hellgate] :: [script]
└─>> sudo udevadm info -a -p sdb
syspath not found
┌─[ Чт. нояб. 22 ] :: [archangel] - [hellgate] :: [script]
└─>> sudo udevadm info -a -n sdb
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
  looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/host21/target21:0:0/21:0:0:0/block/sdb':
    KERNEL=="sdb"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="15773696"
    ATTR{stat}=="     697     3196     7547     1093        3        0        5       53        0      680     1146"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}=="media_change"
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="1"
    ATTR{capability}=="51"
    ATTR{events_async}==""
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/host21/target21:0:0/21:0:0:0':
    KERNELS=="21:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="0.00"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{model}=="USB Flash Drive "
    ATTRS{state}=="running"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x399"
    ATTRS{iorequest_cnt}=="0x399"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{max_sectors}=="240"
    ATTRS{ioerr_cnt}=="0x1"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="ADATA   "
    ATTRS{device_blocked}=="0"
    ATTRS{iocounterbits}=="32"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/host21/target21:0:0':
    KERNELS=="target21:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/host21':
    KERNELS=="host21"
    SUBSYSTEMS=="scsi"
    DRIVERS==""
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0':
    KERNELS=="2-2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2/2-2':
    KERNELS=="2-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="2"
    ATTRS{idVendor}=="125f"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="19"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="480mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0100"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000000B4C8A69"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="2594"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="ADATA"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="385a"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="ADATA USB Flash Drive"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="0"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized_default}=="1"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="1"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="8"
    ATTRS{bcdDevice}=="0306"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="0000:00:1d.7"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="446"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 3.6.6-1-ARCH ehci_hcd"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceClass}=="09"
    ATTRS{product}=="EHCI Host Controller"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7':
    KERNELS=="0000:00:1d.7"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci_hcd"
    ATTRS{irq}=="20"
    ATTRS{subsystem_vendor}=="0x103c"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="00000000,00000003"
    ATTRS{device}=="0x293a"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-1"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x1605"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"
  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
Ну тогда, к примеру, вот так:
/etc/udev/rules.d/84-ftemp.rules :
KERNEL=="sd*", ACTION=="add", ENV{ID_FS_LABEL}=="FTEMP", ENV{DEVTYPE}=="partition", RUN+="/bin/mount /dev/$kernel /mnt/usb"
1) Здесь подразумевается, что каталог /mnt/usb существует перманентно, т.е. создавать его каждый раз не надо. Если надо – делаем скрипт.
2) Я не принимал никаких мер к тому, чтобы флешка отмонтировалась какими-то особыми средствами. Если надо – добавляем соответствующие опции монтирования.
3) Я не использовал симлинк именно потому, что не могу гарантировать момент его создания, вместо этого я использовал имя самого устройства, которое всегда доступно UDEV в переменной $kernel или %k
4) Метка здесь читается из одной из внутренних переменных UDEV, полный список создаваемых параметров можно посмотреть, запустив команду
udevadm monitor --property
и воткнув флешку.
ПОнял, а можно к моунту добавить еще и скрипт,т.е. основная идея замутить бекап автоматом при вставки устройства гипотетически могущего быть хранилищем… т.е. можно примерчик или просто можно еще RUN+= добавить, я по докам не очень понял этот момент.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
sleepycat
ПОнял, а можно к моунту добавить еще и скрипт,т.е. основная идея замутить бекап автоматом при вставки устройства гипотетически могущего быть хранилищем… т.е. можно примерчик или просто можно еще RUN+= добавить, я по докам не очень понял этот момент.
Это был вопрос?
Конечно можно, если осторожно :)
Если добавить несколько RUN, то я не уверен, что они быдуту выполняться строго по порядку, неодновременно и т.д., если не сейчас, то в будущих версиях. Так что лучше тогда вписать запуск скрипта
RUN+="/bin/bash /полный/путь/к/скрипту $параметры"
и всё делать в нём.
т.е. правильно ли я понимаю, что через параметры вы немекаете сбросить $kernel в скрипт , а уже в скрипте его примонтировать?
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
sleepycat
т.е. правильно ли я понимаю, что через параметры вы немекаете сбросить $kernel в скрипт , а уже в скрипте его примонтировать?
Это самый простой вариант :)
ок, спасибо за консультацию по ENV, учитывая что сейчас без изменений на примере система монтирует устройстово, думаю проблем быть не должно, авансом решено.
Лозунг у них был такой: "Познание бесконечности требует бесконечного времени". С этим я не спорил, но они делали из этого неожиданный вывод: "А потому работай не работай — все едино". И в интересах неувеличения энтропии Вселенной они не работали. (с)
Решал подобную задачу через мониторинг папки /media средствами мониторинга событий в папке, inotify кажется.. Очень помогло когда мне нужно было растиражировать файлы на 250 флешек. Могу поискать код если интересно.

Пусть система сама всё монтирует, а мы уже на уровне папок будем делать свои дела :)
 
Зарегистрироваться или войдите чтобы оставить сообщение.