`udevadm test` показывает, что команда должна работать на добавлении USB-диска, но это не так

Я хотел бы, чтобы скрипт резервного копирования выполнялся при подключении определенных внешних USB-накопителей. Я пытаюсь добиться этого с помощью udev.

Что я сделал до сих пор:

Определил мой USB-накопитель, используя sudo udevadm info --attribute-walk --name /dev/sda, вывод которого:

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3/1-5.2.3:1.0/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{size}=="1953525168"
    ATTR{events_async}==""
    ATTR{ext_range}=="256"
    ATTR{range}=="16"
    ATTR{inflight}=="       0        0"
    ATTR{hidden}=="0"
    ATTR{ro}=="0"
    ATTR{discard_alignment}=="0"
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="50"
    ATTR{events_poll_msecs}=="-1"
    ATTR{removable}=="0"
    ATTR{events}==""
    ATTR{stat}=="     445     7963    19565     3971        7        1       64       21        0     1036     3204        0        0        0        0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3/1-5.2.3:1.0/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{state}=="running"
    ATTRS{inquiry}==""
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{device_busy}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{ioerr_cnt}=="0xc"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"
    ATTRS{vendor}=="ST310005"
    ATTRS{queue_depth}=="1"
    ATTRS{device_blocked}=="0"
    ATTRS{blacklist}==""
    ATTRS{evt_media_change}=="0"
    ATTRS{scsi_level}=="3"
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{iodone_cnt}=="0x1f8"
    ATTRS{queue_type}=="none"
    ATTRS{timeout}=="30"
    ATTRS{model}=="20AS            "
    ATTRS{max_sectors}=="240"
    ATTRS{iorequest_cnt}=="0x1f8"
    ATTRS{type}=="0"
    ATTRS{rev}=="    "
    ATTRS{dh_state}=="detached"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3/1-5.2.3:1.0/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3/1-5.2.3:1.0/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3/1-5.2.3:1.0':
    KERNELS=="1-5.2.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb-storage"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceClass}=="08"
    ATTRS{interface}=="MSC Bulk-Only Transfer"
    ATTRS{bInterfaceProtocol}=="50"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceSubClass}=="06"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2/1-5.2.3':
    KERNELS=="1-5.2.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{maxchild}=="0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{authorized}=="1"
    ATTRS{tx_lanes}=="1"
    ATTRS{manufacturer}=="Lomega"
    ATTRS{serial}=="50F26FFFFFFF"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{devpath}=="5.2.3"
    ATTRS{bmAttributes}=="c0"
    ATTRS{configuration}=="USB Mass Storage"
    ATTRS{quirks}=="0x0"
    ATTRS{ltm_capable}=="no"
    ATTRS{busnum}=="1"
    ATTRS{urbnum}=="1569"
    ATTRS{removable}=="unknown"
    ATTRS{bcdDevice}=="0000"
    ATTRS{speed}=="480"
    ATTRS{idProduct}=="0370"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{rx_lanes}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{product}=="External HD"
    ATTRS{devnum}=="19"
    ATTRS{idVendor}=="059b"
    ATTRS{version}==" 2.00"
    ATTRS{bMaxPower}=="2mA"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5.2':
    KERNELS=="1-5.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{tx_lanes}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{urbnum}=="200"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{quirks}=="0x0"
    ATTRS{manufacturer}=="VIA Labs, Inc.         "
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{rx_lanes}=="1"
    ATTRS{devnum}=="6"
    ATTRS{configuration}==""
    ATTRS{bDeviceClass}=="09"
    ATTRS{busnum}=="1"
    ATTRS{version}==" 2.10"
    ATTRS{speed}=="480"
    ATTRS{idVendor}=="17ef"
    ATTRS{authorized}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{maxchild}=="4"
    ATTRS{bcdDevice}=="0a74"
    ATTRS{removable}=="unknown"
    ATTRS{devpath}=="5.2"
    ATTRS{idProduct}=="3071"
    ATTRS{product}=="USB2.0 Hub             "
    ATTRS{ltm_capable}=="no"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-5':
    KERNELS=="1-5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{product}=="USB2.0 Hub             "
    ATTRS{devnum}=="3"
    ATTRS{rx_lanes}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bmAttributes}=="e0"
    ATTRS{devpath}=="5"
    ATTRS{speed}=="480"
    ATTRS{bDeviceClass}=="09"
    ATTRS{idProduct}=="3071"
    ATTRS{removable}=="removable"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bcdDevice}=="0a73"
    ATTRS{quirks}=="0x0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{busnum}=="1"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{configuration}==""
    ATTRS{tx_lanes}=="1"
    ATTRS{idVendor}=="17ef"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="VIA Labs, Inc.         "
    ATTRS{ltm_capable}=="no"
    ATTRS{urbnum}=="52"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{maxchild}=="5"
    ATTRS{version}==" 2.10"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{version}==" 2.00"
    ATTRS{tx_lanes}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{busnum}=="1"
    ATTRS{bcdDevice}=="0500"
    ATTRS{ltm_capable}=="no"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{serial}=="0000:00:14.0"
    ATTRS{configuration}==""
    ATTRS{devpath}=="0"
    ATTRS{idProduct}=="0002"
    ATTRS{devnum}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{product}=="xHCI Host Controller"
    ATTRS{speed}=="480"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{maxchild}=="12"
    ATTRS{authorized}=="1"
    ATTRS{urbnum}=="92"
    ATTRS{idVendor}=="1d6b"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{quirks}=="0x0"
    ATTRS{bDeviceClass}=="09"
    ATTRS{manufacturer}=="Linux 5.0.0-15-generic xhci-hcd"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{authorized_default}=="1"
    ATTRS{rx_lanes}=="1"
    ATTRS{removable}=="unknown"

  looking at parent device '/devices/pci0000:00/0000:00:14.0':
    KERNELS=="0000:00:14.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{revision}=="0x30"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{enable}=="1"
    ATTRS{ari_enabled}=="0"
    ATTRS{broken_parity_status}=="0"
    ATTRS{subsystem_device}=="0x2279"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{irq}=="127"
    ATTRS{vendor}=="0x8086"
    ATTRS{msi_bus}=="1"
    ATTRS{device}=="0x9ded"
    ATTRS{dbc}=="disabled"
    ATTRS{local_cpus}=="ff"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{numa_node}=="-1"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{class}=="0x0c0330"
    ATTRS{subsystem_vendor}=="0x17aa"
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

На основании этой информации я создал файл в /etc.udev/rules.d/10.autobackup.rules: в моем сценарии должен быть выполнен, когда USB-накопитель будет добавлен (и после монтирования диска, что является ограничением, которое мне понадобится при выполнении резервного копирования). Тем не менее, в следующий раз, когда я добавлю диск (выключив и включив его), файл не будет создан в ~david/test_udev.txt.

Выполнение sudo udevadm trigger также не приводит к созданию файла.

Конечной целью является выполнение команды резервного копирования, но в настоящее время я просто пытаюсь коснуться файла, чтобы заставить основы работать ...

0
задан 19 May 2019 в 17:03

1 ответ

Редактировать: оказывается, что мой конкретный случай / проблемы были связаны с моим зашифрованным домашним каталогом, и использование только systemd было всем, что было необходимо для его работы, хотя устройство должно запускаться при каждом входе в систему. Для получения дополнительной информации см. здесь .


Если взглянуть на это подробнее, то кажется, что запуск сценария резервного копирования (который может быть «долгосрочным» для некоторого определения «длинного») в любом случае не лучший подход (он может задержать другие вещи udev). Вместо этого, лучше, чтобы udev «захотел» пользовательский модуль systemd, который затем запустит реальный скрипт резервного копирования. Вот что я сделал:

Маркируйте диски в GParted (например, чтобы называться «резервным»), чтобы они всегда были подключены в одной точке монтирования.

Добавьте пользовательский системный модуль в ~ / .config / systemd / user / auto-usb-backup.service с помощью:

[Unit]
Description=Autobackup to USB drive

[Service]
ExecStart=/home/david/Documents/computer/backup/scripts/backup_to_usb.sh

Перезагрузите демон: systemctl --user daemon-reload, чтобы он знал о новом модуле .

Затем добавьте правило udev для запуска устройства при подключении USB-накопителя с «резервным» разделом. Создайте правило udev по адресу /etc/udev/rules.d/90-auto-usb-backup.rules, содержащее

SUBSYSTEM=="block", ACTION=="add", ENV{ID_FS_LABEL}=="backup", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="auto-usb-backup.service"

Имя и значение параметра ID_FS_LABEL были получены с использованием udevadm monitor --environment --udev и подключением накопителя. , но lsusb (и его опция -v) и udevadm info -a -p $(udevadm info -q path -n /dev/sda) также могут быть полезны для точной настройки правил (например, запуск правила udev только для конкретного диска на основе его серийного номера).

Перезагрузите udev, чтобы применить новое правило: sudo udevadm control --reload

Проверьте, сработает ли правило для накопителя с udevadm test /block/sda (где sda - текущая точка монтирования накопителя): вы должны увидеть TAGS=:systemd: ] среди выходных.

Наконец, включите удаление и добавьте диск: должен быть выполнен скрипт в пользовательском модуле systemd, определенный выше. Вы можете перепроверить это (и отладить), используя journalctl --user-unit auto-usb-backup -r -b (обратите внимание, что в некоторых системах опция --user-unit может быть вместо -u).

Примечание. Похоже, что сценарий запускается до того, как диск будет завершен, поэтому сценарий резервного копирования, вызываемый модулем systemd, имеет цикл ожидания, пока не будут найдены папки, которые он ищет.

Полезные ресурсы:

https://vic.demuzere.be/articles/using-systemd-user-units/

https : //borgbackup.readthedocs.io/en/stable/deployment/automated-local.html

0
ответ дан 19 May 2019 в 17:03

Другие вопросы по тегам:

Похожие вопросы: