Статья обновлена 05.05.2009
В KDE и GNOME автомонтирование реализовано уже из коробки. Автомонтирование там осуществляется через HAL (Hardware Abstraction Layer). При подключении устройства его параметры передаются другим приложениям. После чего уже эти приложения решают что делать. Кроме таких громозких DE как KDE и GNOME есть еще множество различных легковесных WM. В этих WM автомонтирование изначально не настроено. И большинство новичков linux видя перед собой преграду в виде отсутсвия автомонтирования usb накопителей "подсаживаются" на KDE и GNOME. А тем кого не пугает чтение манов и написания конфигов, на помощь приходит udev. В этой статье я затрону только автомонтирование usb накопителей т.к. вопросы по этой теме задаются в первую очередь и очень очасто.
Итак в Арче за все события hotplug и coldplug по умолчанию отвечает udev. Udev стартует автоматоматически вместе с системой. При старте udev считывает все правила находящиеся в каталоге /etc/udev/rules.d. Так вот чтобы наш Арч научился автоматически монтировать usb накопители нужно написать свои правила для udev. Редактировать файлы с правилами, которые лежат в каталоге /etc/udev/rules.d не рекомендуется. Создадим свой файл с правилам:
touch /etc/udev/rules.d/10-usb-storage.rules
Для этого Вы должны обладать правами суперпользователя. Все файлы с правилами для udev должны иметь окончание rules. Имя файла Вы можете выбрать на свой вкус. Файлы в директории /etc/udev/rules.d распологаются в алфавитном порядке. Порядок файлов очень важен. Поэтому я выбрал такое имя файла для того, чтобы правила в моем файле выполнялись раньше остальных.
В файлах правил, строки, начинающиеся со знака "#", считаются комментариями. Любая другая непустая строка является правилом. Правило не может занимать несколько строк.
Одному устройству может соответствовать больше одного правила. Это имеет практические преимущества, например можно установить два правила, относящихся к одному и тому же устройству, и каждое правило будет обеспечивать устройству собственное альтернативное имя. Оба альтернативных имени будут созданы, даже если правила прописаны в разных файлах. Важно понять, что udev не остановится, найдя соответствующее устройству правило, но будет продолжать поиск и пытаться выполнить каждое правило, о котором знает.
Теперь добавляем правила в файл 10-usb-storage.rules:
ACTION=="add", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/mkdir -p /mnt/%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,nodev,noauto,noexec,nosuid,noatime,dmask=000,fmask=111,utf8 /dev/%k /mnt/%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="ntfs", RUN+="/bin/mount -t ntfs-3g -o rw,nodev,noauto,noexec,nosuid,noatime,dmask=000,fmask=111,utf8 /dev/%k /mnt/%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/ln -s /mnt/%k /media/$env{ID_FS_LABEL_ENC}"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/umount /dev/%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/usr/bin/unlink /media/%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/usr/bin/unlink /media/$env{ID_FS_LABEL_ENC}"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", ENV{ID_USB_DRIVER}="usb-storage", RUN+="/bin/rmdir /mnt/%k"
Для установления правил udev обеспечивает несколько различных ключей соответствия. Несколько обычных ключей представлены ниже. Полный список доступен на страницах манов.
Первое правило определяет подключение устройства, для которого ядро назначило имя из промежутка sd[a-z][0-9]. Еще в этом правиле с помощью записи ENV{ID_USB_DRIVER}="usb-storage" выбираются те устройства, которые используют драйвер usb-storage. Поэтому модуль usb-storage у Вас должен подгружаться. Если у Вас в /etc/rc.conf есть строка MOD_AUTOLOAD="yes", то этот модуль подгружается. Иначе добавьте MODULES=(usb-storage) в /etc/rc.conf и выполните:
modprobe usb-storage
Далее в первом правиле в каталоге /mnt создается каталог с именем устройства.
Второе (для vfat) и третье (для ntfs) правила определяет тип ФС тома на устройстве с помощью команды /lib/udev/vol_id -t %N и выполняется монтирование раздела в каталог /mnt/%k, где %k - это имя устройства назначенное ядром. В этих двух правилах том монтируется с такими опциями, что доступ чтение/запись в каталог имеют все. Третье правило том с ФС ntfs монтирует с помощью драйвера ntfs-3g. Его необходимо установить, если его нет в системе.
pacman -S ntfs-3g
Четвертое правило делает символическую ссылку в каталог /media по метке тома $env{ID_FS_LABEL_ENC}, если том метки не имеет то ссылка будет по имени устройства. Переменные типа ENV или $env{} можно узнать с помощью команды:
udevadm monitor --env
Подключив usb накопитель Вы увидите информацию в консоли. Команда выполняется под суперпользователем.
Последние правила определяют отключение устройства и выполняют размонтирование, удаление символической ссылки и каталога.
Теперь для применения правила необходимо от суперпользователя выполнить команду:
udevadm control --reload-rules
Обращаю ваше внимание, что устройства монтируются без опции synс для большей скорости записи. Так что прежде чем извлечь usb накопитель, на всякий случай выполните команду sync. Вот вам и все автомонтирование.