S3.Blog

23 Февраля 2017
A A A   RSS-лента
"Я знаю, что ничего не знаю, но многие не знают и этого". Сократ [?].

Linux: Автоматическое монтирование USB-накопителей и создание пути

Дата последнего изменения: 5 Декабря 2016
Метки статьи: Готовые решения, Linux, Shell/Bash
Автоматическое монтирование для FAT и NTFS из консоли.
 


Часть первая. Автомонтирование.


1. установите usbmount :
sudo apt-get install usbmount
2. установите NTFS драйвер :
sudo apt-get install ntfs-3g

Теперь надо сконфигурировать usbmount для использования NTFS :
sudo nano /etc/usbmount/usbmount.conf

Найдите строку FILESYSTEMS и замените её на это:
FILESYSTEMS="vfat ext2 ext3 ext4 hfsplus ntfs fuseblk"

Так же найдите строку MOUNTOPTIONS и замените её на это (добавляется big_writes для нормальной скорости записи ntfs накопителей):
MOUNTOPTIONS="sync,noexec,nodev,noatime,nodiratime,big_writes"

Следующая важная строка это FS_MOUNTOPTIONS , замените её на это:
FS_MOUNTOPTIONS="-fstype=ntfs-3g,nls=utf8,umask=007,gid=46 -fstype=fuseblk,nls=utf8,umask=007,gid=46 -fstype=vfat,gid=1000,uid=1000,umask=007"

Теперь создайте файл usbmount.rules в /etc/udev/rules.d/ :
sudo nano /etc/udev/rules.d/usbmount.rules

и запишите в него это содержимое:
KERNEL=="sd*", DRIVERS=="sbp2",         ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="sd*", SUBSYSTEMS=="usb",       ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="ub*", SUBSYSTEMS=="usb",       ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="sd*",                          ACTION=="remove",       RUN+="/usr/share/usbmount/usbmount remove"
KERNEL=="ub*",                          ACTION=="remove",       RUN+="/usr/share/usbmount/usbmount remove"

Следующим шагом создайте файл  usbmount@.service в /etc/systemd/system/ :
sudo nano /etc/systemd/system/usbmount@.service
с таким содержимым:
[Unit]
BindTo=%i.device
After=%i.device

[Service]
Type=oneshot
TimeoutStartSec=0
Environment=DEVNAME=%I
ExecStart=/usr/share/usbmount/usbmount add
RemainAfterExit=yes
Теперь перезагрузитесь и проверьте в какую папку было примонтировано ваше USB-устройство :
cat /etc/mtab


Часть вторая. Создаем постоянный путь


Проблема в том, что в зависимости от очередности подключения usb-устройств, им назначается разный путь. И иногда необходимо, что бы система точно знала где именно находится смонтированная папка конкретной USB-флешки или USB-винчестера.

1. подключаем USB-накопитель и смотрим какой у него UUID в системе (тут и далее я буду давать пример для моего USB-винчестера)
$ blkid
/dev/sda1: LABEL="SAMSUNG" UUID="9250B86A50B85727" TYPE="ntfs" PARTUUID="ee2dfeb5-01"
идентификатор моего самсунга - это "9250B86A50B85727"

2. устанавливаем пакет at:
sudo apt-get install at

3. в описанном выше /etc/udev/rules.d/usbmount.rules добавляем в самый низ строчку:
KERNEL=="sd*", ACTION=="add|remove", RUN+="/root/autofs_udev.sh"

4. создаем файл /root/autofs_udev.sh :
sudo nano /root/autofs_udev.sh
с таким содержимым:
#!/bin/sh
echo /root/autofs_udev_bg.sh | at now
и назначаем права:
sudo chmod 755 /root/autofs_udev.sh


5. создаем файл /root/autofs_udev_bg.sh :
sudo nano /root/autofs_udev_bg.sh
с таким содержимым:
#!/bin/bash

echo " `date +%c`, ACTION= $ACTION" >> /tmp/autofs_udev.out
echo " DEVNAME= $DEVNAME, ID_BUS= $ID_BUS" >> /tmp/autofs_udev.out
echo " ID_FS_UUID_ENC= $ID_FS_UUID_ENC" >> /tmp/autofs_udev.out

if [ -z "${ID_FS_UUID_ENC}" ]; then
   # try to use LABEL
   echo " ID_FS_LABEL_ENC= ${ID_FS_LABEL_ENC}" >> /tmp/autofs_udev.out
   if [ -n "${ID_FS_LABEL_ENC}" ]; then
     printf -v ID_FS_UUID_ENC "${ID_FS_LABEL_ENC}"
   else
     echo " " >> /tmp/autofs_udev.out
     exit
   fi
fi

MEDIA_NAME=${ID_FS_UUID_ENC}

case ${ID_FS_UUID_ENC} in
9250B86A50B85727)
         MEDIA_NAME="USB_SAMSUNG"
         ;;
esac

echo " MEDIA_NAME= $MEDIA_NAME" >> /tmp/autofs_udev.out

if [ "${MEDIA_NAME}" == '' ]; then
        echo " " >> /tmp/autofs_udev.out
        exit
fi


case ${ACTION} in
add)
        sleep 10
        MOUNT_PATH=`mount | grep ${DEVNAME} | awk '{print \$3}'`;
        echo " $MOUNT_PATH -> $DEVNAME " >> /tmp/autofs_udev.out

        if [ "${MOUNT_PATH}" != '' ]; then
                ln -sfn "${MOUNT_PATH}" "/media/${MEDIA_NAME}"
        fi
         ;;
remove)
         rm -f "/media/${MEDIA_NAME}"
         ;;
esac

echo " " >> /tmp/autofs_udev.out
и назначаем права:
sudo chmod 755 /root/autofs_udev_bg.sh

Красным я выделил UUID своего USB-диска и имя символьной ссылки, которая создастся после монтирования диска. Так же в блоке "case ${ID_FS_UUID_ENC} in" вы можете прописать несколько разных устройств. В итоге, после подключения диска получится так:
$ ls -l /media/
lrwxrwxrwx 1 root root    4 дек  5 19:34 usb -> usb0
drwxrwxrwx 1 root root 4096 дек  5 15:49 usb0
drwxr-xr-x 2 root root 4096 дек  5 19:34 usb1
lrwxrwxrwx 1 root root   11 дек  5 23:09 USB_SAMSUNG -> /media/usb0

ну а так как мы теперь знаем что по пути /media/USB_SAMSUNG у нас постоянно находится именно наш конкретный USB-накопитель, то дальше уже можно оперировать с ним как угодно.
Желаю Удачи! :)

---
Найдено и доработано на просторах:
часть первая: Automount various USB stick file systems on Jessie Lite
часть вторая: Опции монтирования для произвольной флешки



Похожие материалы:




 
  Имя *:   Решите пример *: =
 
Полужирный Курсив Подчеркнутый Перечеркнутый
 
Вставить изображение Сделать цитатой Вставить ссылку Вставить код

Вставить смайл
 
 

 



© S3.Blog: Если критикуешь, не предлагая решения проблемы, то ты становишься частью этой проблемы.