Автомонтирование с помощью udev и udisks

Я уже писал о автомонтировании через udev, с помощью mount или pmount, которые постепенно переродились у меня в два скрипта — один для монтирования, другой для размонтирования... Сегодня же хочу поведать о udisks (пришедшем на смену hal и имеющим пару полезных плюшек для автомонтирования, о чем ниже) и изысканиях проведенных вместе с hatred. Конечно, читатели вялого мейллиста archlinux-ru уже могли видить описание сего дела от hatred ещё пару месяцев назад.

Можно использовать pcmanfm или другой менеджер файлов с возможностью автоматического монтирования сменных носителей, но «мы не ищем легких путей». К тому же если без использования файлового менеджера в фоне (например, pcmanfm -d) для автомотрирования udev всё же хорош и может позволить дополнительные действия при монтирования, а благодаря udisks разделы на сьемном носителе можно отмонтировать через любой файломанагер использующий udisks, а таких сейчас все больше и больше...

В общем udev+udisk.tar.gz
Внутри архива:
99-automount-fs.rules - рулесы для udev для автомонтирования
automount-fs.sh       - собственно скрипт для автомонтирования, вызывается udev'ом
save-sessios-vars.sh  - скрипт который нужно прописать в start up скрипт вашего WM или DE
README                - небольшое руководство
Необходимы ck-launch-session и dbus-launch из-за которых у нас с hatred произошел взрыв мозга... т.е. достаточно продолжительный мозговой штурм из-за которых возник дополнительный файл вызываемый при старте иксовой сессии и использование переменных DBUS_SESSION_BUS_ADDRESS и XDG_SESSION_COOKIE, и даже дополнительный sleep, хотя по большей части скрипт и правила udev не изменились...
В общем всё работает, и работает замечательно, спасибо hatred...

Ну и докучи обещанный в списке рассылки скрипт отмонтирования с помощью dmenu.
#!/bin/sh

LABEL=`/bin/ls -1Q /media/ | /bin/sed 's/\"/\[/;s/\"/\]/' | grep -v 'smbnet' |   /usr/bin/dmenu -fn '-xos4-terminus-medium-r-normal--12-120-72-72-c-60-*-*' -nb '#737373' -nf '#e7e3e7'  -sb '#e7e3e7' -sf '#737373' -p "Umount:"`
LABEL=`/bin/echo "$LABEL" | /bin/sed 's/\[//;s/\]//'`
SD=`mount|grep "$LABEL " | cut -f 1 -d " "`
RETURN=$(/usr/bin/udisks --unmount  "$SD" 2>&1)
if [ ! -z "$LABEL" ]; then
    if [ -z "$RETURN" ]; then
    /usr/bin/notify-send "Устройство $LABEL успешно размонтировано" 
    else
    /usr/bin/notify-send "Ошибка размонтирования устройства!" "$RETURN"
    fi
fi
exit 0
Кстати, сей скрипт не особо и нужен ибо благодоря udisks-helper если вытащить примонтированную флешку то она отмонтируется, да и устройство в /dev/ и точка монтирования удалятся (это те самые плюшки от udisks обещанные выше). Но все же лучше отмонтировать...

PS. Почти два месяца автомаунта — полет нормальный

UP:Если у вас udisks не монтрует от пользователя, то разрешения высставляется в файле /usr/share/polkit-1/actions/org.freedesktop.udisks.policy заменой в соответсвующих местах
<allow_any>no</allow_any>
на
<allow_any>yes</allow_any>
или колдуем с polkit-auth
ostin 11-01-2011
Пользователи Федоры смотрят на тебя с недоумением. Я когда этот пост в RSS увидел - не поверил своим глазам. Как можно в 2011 году писать о автомонтировании?!
muhas 11-01-2011
@ostin не читатель, а писатель? во втором абзаце написано же.
кстати, не все пользуются de или фм с возможностью (авто)монтирования
ostin 11-01-2011
Эй, немного критики никому не повредит (-;
Просто непонятно, зачем выбирать аскетичные DE, а потом прикручивать к ним то, что кругом и так есть.
muhas 11-01-2011
Просто непонятно, зачем выбирать аскетичные DE, а потом прикручивать к ним то, что кругом и так есть.

как минимум что бы не пользовать то убогое что уже есть - мне вот ни гном ни кеды ни хфсе ни лхде не подошли... а c помощь mc как-то не удобно монтировать, но это самый вменяемы для меня фм. пускать тот же помянутый в заметке pcmanfm демоном или какой другой нафиг не хочится - висит и не пользуется, только зря ресурсы отжирает(да, я нищеброд, мне их жалко) - а тут же udev всегда висел - появилась флешка скрипт монтирования(а ведь можно не только примонтировать - но ещё и удалить виндовый авторан, закинуть бэкап конфигов или ещё чего) отработал и все =)

а так да, критики не повредит, но конструктивной, а не лоровского "не нужно" ;)
silentos 11-01-2011
За статью спасибо, я как раз сейчас озаботился этим вопросом.

p.s. @muhas а где флешки продаются такие, как у тебя на картинке?
muhas 11-01-2011
@silentos, где как не на амазоне, может у нас где есть (WWF Penguin USB Drive называется)
borman 11-01-2011
Хм, как вариант не использовать костыль в виде правила к udev (а в таком сочетании оно именно костыль) посмотри на такой юзерский демон: https://github.com/fernandotcl/udisks-glue Он монтирует диски по сигналам от самого udisks. Я для него делал пакет (в AUR лежит), надо бы его, кстати, обновить до актуальной версии.
chestr 11-01-2011
огромное спасибо за статью, сам пинаю автомаунт уже месяц и никак ничего нормально не вышло... кстати +1 в сторону пользователей аскетичных вм, я на флуксбоксе сижу) а в архиве надо пути подправить типа /home/hatred/programming/bash/udev+udisk/automount-fs.sh

2 ostin пользователи арча смотрят на muhas'a с восторгом)
muhas 11-01-2011
@chestr там и в скрипте надо поправить путь к уведомлялке (там скрипт для dzen2 - можно просто сменить на notify-send)

@borman спасибо, посмотрю
chestr 11-01-2011
и еще в скрипте automount надо поправить USER=hatred
все врубил, подрубаю флеху и наблюдаю 2 уведомления - 1 обнаружена моя флешка , 2 невозможно примонтировать /dev/sdc1
chestr 11-01-2011
вот лог, в переменной DBUS_SESSION_BUS_ADDRESS пусто
+ USER=chestr
+ NOTIFY_CMD=notify-send
+ DISPLAY=:0.0
+ SLEEP=1
++ sh -c '/sbin/udevadm info --query=property --name=/dev/sdc1 | /bin/grep '\''ID_FS_TYPE'\'''
+ RETURN=ID_FS_TYPE=vfat
+ source /home/chestr/.session-vars.sh
++ export DBUS_SESSION_BUS_ADDRESS=
++ DBUS_SESSION_BUS_ADDRESS=
++ export XDG_SESSION_COOKIE=
++ XDG_SESSION_COOKIE=
+ '[' '!' -z ID_FS_TYPE=vfat ']'
+ f_mount /dev/sdc1 vfat
+ exit 0
+ sleep 5
++ /bin/su - chestr -s /bin/sh -c 'env DBUS_SESSION_BUS_ADDRESS= XDG_SESSION_COOKIE= /usr/bin/udisks --mount /dev/sdc1'
+ RETURN='Mount failed: Not Authorized'
++ grep failed
++ echo Mount failed: Not Authorized
+ status='Mount failed: Not Authorized'
+ '[' -n 'Mount failed: Not Authorized' ']'
+ /bin/su - chestr -s /bin/sh -c 'env DISPLAY=:0.0 notify-send '\''Can not mount device:'\'' '\''/dev/sdc1'\'''
muhas 11-01-2011
в ридми вроде написано что стартовать как exec ck-launch-session dbus-launch твой_wm
и скрипт save-sessios-vars.sh запускать..
chestr 11-01-2011
в ридми этого не написано, это как бы завуалировано в статье, щас понял как делать, стартуюу вм с ck-launch-session dbus-launch и стартую save-sessios-vars.sh первым со своим вм, но таже вигня, не монтирует(
chestr 11-01-2011
вот такой лог
+ USER=chestr
+ NOTIFY_CMD=notify-send
+ DISPLAY=:0.0
+ SLEEP=1
++ sh -c '/sbin/udevadm info --query=property --name=/dev/sdc1 | /bin/grep '\''ID_FS_TYPE'\'''
+ RETURN=ID_FS_TYPE=vfat
+ source /home/chestr/.session-vars.sh
++ export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xkXYR7VAoj,guid=ed56cc81d04b7acaf97795010001c82f
++ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xkXYR7VAoj,guid=ed56cc81d04b7acaf97795010001c82f
++ export XDG_SESSION_COOKIE=bdcf1f1a9e8695a4b7e7b8ad000001aa-1295837319.72744-1722863150
++ XDG_SESSION_COOKIE=bdcf1f1a9e8695a4b7e7b8ad000001aa-1295837319.72744-1722863150
+ '[' '!' -z ID_FS_TYPE=vfat ']'
+ f_mount /dev/sdc1 vfat
+ exit 0
+ sleep 5
++ /bin/su - chestr -s /bin/sh -c 'env DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-xkXYR7VAoj,guid=ed56cc81d04b7acaf97795010001c82f XDG$
+ RETURN='Mount failed: Not Authorized'
++ grep failed
++ echo Mount failed: Not Authorized
+ status='Mount failed: Not Authorized'
+ '[' -n 'Mount failed: Not Authorized' ']'
+ /bin/su - chestr -s /bin/sh -c 'env DISPLAY=:0.0 notify-send '\''Can not mount device:'\'' '\''/dev/sdc1'\'''

в дбус переменной теперь что то есть, но все равно not authorized
chestr 11-01-2011
все проверил, тут моему юзеу не позволяется операция с юдискс , от рута примонтировал
Pavel Vyazovoi 11-01-2011
Ништяк! Прикручу udisks к stumpwm при первом же удобном случае. А пока некогда прикручивать - запускаю pcmanfm.
muhas 11-01-2011
@chestr может в /etc/dbus-1/system.d/org.freedesktop.UDisks.conf надо юзверям разрешить
chestr 11-01-2011
а если не секрет - как?) я в лини не профи, и дбус никогда не ковырял, я сделал так:
после секции с рутом добавил такую же для себя
<policy user="chestr">
<allow own="org.freedesktop.UDisks"/>
</policy>
chestr 11-01-2011
друг (KriK) мне помог решить проблему, надо отредактировать /usr/share/polkit-1/actions/org.freedesktop.udisks.policy
и там везде надо <allow_any>no</allow_any> исправить на <allow_any>yes</allow_any>
и сразу все начало монтироваться) теперь думаю можно дописать это все в ридмишку и в статью и почистить каменты))
еще раз очень благодарен!
muhas 11-01-2011
@chestr внесу в пост.
SmiGes 11-01-2011
блин, как бы без скриптов сделать то а чисто с этими правилами удева
muhas 11-01-2011
pmount или mount вызывать, создавать каталог... так что проще скриптами, а можешь портянкой запускать из скрипта команды сразу в правиле, но это геморой лишний...
chestr 11-01-2011
а чем скрипты мешают то? наоборот модульная система удобнее, че когда все в одной куче, в одной каше...
vdemin 11-02-2011
Для автомонтирования пока использую devmon:
http://igurublog.wordpress.com/downloads/script-devmon/
sfs 11-09-2011
а чем хуже для автомонтирования sudo mountpy ?
chestr 11-09-2011
юзал этот скрипт достаточно долго, потом начал упрощать - запускал файл-менеджер (pcmanfm, nautilus) с сессиями без всяких халов и все монтировалось. но теперь решил попробовать двм, потом решил на нем остаться, в качестве фм по умолчанию выбрал mc )
вобщем огромное тебе спасибо за все что ты делаешь)
muhas 11-09-2011
тоже раньше pcmanfm -d пользовал

>а чем хуже для автомонтирования sudo mountpy ?
а чем лучше? =)
sic 11-10-2011
На крайней случай можно вернуться к монтирование. Чтобы монтировать не от рута надо добавить какой-то параметр(не помню) через systcl и иметь права на чтение/запись у блочного устройства и его раздела и монтировать в каталог принадлежащий твоему пользователю.
Аноним 12-02-2012
Зачем изобретать велосипед, когда есть sys-fs/udiskie?
muhas 12-02-2012
Зачем udiskie когда есть autofs, ivman, и, собственно, сам udev...
каждому удобны разные велосипеды - не хуже не лучше, просто другие...
udiskie весит демоном, мне выриант вызова скрипта из udev нравится больше по нескольким причинам которые в упрощенном виде сводятся к трем незамысловатым пунктам
1) тем что не весит постоянно что-то вроде udiskie на питоне в памяти
2) тем что действия можно производить какие угодно (примонтировали - наколдовали что-то на флешке или в другом месте[залили бекап если флешка бекапная, к примеру, и сказали вынимай хозяина флешку всё готово]), udisks-glue в этом плане тоже интересен, хотя я его и не попробовал...
3) своя рубашка ближе к телу =)
chestr 12-02-2012
сейчас юзаю сам юдев, раньше недогонял как им пользоваться, щас въехал, окружение перешло в полный минимализм - dwm+urxvt+mc , поэтому и архива в шапке использую только скрипт для dmenu для отмонтирования, а остальное мне кажется лишним, например использование сессий ck и dbus, я хотел бы вообще от дбуса избавиться, например на нетбуке его требует только wicd демон

## оффтоп ##
купил недавно нетбук msi u90x, на нем гента, есть проблема с вафлей - при различных манипуляциях с ней (перезапуск wicd, включение/отключение хоткеями) в любой последовательности бывает отключаются устройства ввода (тач, клава, usb периферия) а бывает это не происходит, но при этом вафля нехочет ничего находить, хотя я держу бук меньше чем в метре от точки. вначале ставил на него арч, подобных проблем не было, но по религиозным причинам повесил генту. вобщем проблема задрала, во всем остальном бук пашет идеально, и батарейки 6-сегментной хватает на 6+ часов.

и наконец, поскольку wicd через питон грузит wpa_supplicant думаю написать свой скрипт на баше который заменит wicd и не будет висеть демоном

все сказал))
muhas 12-02-2012
@chestr по тегу udev у меня выложена пара удев правил для автомонтирования без использования ck и dbus - через pmount вроде бы, но можно и просто mount делать создавая каталоги... сам когда udev осознал был приятно поражен и несколько удивлен кучей софта который вроде бы при наличии удева и не нужен...

по поводу оффтопа: в арче есть netcfg и wifi-select - годные вещи и без всяких дбасов и прочего. думаю в генте тоже должно быть что-то похожее...
chestr 12-02-2012
забыл дописать) скриптик переделал, он отмантирует через pumount, а понтирую через mount с полным набором опций.
netcfg сомневаюсь что понадобится, с проводными сетями мне ifconfig и route достаточно, а вот wifi-select нету, надо попробовать портировать. спасибо
muhas 12-02-2012
netcfg и с беспроводными работает, wifi-select загружает его профили или создает новые - так что он зависим от netcfg и с портированием могут быть трудности
chestr 12-02-2012
хм, я посматрел на wifi-select, пакет из двух файлов - один bash скрипт в /usr/bin и один awk скрипт в либах, а если ему нужны профили, т.е. ему нужны конфиги, получается сам netcfg ему не нужен, хотя надо еще посматреть из чего и он слеплен
crigon 12-03-2012
Подскажите, пожалуйста, где смотреть про автомаунт cd/dvd
muhas 12-03-2012
извиняюсь за не слишком скорый ответ.
на арчефоруме была тема об этом с правилами для udev https://bbs.archlinux.org/viewtopic.php?id=100405
так же рекомендую посмотреть на autofs - он не только для cd/dvd но и для уймы другого, но думаю пригодится
crigon 12-03-2012
Спасибо. Хм, а с этим autofs нужен ли будет ещё ваш скрипт?
Пока непонятно, как там флешки отмонтировать...
Почему-то уведомление о комментарии на почту не пришло.
muhas 12-03-2012
А это как настроишь :)
По ссылке на арчефоруме udev правила для автомонтирования cd - может с ним проще будет.. я autofs сам не знаю, да и привода давно не имею :(
Paul Elms 12-05-2012
Спасибо за инфу, из трех твоих заметок я сделал для себя лучший вариант: мне не хотелось собирать udisks, потому что он тянет за собой ещё много ненужных мне вещей - consolekit, policykit и др. зависимости. Я собрал только pmount и монтирую с помощью простого правила udev, только монтирую в /media/label, а не в /media/sdxx как у тебя. Кроме того, в скрипте dmenu-umount заменил udisks на pumount - прекрасно работает.
Профит: минимум лишних слоев абстракции, работает все отлично, размонтировать легче легкого. Зачем тогда нужен udisks в этой схеме - не понимаю.
Уведомления о комментах мне не доходят - если что пиши на почту.
lwulf 12-07-2012
Спасибо, заметка хороша, но скрипт для автоОТмонтирования мне не подошел.
ls -1Q как я понимаю выводит в столбец(-1) и парамтр Q(лень смотреть что дает) идет по умолчанию и указывать его особо нет смысла(или я не прав?). Вообщем скрипт у меня выводит все папки соответствующие формату

вообщем заменил первые 2 строчки с переменной LABEL на такие:
LABEL=`/bin/mount|grep -i '/media/'|awk '{print $3}' | /bin/sed -e 's/\\/media\///g; s/^/[/;s/$/]/'|/usr/bin/dmenu -fn '-xos4-terminus-medium-r-normal--12-120-72-72-c-60-*-*' -nb '#737373' -nf '#e7e3e7' -sb '#e7e3e7' -sf '#737373' -p "Umount:"`
LABEL=`/bin/echo "$LABEL" | /bin/sed 's/\[//;s/\]//'`

тоесть мы выбираем все устройства которые смонтированы в папку /media, в том числе sshfs
из 1 строки викинул grep -v 'smbnet'
lwulf 12-07-2012
ну и сам скрипт(с использованием pmount и оповещалкой на aosd_cat)http://pastebin.com/XJqhTHNx