8.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, замените на нужного вам)

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+=",users,gid=100,umask=000,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.

Print Friendly, PDF & Email