Я разрабатываю приложение, которому в какой-то момент нужно записать на USB-накопитель. Приложение запускается с правами не суперпользователя, и я подумал, что лучшим способом записи на диск будет его монтирование с опцией flush сразу после вставки диска, таким образом, теоретически мне не нужно выполнять операцию umount, с этим правилом udev:
ACTION="add", KERNEL="sd*[0-9]", SUBSYSTEMS="usb", RUN+="/bin/sh mymountscript.sh '%E{DEVNAME}'"
Скрипт монтирования пытается вызвать команду следующим образом:
mount -o --flush $1 /media/my-user/my-usb-unit
Но я получаюэта ошибка монтирования:
mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
missing codepage or helper program, or other error
Любопытно, что я получаю эту ошибку только при попытке смонтировать его через правило udev. Если я вызываю его mymountscript.sh
сам, то устройство корректно монтируется в точке.
Помимо решения этой проблемы, я хотел бы узнать, рискованно ли делать это таким образом (я понимаю, что это потому, что я не размонтирую диск после записи файла). Если я пойду другим путем, мне понадобится скрипт приложения (который выполняется от имени пользователя), чтобы иметь возможность монтировать/размонтировать устройство самостоятельно. Для этого мне нужно будет где-то сохранить имя устройства при его вставке, а также предоставить приложению разрешения на монтирование.
Операционная система — Xubuntu 16.04.
решение1
Мой обходной путь для этой проблемы был следующим:
Одно правило udev для действия «Вставлен USB-накопитель».
Тем временем скрипты сами монтируют/размонтируют диск.
Одно правило udev для действия по извлечению USB-накопителя.
USB вставляется
Я выполняю один скрипт, который просто сохраняет имя устройства в файл. Я могу добавить любой другой скрипт в это правило:
ACTION=”add”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh my-usb-inserted.sh”, RUN+=”/bin/sh myownscript.sh”
Здесь myownscript.sh
будет смонтировано устройство с помощьюpmount, который позволяет монтировать/размонтировать съемные диски для обычных пользователей. Я могу вызывать любые другие скрипты после этих, пока я размонтирую устройство в каждом из них, прежде чем его использует следующий.
USB удаляется
Здесь простой скрипт удаляет файл, созданный my-usb-inserted.sh
, поэтому мы знаем, что в скриптах не вставлено ни одного флэш-устройства.
ACTION=”remove”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”, RUN+=”/bin/sh usb-removed.sh”
В этом обходном пути не учитывается тот факт, что придется иметь дело с несколькими USB-накопителями.
Смотрите также: