2.11.4 Настройка принадлежности usb накопителей
Редактируем файл, где меняем MountFlags со slave на shared
nano /usr/lib/systemd/system/systemd-udevd.service MountFlags=shared
Далее перезагрузите машину
Создаем правила для udev
$ nano /etc/udev/rules.d/99-usb.rules
Заносим в файл данные команды, которые запрещают монтирование usb накопителей по умолчанию, меняют владельца на нужного нам (в примере указан пользователь user) и запускают скрипт монтирования определенных устройств
ENV{ID_USB_DRIVER}=="usb-storage", OWNER="user", ENV{UDISKS_IGNORE}="1" KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
Создаем systemd процесс для перехвата действий udev
nano /etc/systemd/system/usb-mount@.service
[Unit] Description=Mount USB Drive on %i [Service] RemainAfterExit=true Type=oneshot ExecStart=/usr/local/bin/usb-mount.sh add %i ExecStop=/usr/local/bin/usb-mount.sh remove %i
Создаем скрипт для монтирования usb устройств (указан пользователь user, uid=1000 и gid=1000 замените на нужных вам, так же указан параметр по умолчанию umask=007 что означает полный доступ предоставлен группе пользователей и пользователя, а всем остальным он запрещен)
nano /usr/local/bin/usb-mount.sh
#!/bin/bash # Этот сценарий вызывается из системного юнита как сценарий обработки подключения/отключения накопителей. usage() { echo "Использование: $0 {add|remove} device_name (например, sdb1)" exit 1 } if [[ $# -ne 2 ]]; then usage fi ACTION=$1 DEVBASE=$2 DEVICE="/dev/${DEVBASE}" # Проверяем, не примонтировано ли уже устройство MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }') do_mount() { if [[ -n ${MOUNT_POINT} ]]; then echo "Предупреждение: ${DEVICE} уже смонтировано в ${MOUNT_POINT}" exit 1 fi string=$( loginctl list-sessions) if [[ $string != *"user"* ]]; then #проверка на наличие сессии пользователя exit 1 #if no do nothing else #иначе проверяем на активность владельца usb носителя string=$( loginctl user-status user) if [[ $string != *"State: active"* ]]; then #если не активная сессия, то не монтируем exit 1 fi fi # Получаем информацию об устройстве : метка $ID_FS_LABEL, идентификатор $ID_FS_UUID, и тип файловой системы $ID_FS_TYPE eval $(/sbin/blkid -o udev ${DEVICE}) # Создаём точку монтирования: LABEL=${ID_FS_LABEL} if [[ -z "${LABEL}" ]]; then LABEL=${DEVBASE} elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then # Если точка монтирования уже существует изменяем имя: LABEL+="-${DEVBASE}" fi MOUNT_POINT="/media/${LABEL}" echo "Точка монтирования: ${MOUNT_POINT}" /bin/mkdir -p ${MOUNT_POINT} # Глобальные опции монтирования OPTS="rw,relatime" # Специфические опции монтирования: if [[ ${ID_FS_TYPE} == "vfat" ]]; then OPTS+=",uid=1000,gid=1000,umask=007,shortname=mixed,utf8=1,flush" fi if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then echo "Ошибка монтирования ${DEVICE} (статус = $?)" /bin/rmdir ${MOUNT_POINT} exit 1 fi echo "**** Устройство ${DEVICE} смонтировано в ${MOUNT_POINT} ****" } do_unmount() { if [[ -z ${MOUNT_POINT} ]]; then echo "Предупреждение: ${DEVICE} не смонтировано" else /bin/umount -l ${DEVICE} echo "**** Отмонтировано ${DEVICE}" fi # Удаление пустых каталогов for f in /media/* ; do if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then if ! /bin/grep -q " $f " /etc/mtab; then echo "**** Удаление точки монтирования $f" /bin/rmdir "$f" fi fi done } case "${ACTION}" in add) do_mount ;; remove) do_unmount ;; *) usage ;; esac
Сделайте файл исполняемым
chmod +x /usr/local/bin/usb-mount.sh
Последний этап – перезапуск правил udev
$ sudo udevadm control --reload-rules
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.