Автомонтирование через UDEV (без стороних программ и огромных скриптов)

В интернете полно информации по этому поводу, однако я как то находил всё не то что надо...(может просто плохо искал)
Я напишу очень компактно каждый пункт можно расписывать очень долго:

1) Написание компактного скрипта который получит параметр от юнита (сервиса)

$ automount.sh
#!/bin/bash
#
format_dev=`lsblk -dnro FSTYPE "/dev/$1"`
option_dev="/dev/"$1" /media/usb-"$1""
#
if [ -n "$format_dev" ]
        then
                mkdir /media/usb-$1
#             sudo -u admin notify-send "udev" "/dev/$1($format_dev)"
fi
#
if [ -z $format_dev ]
        then
                systemctl stop mount@$1
        elif [[ $format_dev == ntfs ]]
                then
                        mount $option_dev -o utf8
        elif [[ $format_dev == vfat ]]
                then
                        mount $option_dev
        elif [[ $format_dev == exfat ]]
                then
                        mount $option_dev
        else
                mount $option_dev
fi
#
Можно сделать проще описав все фс (как многие и поступают), а также желательно добавить права доступа.

2) Написание юнита (сервиса) получающего параметр от udevа.

$ mount@.service
[Unit]
Description=mount_%I
[Service]
Type=forking
ExecStart=/patch/automount.sh %I
[Install]
WantedBy=multi-user.target

3) Написание правила udeva передающего параметр юниту (сервису).

$ 20-automount.rules
ACTION=="add" KERNEL=="sd[b-z][0-9]" RUN+="/bin/systemctl start mount@%k"
ACTION=="change" KERNEL=="sd[b-z]" RUN+="/bin/systemctl start mount@%k"
ACTION=="add" KERNEL=="mmcblk[0-9]" RUN+="/bin/systemctl start mount@%k"
ACTION=="remove" KERNEL=="sd[b-z]" RUN+="/bin/umount /dev/%k" RUN+="/bin/rmdir /media/usb-%k"
ACTION=="remove" KERNEL=="sd[b-z][0-9]" RUN+="/bin/umount /dev/%k" RUN+="/bin/rmdir /media/usb-%k"
ACTION=="remove" KERNEL=="mmcblk[0-9]" RUN+="/bin/umount /dev/%k" RUN+="/bin/rmdir /media/usb-%k"

Может кому нить пригодиться) и хотелось бы узнать минусы...
Ошибки в тексте-неповторимый стиль автора©
А вам не кажется лишним посредник в виде systemctl?
ind.indeviral
В интернете полно информации по этому поводу, однако я как то находил всё не то что надо...(может просто плохо искал)
$ 20-automount.rules
ACTION=="add" KERNEL=="sd[b-z][0-9]" RUN+="/bin/mkdir -p /media/usb-%k"
...
Бывают флэшки без таблицы разделов, то есть с файловой системой прямо на /dev/sdb. А для всяких PDA это особенно часто. Такая флэшка не смонтируется этим правилом.
corner
А вам не кажется лишним посредник в виде systemctl?
Это я посоветовал.
Посредник, к сожалению, не лишний – udev убивает запущенные из него процессы (вместе с потомками!) по истечении короткого таймаута, а монтирование может работать довольно долго. Поэтому запуск любых длительных и тяжелых процедур из udev требует посредника, и systemctl из них самый удобный и очевидный.
К сожалению такое автомонтирование не отменяет того факта, что уговорить файловый менеджер корректно работать без udisks (или как там его) это нетривиальная задача с вырезанием кода и обманом пкгбилда.

хм... "счастливым владельцам" stm32*discovery скорее всего придется проверить порядок правил удева. А то есть шанс что сначала удев сначала попытается примонтировать stlink v1.
Да пребудет с вами знание ip адреса
akorop
Бывают флэшки без таблицы разделов, то есть с файловой системой прямо на /dev/sdb. А для всяких PDA это особенно часто. Такая флэшка не смонтируется этим правилом.
Совершенно верно. А если исправить это правило, то некоторые флешки (как неправильно отформатированные, как и некоторые очень специфически работающие), показывающие ФС и на разделе, и на диске, будут монтироваться неправильно. В моём скрипте (который mnt) есть специальный код, который выкидывает из списка монтируемых устройств, к примеру, /dev/sdb , если на нём обнаружены разделы sdb1 и т.д.

Бывают ещё MMC/SD-карточки /dev/mmcblk* , MemoryStick/M2 /deb/mspblk* и некоторые другие, менее распространённые типы флешек. Соответственно, разделы на них именуются mmcblk0p1, mspblk0p2 и т.д..
ACTION=="add" KERNEL=="sd[b-z]" RUN+="systemctl start mount@%k"
#!/bin/bash
#
# Ошибка: format_dev=`blkid /dev/"$1" | awk '{print $3}' | cut -c 7- | sed 's/.$//'`
format_dev=`lsblk -dnro FSTYPE "/dev/$1" `
option_dev="/dev/"$1" /media/usb-"$1""
#
if [[ -z  $format_dev  ]]
   then
             systemctl stop mount@$1
   else
             mount $option_dev
fi

как то так, для всего остального аналогично.
p.s. Natrio ещё раз спасибо
Ошибки в тексте-неповторимый стиль автора©
ind.indeviral
format_dev=`blkid /dev/"$1" | awk '{print $3}' | cut -c 7- | sed 's/.$//'`
К сожалению, этот винегрет из blkid, awk, sed и cut работает совсем не так, как вы рассчитываете, и из-за изменяющегося порядка вывода blkid, он как правило, выдаёт вместо типа ФС чёрт-те что:
$ mls
/dev/sdb   3.7G                
/dev/sdb1  3.7G  f2fs  k4f2
$ blkid /dev/sdb
/dev/sdb: PTUUID="561bf0be" PTTYPE="dos" 
$ blkid /dev/sdb | awk '{print $3}' | cut -c 7- | sed 's/.$//'
="dos
$ blkid /dev/sdb1
/dev/sdb1: LABEL="k4f2" UUID="b6fac8e1-79e2-4e6b-b2e9-1b7d740e144a" TYPE="f2fs" PARTUUID="561bf0be-01" 
$ blkid /dev/sdb1 | awk '{print $3}' | cut -c 7- | sed 's/.$//'
b6fac8e1-79e2-4e6b-b2e9-1b7d740e144a

А я ведь советовал использовать lsblk – он гораздо надёжнее, проще и удобнее при разборе вывода. В моём скрипте есть вот такая строчка:
TYPE=`lsblk -dnro FSTYPE "$DEV" 2>&-`
Она гораздо проще и всегда работает правильно:
$ lsblk -dnro FSTYPE /dev/sdb
$ lsblk -dnro FSTYPE /dev/sdb1
f2fs
сори не учёл и не проверил((
В дальнейшем будем обязательно использовать lsblk
Ошибки в тексте-неповторимый стиль автора©
Natrio
akorop
Бывают флэшки без таблицы разделов, то есть с файловой системой прямо на /dev/sdb. А для всяких PDA это особенно часто. Такая флэшка не смонтируется этим правилом.
Совершенно верно. А если исправить это правило, то некоторые флешки (как неправильно отформатированные, как и некоторые очень специфически работающие), показывающие ФС и на разделе, и на диске, будут монтироваться неправильно. В моём скрипте (который mnt) есть специальный код, который выкидывает из списка монтируемых устройств, к примеру, /dev/sdb , если на нём обнаружены разделы sdb1 и т.д.
Это годится при ручном монтировании, но, к сожалению, это не катит при автомонитировании: sdb может (и, наверно, должен) появиться раньше, чем sdb1, так что в момент появления sdb анализ отсутствия sdb1 ничем не поможет. Поэтому для автомонтирования я не нашёл ничего лучше, чем свои флэшки тщательно почистить от мусора в MBR, ну а с чужими - как повезёт. Неприятный глюк, конечно, эта ложная файловая система на устройстве с разбивкой.
 
Зарегистрироваться или войдите чтобы оставить сообщение.