Я хотел бы, чтобы скрипт резервного копирования выполнялся при подключении определенных внешних 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
также не приводит к созданию файла.
Конечной целью является выполнение команды резервного копирования, но в настоящее время я просто пытаюсь коснуться файла, чтобы заставить основы работать ...
Редактировать: оказывается, что мой конкретный случай / проблемы были связаны с моим зашифрованным домашним каталогом, и использование только 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