22 апреля 2008

Udev usb-flash automount

Организовал монтирование флешек с помощью udev + /etc/fstab. Причин для такого подхода несколько:
1. Ужасный экспириенс от демонов автомонтирования в suse (и ещё более ужасный - от mandriva)
2. Любовь к юниксвею и бритве Оккама
3. Особенности опций mount (8)
4. Я отставший от жизни маргинал и не знаю, как это делается в правильных остальных дистрибутивах
Реализуется всё один правилом для udev:


1 kernel=="sd[a-z]", name="%k", symlink+="usb%m", group="users"
2 action=="add", kernel=="sd[a-z][0-9]", symlink+="usb%n", group="users", name="%k"
3 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/mkdir -p /mnt/usb%n"
4 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/sed -i '$a\/dev/%k /mnt/usb%n vfat rw,noauto,noexec,nodev,noatime,users,iocharset=koi8-r,codepage=866,uid=1000,gid=100 0 0' /etc/fstab"
5 action=="add", kernel=="sd[a-z][0-9]", run+="/bin/mount /dev/%k"
6
7 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/umount -l /dev/%k"
8 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/rmdir /mnt/usb%n"
9 action=="remove", kernel=="sd[a-z][0-9]", run+="/bin/sed -i '/\/dev\/%k.*/d' /etc/fstab"

идея которого проста - при появлении устройства создавать для него строку в /etc/fstab (потому что только так можно заюзать опцию users, позволяющую омонтировать устройство кому угодно, а не только руту, от имени которого оно будет смонтировано udev'ом) и монтировать, при извлечении - удалять строку.
Юзабельность - отличная. Само монтируется, при наличии нормального DE можно добиться создания ярлычков и открытия окон, легко отмонтируется (из трея например штуками типа kwikdisk).

10 комментариев:

GQ комментирует...

Проблем несколько:
1.SATA/SCSI диски
2.Кардридеры
3.Флэшки с ФС без таблицы разделов
4.Файловая система на подключенном диске может быть не только vfat

PhoeniX комментирует...

Не забывайте, я монтирую свои флешки, и они, как среднестатистические, не являются первым, вторым, третьим и имеют ФС FAT.
А вообще, принцип расширяем для частных случаев. Достаточно sed скрипт заменить на более подходящий (на любом языке).

PhoeniX комментирует...

Кстати стоп, картридер один я точно так же монтирую... в чём проблема?
абсолютно noname картридер с карточкой SD от моего кпк.

veritas-buyer комментирует...

лучше imho все-таки создать по одному правилу на каждое конкретное устройство - удобнее, когда флешка всегда монтируется в /media/flash/, а переносной винчестер, к примеру, в /media/comstor/
Вместе с этим отпадают проблемы, обозначенные выше gq

veritas-buyer комментирует...

у меня получилось вот так:

SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ACTION=="add", ATTRS{vendor}=="Generic", NAME="%k", GROUP="disk", SYMLINK+="flash", RUN+="pmount -t ntfs-3g /dev/flash"
SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ACTION=="add", ATTRS{vendor}=="ST320082", NAME="%k", GROUP="disk", SYMLINK+="comstor", RUN+="pmount -t ntfs-3g /dev/comstor"


pmount, судя по всему, действует так же, как ваш скрипт

P.S.про udevrules, атрибуты sysfs и прочее необходимое читать тут http://www.reactivated.net/writing_udev_rules.html

PhoeniX комментирует...

Можно и по правилу на устройство. Вся прелесть удава в том и есть, что его можно как угодно гибко использовать.
За pmount спасибо, не дадите ссылочку покурить дальше? А writing udev rules я уже читал, он, конечно, лучшее, что есть, но и то неполный какой-то.

veritas-buyer комментирует...

вкурил на днях случайным тыком:

оказывается, можно просто
"pmount flash"
вместо
"pmount -t ntfs-3g /dev/flash"

причем, автоматически определяется ntfs-3g - хотя в мане сказано, что будет использоваться ntfs модуль из ядра (может это оттого, что его у меня нет :)

...мде, удев остается немного в тумане. видимо, пора учиться изучать код помимо мануалов ,)

Shender комментирует...

А у Вас получается при этом монтировать ntfs-разделы в локали utf8? У меня почему-то нет. Зато если делать не udev'ом, а ручками, в консоли --- всё работает.

PhoeniX комментирует...

Получится или нет - вопрос глубины затяжки при курении man mount(8), imho. Сама связка интересна мне была.

Pevzi комментирует...

Спасибо за идею (: сейчас дополню свой конфиг.