/ Статьи / Системное / Автомонтирование Flash-накопителей в Linux средствами udev /

Автомонтирование Flash-накопителей в Linux средствами udev

Дата публикации: Aug. 16, 2010, 6:05 a.m.
Теги: flash, udev, linux,
Автор: Brainsburn

монтер Для начала, о ручном монтировании флешек.

У меня есть два жестких диска - /dev/sda и /dev/sdb, и флешка. После подключения флеш-накопителя к компьютеру, в системе появляется новое устройство - /dev/sdc. Его можно открыть в fdisk и создать новую партицию, а затем создать на ней файловую систему и примонтировать куда-нибудь:

# mkfs.ext2 /dev/sdc1
$ mkdir /mnt/flash
# mount /dev/sdc1 /mnt/flash
А теперь, об автомонтировании.

В userfriendly дистрибутивах автомонтирование работает "из коробки" и пользователь может и не знать, как оно там сделано. Но знать, как настроить автомонтирование флешек надо, если вы работаете не с DE, а с простым WM или вообще в консоли. Нижеописанный способ автомонтирования будет работать независимо от используемого оконного менеджера и даже без запущенных иксов.

Раньше автомонтирование осуществлялось средствами HAL, но сейчас он отбросил коньки и правильнее использовать настройку автомонтирования через udev. Об этом мы и поговорим.

Суть сводится к тому, чтобы указать udev-у при каком-то особом событии выполнять нужную команду. В нашем случае это монтирование флешки. Сделать это можно, создав правило для udev. Правила udev лежат в /etc/udev/rules.d/ . Вы можете заметить, что там уже есть несколько файлов с правилами. Имена этих файлов начинаются, обычно, с цифр. Это сделано потому-что udev читает файлы правил в алфавитном порядке. Т.е. файл 10-test.rules udev считает раньше, чем 30-blabla.rules. Запомните еще одну важную вещь - когда udev находит первое правило, подходящее для события, он прекращает дальнейший поиск.

Все, что нам надо - добавить следующие строки в файл /etc/udev/rules.d/10-automount.rules. На самом деле, имя может быть любым, а начинается оно с десятки, чтобы правило считывалось раньше других.

# cat /etc/udev/rules.d/10-automount.rules
SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", RUN+="/bin/mount /dev/sdc1 /mnt/flash/"
SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/bin/umount /mnt/flash"

Разберем это по порядку. Во-первых, запомните - одно правило - одна строчка. В нашем файле два правила - одно на монтирование флешки при подключении ее к компьютеру, и второе - на отмонтирование ее при отключении.

SUBSYSTEM=="block" указывает класс блочных устройств. KERNEL=="sd*" - этот шаблон фильтрует устройства по именам. Вы можете использовать KERNEL="sd[c-z]*" или что-то в этом духе. ACTION=="add" - событие добавления устройства. RUN+="/bin/mount /dev/sdc1 /mnt/flash" - эта опция указывает, какую команду надо выполнять. Если честно, это не лучший вариант, но зато самый простой.

Во второй строке все аналогично. кроме того, что детектится событие не добавления, а удаления устройства, после чего выполняется команда umount.

Чтобы сообщить udev о добавлении новых правил, выполните команду

# udevadm control --reload-rules
Создайте каталог /mnt/flash (да-да, его надо создать вручную) и подключите флешку к компьютеру. Она должна примонтироваться.

Усовершенствуем технологии

Посмотрим, как можно улучшить наше правило udev для автомонтирования. Было бы не плохо, чтобы система сама создавала точку монтирования, а после отключения флешки - удаляла ее. И еще было бы хорошо подставлять текущее имя устройства в команду mount вместо ручного написания /dev/sdc1, т.к. имя устройства может и измениться. Для этого, приведем /etc/udev/rules.d/10-automount.rules к такому виду:

SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mkdir -p /mnt/flash"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mount -O uid=1000 /dev/%k /mnt/flash/"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/umount /mnt/flash"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/rm -r /mnt/flash"

Для активации изменений не забудьте выполнить
# udevadm config --reload-rules

Рассмотрим эти строки.
В первой строке создается каталог, в который будет осуществлено монтирование.
Во второй строке происходит само монтирование. Обратите внимание на uid=1000 - это uid вашего пользователя. Если у вас это значение отличается от 1000, измените его на нужное. "%k" в /dev/%k означает имя устройства, переданное ядром, т.е. sdc1.
В третьей и четвертой строке происходит отмонтирование флеш-накопителя и удаление каталога /mnt/flash.

Кому-то будет удобнее, если имя точки монтирования будет включать имя устройства, например /mnt/flash-sdc1. Как не трудно догадаться, для этого надо /mnt/flash заменить на /mnt/flash-%k:

SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mkdir -p /mnt/flash-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="add", RUN+="/bin/mount -O uid=1000 /dev/%k /mnt/flash-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/umount /mnt/flash-%k"
SUBSYSTEM=="block", KERNEL=="sd[c-z][0-9]", ACTION=="remove", RUN+="/bin/rm -r /mnt/flash-%k"

Вот и все. Если что-то не получается, перепроверьте себя на опечатки.
Для вступления в силу изменений перезагружать компьютер не нужно.

PS:
Чуть не забыл рассказать об одной интересной команде.
Если хотите промониторить, что видит система при подключении/отключении устройства, выполните следующую команду:
# udevadm monitor --property --kernel --udev
Теперь вставьте флешку в usb. На экран вывалится куча блоков текста. Вам нужен последний. В нем можно увидеть тип файловой системы, фирму-изготовитель, модель и серийный номер флешки, а так же много другой полезной информации, которая поможет при составлении правил для udev.

Удачи!




Возможно, эти материалы Вас заинтересуют:


Рекомендовать эту страницу:

Комментарии:(17)

# sergey Nov. 20, 2010, 10:41 p.m.
Для активации изменений не забудьте выполнить
# udevadm config --reload-rules

здесь ошибка вместо config пишем control

# SergaNT404 Nov. 26, 2010, 10:58 p.m.
Если позволите - небольшое дополнение: чтобы на примонтированной флешке в именах файлов корректно отображались русские буквы, вторую строчку нужно привести к такому виду :
SUBSYSTEM=="block", KERNEL=="sd[b-z][0-9]", ACTION=="add", RUN+="/bin/mount -o iocharset=utf8,codepage=866 -O uid=1000 /dev/%k /mnt/flash-%k"

# mitrofan Dec. 3, 2010, 9:05 p.m.
И ещё одно дополнение. :) Можно не смотреть в кучу вываливающихся сведений при мониторинге udevadm monitor. Подключив впервые флешку и определив название устройства (хоть ч/з dmesg | tail ) надо бы подать, например
udevadm info -a -p $(udevadm info -q path -n /dev/sdc)
если флешка - это sdc
Тогда все эти серийные номера, vid/pid и проч. можно хоть записать.
Дальше по поводу параметра %k.
%r, - каталог для файлов устройств (по умолчанию /dev)
%p, - значение DEVPATH
%k, - параметр KERNEL или имя, присвоенное устройству ядром системы
то есть %p == %r/%k. Спрашивается: а зачем печатать /dev/%k ?
Если заместо флешки всунете внешний хард, то он тоже монтироваться в /mnt/flash-%k ? Типа под флешку косит 2-х терабайтник?
Не лучше ли присвоить какое-нибудь своё имя устройству на usb порту, а уже потом рулить именованным устройством:
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{manufacturer}=="бла-бла-ба", ATTRS{product}=="бла-бла", ATTRS{serial}=="бла-бла-бла-бла", NAME="что-нибудь вменяемое, например KINGSTON4G"
где все эти бла из выше названной udevadm info -a -p $(udevadm info -q path -n /dev/sdc)
И после этого в /dev должно быть устройство не какое-то там sd-фиг-знает-какой-номер, а KINGSTON4G


# Yellow Rabbit Feb. 9, 2011, 4:06 a.m.
Запутался я что-то, здесь ( http://reactivated.net/writing_udev_rules.html ) вроде говорят, что udev не останавливается ни в коем случае на первом же правиле.

``One device can be matched by more than one rule. This has it's practical advantages, for example, we can write two rules which match the same device, where each one provides its own alternate name for the device. Both alternate names will be created, even if the rules are in separate files. It is important to understand that udev will not stop processing when it finds a matching rule, it will continue searching and attempt to apply every rule that it knows about.''


# Юрий May 30, 2011, midnight
итак, рабочее правило:
ACTION=="add" KERNEL=="sd" RUN+="/bin/mkdir -p /media/%k"
ACTION=="add" KERNEL=="sd" RUN+="/bin/mount -o iocharset=utf8,codepage=866,uid=1000 /dev/%k /media/%k"
ACTION=="remove" KERNEL=="sd" RUN+="/bin/umount /media/%k"
ACTION=="remove" KERNEL=="sd" RUN+="/bin/rmdir /media/%k"
а то что написал г-н SergaNT404 про 2-ю строчку не работает естественно
теперь про отмонтирование, я правильно понимаю, если задействовать данное правило, то при удалении флешки она автоматом отмонтируется? то есть руками можно этого не делать? или все-таки предпочтительнее сделать? а если делать, то как, ибо оно возможно только от рута. нашел такой метод:
1. sudo visudo
2. добавить строчку %wheel ALL= NOPASSWD: /bin/umount
ваше мнение по этому поводу?

# Юрий May 30, 2011, 12:06 a.m.
извиняюсь, криво скопировалось
ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mkdir -p /media/%k"
ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mount -o iocharset=utf8,codepage=866,uid=1000 /dev/%k /media/%k"
ACTION=="remove" KERNEL=="sd[c-z][0-9]" RUN+="/bin/umount /media/%k"
ACTION=="remove" KERNEL=="sd[c-z][0-9]" RUN+="/bin/rmdir /media/%k"

# Brainsburn May 30, 2011, 12:33 a.m.
Да, все отмонтируется автоматически. По поводу разрешения юзерам делать umount это решать вам.

# Гость Feb. 7, 2012, 6:25 p.m.
Что посылает udev команду ACTION=“remove”? Ведь udev же должен обрабатывать подключение и отклчение устройства,то как тогда можно отмонтировать после отключения устройсва?

# Гость Feb. 7, 2012, 10:48 p.m.
Гость, не очень понятен ваш вопрос. Как при подключении, так и при отключении устройства происходит определенное событие, на которое демон udev реагирует.

# Гость Feb. 12, 2012, 2:06 a.m.
Мужики, не тормозите.

Когда удаляется флешка, уже ничто не может записать буфера в памяти на неё - всё будет потеряно.
Автоматом по событиям удаляются только ссылки на устройство.

Судя по вашим скриптам к компу могут подключаться как sd* только флешки, только с одним разделом, только с мастдайной ФС. Финиш.

# Brainsburn Feb. 13, 2012, 10:14 p.m.
Гость, неужели вы думаете, тут кто-то полагает, что после извлечении флешки из usb на нее можно будет продолжать записывать? Меня ваше предположение повергло в легкий шок :)
Подключаться может что угодно и как угодно, тип фс тут вообще не причем. Это вам не винда, в линуксе все логично и прозрачно. При подключении любого устройства происходит событие, отлавливаемое udev. На это событие можно повесить выполнение любой команды, например, монтирование флешки или выключение компьютера. Финиш это или нет, решать вам :)

# Oleg Feb. 16, 2012, 8:34 a.m.
Привет.
Как сделать, чтобы флеха автомонтировалась в ~/имя_каталога а не в /media?

# tempus Sept. 1, 2012, 9:45 a.m.
непонятен момент с размонтированием. событие remove появится только ПОСЛЕ выдергивания флехи, ну и накой тогда umount? размонтировать нужно ДО вытыкания.

# Niko2040 April 22, 2013, 8:36 a.m.
Жжоте в коментариях. Размонтируется оно, чтобы не висело информации о монтировании. А размонтировать ДО вытыкания - вы уж простите, но комп вам не телепат)

# Walkman May 19, 2013, 7:02 p.m.
ACTION==“add”, KERNEL=="sd[b-z][0-9]“, RUN+=”/bin/mkdir -p /home/share/%k“
ACTION==”add“, KERNEL==”sd[b-z][0-9]“, RUN+=”/bin/mount /dev/%k /home/share/%k“
ACTION==”remove“, KERNEL==”sd[b-z][0-9]“, RUN+=”/bin/umount -l /home/share/%k“
ACTION==”remove“, KERNEL==”sd[b-z][0-9]“, RUN+=”/bin/rmdir /home/share/%k“, OPTIONS=”last_rule“
ACTION==”add“, KERNEL==”sr[0-9]“, RUN+=”/bin/mkdir -p /home/share/%k“
ACTION==”add“, KERNEL==”sr[0-9]“, RUN+=”/bin/mount /dev/%k /home/share/%k“
ACTION==”remove“, KERNEL==”sr[0-9]“, RUN+=”/bin/umount -l /home/share/%k“
ACTION==”remove“, KERNEL==”sr[0-9]“, RUN+=”/bin/rmdir /home/share/%k“, OPTIONS=”last_rule"

# Walkman May 20, 2013, 8:47 a.m.
Размонтирование явно произходит пост-фактум. И, возможно, оно и ни к чему. Но после размонтирования ведь ещё и точка монтирования убивается. Так что пусть уж будет и юмаунт.

# XRumerTest July 1, 2015, 12:38 p.m.
Четвёртый вариант полного описания объявления + пара вариаций

Комментировать:

Гость, Вы можете оставить свой комментарий.

Стиль кода:
Имя
Сайт * не обязательное поле
Поставьте галку, если вы - бот
Поставьте галку, если вы - человек

Друзья! Убедительная просьба воздержаться от нецензурной лексики!



Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.




Последние комментарии:

fanyit: Спасибо за обзор. очень полезно и доступно.... >>>
cheech: Спасибо, статья полезная )... >>>
Васёк: Коммент, расскажи про часы на стене капитану в оке... >>>
METAJIJI: Ах да, почему я начал вообще трогать urxvt, потому... >>>
METAJIJI: Вкладки как раз не феншуйные (штатный tabbed), они... >>>