В началоПрочее → Udev и автомонтирование носителей
Gentoo-doc HOME Пред.: Редактор nanoВ началоУровень выше: ПрочееСлед.:  Оптимизация glibc

5. Udev и автомонтирование носителей

5.1. Введение

В данной статье речь пойдет о том, как настроить udev для автоматического монтирования и отмонтирования usb-носителей. Ведь согласитесь, неудобно каждый раз монтировать флэшки из консоли. А когда вам нужно быстро что-то скинуть с одной флэшки на другую? Здесь я привожу одно из возможных решений.

5.2. Требования

У меня установлена следующая версия udev:

sys-fs/udev-069

Я умышленно не ставлю более новые версии, т.к. с ними возникают проблемы при загрузке firmware на моем компьютере. Возможно в более новых версиях что-то работает по-другому, но суть одна и та же.

5.3. Настраиваем udev

Создаем правила для flash-носителей

Правила udev, в соответствии с которыми устройствам назначаются имена, а также выполняются специфические действия, расположены в /etc/udev/rules.d/*. В этой директории уже есть файлы, содержащие правила, у меня их было 2:

# ls /etc/udev/rules.d

05-udev-early.rules

50-udev.rules

Такие названия им были даны неспроста. Дело в том, что udev обрабатывает файлы в этой директории в алфавитном порядке по возрастанию. Вообще, при написании правил udev следует помнить 2 главные вещи:

Udev считывает файлы из /etc/udev/rules.d в алфавитном порядке.

Найдя первое подходящее правило для устройства, udev прекращает дальнейший поиск.

Давайте добавим свой файл с правилами так, чтобы он обрабатывался раньше, чем файл с правилами по умолчанию (50-udev.rules). Назовем его 10-udev-my.rules. Содержимое нового файла будет следующим:

Файл: /etc/udev/rules.d/10-udev-my.rules

# First rule

SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", NAME="%k", GROUP="disk", RUN+="/etc/udev/scripts/udev-flash-mount add %k"

#Second rule

SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/scripts/udev-flash-mount remove %k"

Теперь разберемся в том, что написали.

Первое правило (добавление устройства)

SUBSYSTEM=="block" При добавлении нового устройства в систему возникает множество событий разных классов. block — это класс для блочных устройств, который нам больше всего подходит для составления правила. Для просмотра значений всех переменных, возникающих событий используйте udevmonitor --env Т.о. здесь мы реагируем только на событие, в окружении которого есть переменная SUBSYSTEM со значением block .

KERNEL=="sd*" Эта часть правила сравнивает имя устройства, которое было дано по умолчанию ядром, с шаблоном. В данном случае нам нужны такие имена как: sda, sda1, sdb, sdb1 и т.д.

ACTION=="add" Реагируем на событие добавления устройства. Например, usb флэшка была вставлена в разьем.

NAME="%k" Обратите внимание на то, что здесь стоит один знак равенства, а не два, как в предыдущих частях правила. Это говорит о присваивании, а не сравнении. Здесь мы присваиваем вставленному устройству имя, которое соответствует тому, что было дано по умолчанию ядром. %k это одна из переменных окружения. Подробнее о них можно прочитать в man udev.

GROUP="disk" Причисляем устройство к группе дисковых.

RUN+="/etc/udev/scripts/udev-flash-mount add %k" Это самая интересная часть скрипта. Здесь мы добавляем ("+=") одно из действий, которое произойдет после обработки правила. В данном случае мы запускаем скрипт (он будет рассмотрен далее) /etc/udev/scripts/udev-flash-mount и передаем ему 2 параметра. Первый указывает на то что нужно выполнить действия по добавлению и инициализации нового устройства, а второй содержит имя устройства, с которым нужно выполнять действия.

Второе правило (удаление устройства)

ACTION=="remove" Реагируем на удаление устройства.

RUN+="/etc/udev/scripts/udev-flash-mount remove %k" Здесь мы запускаем скрипт, использовавшийся в первом правиле, но уже для выполнения действий после удаления устройства из системы. Этот скрипт будет выполнен как только ядро заметит, что устройство было удалено из системы. Это не самое лучшее решение, т.к. данные могут быть утеряны, но об этом в следующем разделе.

5.4. Пишем скрипт

Теперь напишем скрипт, который будет выполняться после добавления устройства и после его удаления. Допустим он будет размещен в /usr/bin/. Итак, от пользователя root:

# su

Создадим файл:

# touch /etc/udev/scripts/udev-flash-mount

Сделаем его исполняемым:

# chmod u+x /etc/udev/scripts/udev-flash-mount

Напишем в нем следующее: Файл: /etc/udev/scripts/udev-flash-mount

#!/bin/bash

LOG="/var/log/udev"

 

sleep 3

 

DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`

if [ "$1" = "add" ]; then

  if [ "$DEV" != "" ]; then

    echo "--- `date` ---" >> $LOG

    echo "Mounting /dev/$DEV" >> $LOG

    mkdir /mnt/$DEV >> $LOG 2>&1

    chmod a+rwx /mnt/$DEV >> $LOG 2>&1

    mount /dev/$DEV /mnt/$DEV -o sync,umask=0000,iocharset=cp1251 >> $LOG 2>&1

  fi

elif [ "$1" = "remove" ]; then

  if [ "$DEV" != "" ]; then

    echo "--- `date` ---" >> $LOG

    echo "Unmounting /dev/$DEV" >> $LOG

    umount /dev/$DEV >> $LOG 2>&1

    rm -rf /mnt/$DEV >> $LOG 2>&1

  fi

fi

Задержка в 3 или более секунд необходима для того, чтобы ядро успело выполнить свои действия по инициализации устройства. Если не лень, то поэкспериментируйте с задержкой. Если скрипту был передан параметр add, то он создает папку с именем устройства, затем пытается примонтировать устройство в эту папку. Весь вывод, в том числе и ошибки, выводятся в файл лога. Соответственно, при вызове скрипта с параметром remove, он пытается отмонтировать устройство и удалить ранее созданную папку. Предупреждение: Опция sync в параметрах mount является необходимой, т.к. форсирует мгновенную запись на устройство. Если ее не будет, то когда вы удалите устройство из системы, данные не будут записаны на него. Поэтому, чтобы избежать проблем такого рода, дождитесь пока индикатор на носителе перестанет мигать и после этого извлеките устройство. НО для файловой системы fat c версии ядра linux 2.6.13 sync ставить нельзя т.к. функционирование данной опции сильно изменилось и максимальная скорость записи на usb2.0 это 200 клибойт в секунду а для usb1.0 это где то 10 — 20 килобайт в секунду. Кроме того, опция sync в параметрах mount убьет Вашу флешку с гарантией за 6 месяцев использования. См. http://bugs.debian.org/309625

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

5.5. Заключение

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

Пред.: Редактор nanoВ началоУровень выше: ПрочееСлед.:  Оптимизация glibc
В началоПрочее → Udev и автомонтирование носителей