LINUX.ORG.RU

[udev][sh]automount


0

1

Добрый! Собственно сделал правило udev и скрипт к нему на sh (dash ибо Debian Squeeze) занимающийся созданием скриптов монтирования и отмонтирования вида mount_$UUID.$LABEL.

При вытыкании устройства должны удаляться сгенерированные скрипты, но это почему то не выполняется.

/etc/udev/rules.d/10-local-usb-storage.rules

ACTION==«remove», GOTO=«end_rule»
SUBSYSTEM!=«block», GOTO=«end_rule»
ATTR{partition}!=«1», GOTO=«end_rule»
KERNEL==«sd[b-z][0-9]», ACTION==«add», RUN+=«/usr/bin/mount_ssd %k»

ACTION==«add», GOTO=«end_rule»
SUBSYSTEMS!=«block», GOTO=«end_rule»
KERNEL==«sd[b-z][0-9]», ACTION==«remove», RUN+=«/usr/local/bin/rm_%k»

LABEL=«end_rule»

Сам скрипт к которому претензий нет /usr/bin/mount_ssd

Сама проблема в том что udev не запускает скрипт при отключении устройства.

★★★★

Ответ на: комментарий от leonidko

А если так?

KERNEL!="sd[a-z]*", GOTO="media_by_label_auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount_ssd %k"
ACTION=="remove", RUN+="/usr/local/bin/rm_%k"
LABEL="media_by_label_auto_mount_end"

А то получается, что при remove у тебя просто правило перепрыгивает в конец.

post-factum ★★★★★ ()
Ответ на: ОЧЕНЬ от leonidko

Re: ОЧЕНЬ

Заработало? Хм ;).

post-factum ★★★★★ ()
Ответ на: ОЧЕНЬ от leonidko

Остановился пока на таком варианте. И простым пользователям я разрешил использовать эти скрипты через sudo.

SUBSYSTEM!=«block», GOTO=«end_rule»
KERNEL!=«sd[b-z][0-9]», GOTO=«end_rule»
ACTION==«add», RUN+=«/usr/bin/mount_ssd %k»
ACTION==«remove», RUN+=«/usr/local/bin/rm_%k»
LABEL=«end_rule»

leonidko ★★★★ ()
Ответ на: ОЧЕНЬ от leonidko

Скрипт, который пишет что-то в /usr/local/bin? Хм...
К тому же у тебя юзвери не смогут отмонтировать флешки (так как в /etc/fstab они не прописываются с users), а дёргать их без отмонтирования — лотерея.

Lumi ★★★★★ ()

Ничего не понял: вы что, хотите отмонтировать устройство уже после его извлечения?

А за информацию, да и саму железяку, не боитесь?

Eddy_Em ☆☆☆☆☆ ()

Единственный расово верный способ - при подключении носителей создавать в /media точку монтирования для них и добавлять строку в fstab. После отключения - удалять директорию и строку из fstab.

А монтировать/размонтировать - руками.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от leonidko

Почему ты так решил? Смотрели. Смысла делать скрипт для отмонтирования, а потом думать где он лежит и как называется нет никакого. Хотя если ты единственный пользователь, то можешь хоть штаны через голову одевать.

Lumi ★★★★★ ()
Ответ на: комментарий от Lumi

Тут про вас можно поговорку процитировать, особенно в той части что вы увидели.

А не увидели вы следующего. Всё сделано модульно. После создания подобных скриптов можно сделать менюшку. Из которой уже и будет от/монтировать флешку. Или плазму, или апплет, или...

P.S. А /usr/local/bin/ у меня в PATH

leonidko ★★★★ ()
Ответ на: комментарий от leonidko

И что, не проще по-человечески прописать в консольке mount/umount, или же воспользоваться уже готовыми менюшками? (т.е. сделать, как я предлагал)

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

1) Мне лениво помнить опции монтирования. И не учить же мне семью/бухгалтерию как делать ЭТО.
2) ВНЕЗАПНО!!111адинадин может прийти друг с каким-нибудь свежим/чужим диском.
3) Оно делает это автоматически.
4) Не требует лишних сущностей (аля HAL,policykit, ещёкакойнибудьkit).

leonidko ★★★★ ()
Ответ на: комментарий от leonidko

1) их не надо помнить - udev сам нужную строку в fstab добавит

2) udev и это проглотит

3) во-первых, DVD-video монтировать не надо, во-вторых, если вам надо отформатировать флешку, ее тоже надо отмонтировать. А у вас отмонтирование не предусмотрено вообще никак, кроме разве что sync и выдернуть.

4) а я про них и не говорил - только udev

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Перечитайте ВСЮ ветку.

И не говорите мне странных и удивительных вещей.

1) fstab - static info about filesystems
2) Он его определит. Я это знаю и не спорю.
3) Во-первых перечитайте всю ветку. Внимательно.
4) Где? Всё остальное завязано на fstab или на HAL+D-BUS во всех своих ипостасях.

leonidko ★★★★ ()
Ответ на: Перечитайте ВСЮ ветку. от leonidko

А вот теперь - сюрприз: udev при подключении носителя добавляет нужную строчку в fstab и создает нужную директорию в /media (об этом я выше говорил), а при выдергивании носителя - удаляет их (и об этом я говорил).

Вам же нужно лишь либо воспользоваться командами mount/umount, либо тыкнуть мышей в «кнопочку» (которая тоже будет работать, т.к. в fstab запись есть).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

udev не делает записи в fstab. И точка.
Можно научить, но это криво и ненужно ибо смотри 1) моей предыдущей записи.

Повторю ещё раз. СМОТРИ пункт 1) моей предыдущей записи. У меня все флешки не статичны.

Кто сказал что я этими командами не пользуюсь? Вы таки не сделали что я вам предлагал.

leonidko ★★★★ ()

>> Debian Squeeze

Там есть пакет usbmount — по сути то же самое, но уже в готовом виде. JFYI.

GotF ★★★★★ ()
Ответ на: комментарий от Eddy_Em

Забей, паренёк упорот в своей костыльной правоте.

Lumi ★★★★★ ()
Ответ на: комментарий от Eddy_Em

Странно, но я и в самом деле не нашёл его. Хотя признаю что и не сильно-то старался. Так понимаю этот скрипт сохраняет совместимость с существующим ПО завязанным на fstab.

Но как управляются права для каждого пользователя на [u]mount? У меня через sudo. У вас?

И собственно я старался наоборот, уйти от всякой возни с sed|awk и т.п.

Тут наши решения подобны BSD и SysV :-)


GotF: Спасибо. Посмотрел. Не понравилось что тут же захламил мне /media/ пустыми каталогами usb[0-9].

Lumi: Я тут почитал эту ветку снова. Можно я буду вас называть Д'Артаньян?

leonidko ★★★★ ()
Ответ на: комментарий от leonidko

как управляются права для каждого пользователя на mount

Там написано же: в fstab прописывается user, т.е. кто подмонтирует, тот и отмонтировать должен будет. И права на vfat/ntfs будут для него.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от leonidko

Называй как хочешь. Ума это тебе не прибавит.

Lumi ★★★★★ ()
Ответ на: комментарий от Eddy_Em

cat /srv/etc/udev/rules.d/11-flash-auto-mount.rules
KERNEL!=«sd[d-z][1-9]», GOTO=«my_media_automount_end»
ACTION==«add», KERNEL==«sd[a-z][0-9]», RUN+=«/usr/local/bin/media_mount '%k' mount»
ACTION==«remove», KERNEL==«sd[a-z][0-9]», RUN+=«/usr/local/bin/media_mount '%k' unmount»
LABEL=«my_media_automount_end»


cat /usr/local/bin/media_mount
#!/bin/bash

FSTYPE=$(/sbin/blkid -o value /dev/${1} | /bin/sed '$!d')
DIRNAME=$(/sbin/blkid -o value /dev/${1} | /bin/sed 'q;s/\ /_/g')
if [ «x${DIRNAME}» == «x» ]; then DIRNAME=usbdrive-${1}; fi

if [ «x$2» == «xmount» ]; then
case ${FSTYPE} in
vfat)
   /bin/mkdir «/media/${DIRNAME}»
   /bin/mount /dev/$1 «/media/${DIRNAME}» -t vfat -o shortname=lower,iocharset=utf8,noatime,users,dmask=000,fmask=111 && \
   /bin/echo /dev/$1 \«/media/${DIRNAME}\» vfat shortname=lower,iocharset=utf8,noatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
;;

ntfs)
/bin/mkdir «/media/${DIRNAME}»
/bin/mount /dev/$1 «/media/${DIRNAME}» -t ntfs-3g && \
/bin/echo /dev/$1 \«/media/${DIRNAME}\» ntfs-3g relatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
;;

*)
/bin/mkdir «/media/${DIRNAME}»
/bin/mount /dev/$1 «/media/${DIRNAME}» -t auto -o users && \
/bin/echo /dev/$1 \«/media/${DIRNAME}\» auto users 0 0 >> /etc/fstab
;;
esac
else
   /bin/umount -l /dev/${1}
   /bin/rmdir «$(/usr/bin/awk »/${1}/ { print \$2 }" < /etc/fstab)"
   /bin/sed «/\/dev\/${1}/d» -i /etc/fstab
fi


Автомонтировка, отмонтировка от пользователя, что в консоли, что из наутилусов всяких, что из менюшек выпадающих. И не надо айподиться с дикими именами автогенерируемых скриптов.
Да, надо дописать автозачистку /etc/fstab от мусора. Он появляется, если выключить компьютер, а потом дёрнуть флешку. У ТС при аналогичной ситуации засирается всё сгенерированными скриптами. При желании awk можно выкинуть и обойтись без необходимости в программах, лежащих в /usr/bin.

Lumi ★★★★★ ()
Ответ на: комментарий от leonidko

> Интересна логика очистки fstab от мусора.

Получить список A существующих /dev/sd[d-z][1-9] (начальная буква может быть другая)
Получить список B точек монтирования для /media из fstab, соответствующий существующим устройствам из списка А
Получить список C каталогов в /media
Получить из команды mount список D смонтированного в /media
Из списка C вычеркнуть содержимое D и содержимое В. Получаем мусорные точки монтирования в /media, в которые ничего не смонтировано и которые не соответствуют существующим, но отмонтированным устройствам. По этому списку проводим зачистку.
Затем получаем список E выживших точек монтирования
Получаем список F всех точек монтирования в /media, вписанных в /etc/fstab
Вычеркиваем из F содержимое Е
Вычищаем по списку F содержимое /etc/fstab
После этого в fstab остаются записи соответствующие только существующим устройствам смонтированным автоматически, при этом под нож не попадают точки монтирования в /media для которых производилось монтирование руками.

Алгоритм громоздок, поэтому я на него подзабил. Реально лишняя точка монтирования и запись в /etc/fstab сама подчистится, когда эту флешку ещё раз воткнуть и вытащить при включенном компьютере. Хотя, если втыкаются чужие флешки, то запись может застрять.

Алгоритм можно упростить, если учитывать, что удалить каталог, в который что-то смонтировано не удастся (если конечно не применять rm -rf) и если не надо беречь точки для отмонтированных устройств.
Тогда просто удаляем все каталоги в /media какие получится, выживших заносим в список и чистим в /etc/fstab вхождения с media, которых нет в этом списке.

Lumi ★★★★★ ()
Ответ на: комментарий от Eddy_Em

> У меня короче вышло =)
Олимпиадной цели не было. :)
И ещё мне не нравится, как я получаю точку монтирования и тип файловой системы. Поменяют выхлоп у blkid и всё сломается. Ну и вместо DIRNAME=usbdrive-${1} лучше UUID для FS флешки использовать.

Lumi ★★★★★ ()

udev не предназначен для автомаунта. Использовать его таким образом — жуткое извращение в духе Windows. Linux же система многопользовательская, многозадачная. Такие костыли, как монтирование сменных носителей через правила udev в ней совершенно не нужны.

Есть специальные демоны, udisks и пр., которые, взаимодействуя с udev, предоставляют в окружение пользователя информаию о сменных носителях. На это и нужно ориентироваться.

anarquista ★★★★★ ()
Ответ на: комментарий от anarquista

Ты совершенно прав, но вся эта чехарда с халами, потом юдисксами, и девайскитами как-то напрягает. А здесь топорно сделал на свой вкус и всё зашибись, а юдисксы пусть пока допиливают до вменяемого состояния.
Одну и ту же задачу можно делать разными способами. Здесь даже cups виртуозы не по его прямому назначению применяют и делают это очень остроумно.

Lumi ★★★★★ ()
Ответ на: комментарий от Eddy_Em

Мне не было бы проще, но, для флешек с FS без метки в принципе такое подойдёт вместо ююйда.

Lumi ★★★★★ ()
Ответ на: комментарий от anarquista

А разве udev не есть прослойка из пространства ядра в пространство пользователя? Тогда зачем мне нужен ещё висящий в памяти слегка непонятный демон?

Да и что у меня, что у Lumi udev только дёргает скрипты по событию. Монтирование и отмонтирование это дело пользователя.

leonidko ★★★★ ()
Ответ на: комментарий от leonidko

> Монтирование и отмонтирование это дело пользователя.
ППКС, хотя при автомонтировании получается, что дело не совсем пользователя, но можно и не монтировать автоматом, а просто делать запись в /etc/fstab правильную и точку монтирования в /media и тогда можно руками и мышами монтировать и размонтировать.

Lumi ★★★★★ ()
Ответ на: комментарий от leonidko

> Да и что у меня, что у Lumi udev только дёргает скрипты по событию. Монтирование и отмонтирование это дело пользователя.

Совершенно не согласен. Полностью. Монтирование и отмонтирование это дело не пользователя, а многих и разных пользователей.

Не каждый пользователь, который может вставить флешечку, может писать какие-то скрипты, которые бы udev дергал. Еще один уровень необходим. udisks это не блажь людей с freedesktop.org, а насущная потребность.

anarquista ★★★★★ ()
Ответ на: комментарий от anarquista

Не каждый пользователь, который может вставить флешечку, может писать какие-то скрипты, которые бы udev дергал.

Пусть берет готовые.

А если руками влом монтировать, то есть всякие графические утилитки, которые при правильных записях в fstab тоже отлично работают.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от anarquista

Сколько можно повторять: ну почитайте вы, что мы с Lumi делаем!!!

Втыкаете вы флешку. В /media создается нужная директория, а в fstab - нужная запись с -o user, т.е. любой может это дело монтировать.

Все делается udev'ом, безо всяких рутов!

Eddy_Em ☆☆☆☆☆ ()
19 августа 2011 г.
Ответ на: комментарий от Lumi

Спасибо за помощь в виде примера.

Собственно идея была в уменьшении телодвижений скрипта.


cat /etc/udev/rules.d/11-removable-usb-storage.rules

SUBSYSTEM!=«block», GOTO=«end_rule»
KERNEL!=«sd[b-z][0-9]», GOTO=«end_rule»
ACTION==«add», RUN+=«/usr/bin/mount_media %k plugdev»
ACTION==«remove», RUN+=«/usr/bin/mount_media %k unplugdev»
LABEL=«end_rule»

Операция монтирования и записи в /etc/fstab в вашем исполнении не понравилась. Какая то на мой взгляд монструозная и опции монтирования исполняемой команды и записанные в /etc/fstab несовпадают.

Обнаружил что запись в /etc/fstab: «/media/mountpoint» != /media/mountpoint

Решение проблем с пробелами в LABEL решил заменой их на символы подчёркивания. Хотя в man fstab пишут что их можно экранировать на \040. Может займусь этим :-)


cat /usr/bin/mount_media
#!/bin/sh
#
# License?
#

#
# UUID раздела
#
#PART_UUID=«`/sbin/blkid -o value -s UUID /dev/${1}`»

#
# LABEL раздела
#
PART_LABEL=$(/sbin/blkid -o value -s LABEL /dev/${1} | /bin/sed 's/ /_/g')

#
# FS раздела
#
PART_FS=$(/sbin/blkid -o value -s TYPE /dev/${1})

#
# Проверить подключается устройство или отключается?
#
if [ «$2» = «plugdev» ]
then /bin/mkdir /media/${1}.${PART_LABEL}

#
# Определить, не смонтирован ли уже раздел?
#
# if [grep -e ${1} -e mount]
# then printf Всё смонтировано, я в отбой. && exit 0

case ${PART_FS} in

vfat)
/bin/echo /dev/${1} /media/${1}.${PART_LABEL} vfat shortname=lower,iocharset=utf8,noatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
/bin/mount /dev/${1}
;;

ntfs)
/bin/echo /dev/${1} /media/${1}.${PART_LABEL} ntfs-3g relatime,users,dmask=000,fmask=111 0 0 >> /etc/fstab
/bin/mount /dev/${1}
;;

*)
/bin/echo /dev/${1} /media/${1}.${PART_LABEL} auto users 0 0 >> /etc/fstab
/bin/mount /dev/${1}
;;

esac
else
/bin/umount -l /dev/${1}
/bin/rmdir --ignore-fail-on-non-empty «$(/usr/bin/awk »/${1}/ { print \$2 }" < /etc/fstab)"
/bin/sed «/\/dev\/${1}/d» -i /etc/fstab
fi

exit 0

Надо проверить как себя поведёт при наличии разделов более одного.

leonidko ★★★★ ()
Ответ на: Спасибо за помощь в виде примера. от leonidko

Проблема.

При втыкании первой флешки появляется каталог типа sdh1.LABEL1. Вытыкаем первую, втыкаем вторую. Всё монтируется, но каталог только вида sdh1. При перетыке второй всё нормально. Опять втыкаем первую флешку и опять не отображается LABEL. Приходится перетыкивать.

leonidko ★★★★ ()
Ответ на: Проблема. от leonidko

Вместо
PART_LABEL=$(/sbin/blkid -o value -s LABEL /dev/${1} | /bin/sed 's/ /_/g')
пишем
PART_LABEL=$(/sbin/blkid -p -o value -s LABEL /dev/${1} | /bin/sed 's/ /_/g')

leonidko ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.