среда, 10 августа 2011 г.

centos usb drive automount (udev)

Настроил тут на работе хост под торренты на centos 6. Т.к. временами к нему подключается usb-винт для скидывания информации, то захотелось настроить так, чтобы этот диск автоматически монтировался куда надо, а при выдергивании - размонтировался. Поиск в инете долго не мог дать мне искомого, поэтому запишу себе на будущее, как это делается.

Делается средствами udev, достаточно просто. Есть правило, которое реагирует на все диски /dev/sd[e-z][1-9] (потому как четыре диска sda,sdb,sdc,sdd в системе уже присутствуют). Для такого диска программой blkid загружается информация о нем (нас интересуют метка диска и файловая система), на основе метки диска задается директория, куда он будет смонтирован. На основе файловой системы формируются опции для монтирования и команда монтирования.

Дальше срабатывает команда монтирования.

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

KERNEL!="sd[e-z][1-9]", GOTO="ro_auto_mount_end"

# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"

# Get a label if present, otherwise specify one
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="storage-%k"

# Global mount options
ACTION=="add", ENV{mount_options}="rw,noauto,user,noexec,nodev,noatime,uid=t,gid=t"

# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="$env{mount_options},umask=002"
ACTION=="add", ENV{ID_FS_TYPE}=="msdos", ENV{mount_options}="$env{mount_options},umask=002, quiet"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="$env{mount_options},umask=002,flush,quiet"
ACTION=="add", ENV{ID_FS_TYPE}=="xfs", ENV{mount_options}="norecovery,$env{mount_options}"
ACTION=="add", ENV{ID_FS_TYPE}=="jfs", ENV{mount_options}="nointegrity,$env{mount_options}"
ACTION=="add", ENV{ID_FS_TYPE}=="reiserfs", ENV{mount_options}="nolog,$env{mount_options}"

# Create the mount point
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}"

# Mount the device

# Special Mounts for ext3, ext4 and hfs

# Mount ext2 and ext3 as ext2
ACTION=="add", ENV{ID_FS_TYPE}=="ext2|ext3", RUN+="/bin/mount -t ext2 -o $env{mount_options} /dev/%k /media/%E{dir_name}", GOTO="mount_complete"

# Mount hfs and hfsplus as hfsplus
ACTION=="add", ENV{ID_FS_TYPE}=="hfs|hfsplus", RUN+="/bin/mount -t hfsplus -o $env{mount_options} /dev/%k /media/%E{dir_name}", GOTO="mount_complete"

# Execute mount with no fstype specified (auto)
ACTION=="add", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/%E{dir_name}"

# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l /media/%E{dir_name}", RUN+="/bin/rmdir /media/%E{dir_name}"

# Exit
LABEL="mount_complete"
LABEL="ro_auto_mount_end"

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

4 комментария:

  1. Олег, есть более компактное решение:

    $blkid
    записываем UUID диска, а потом долбим его в fstab, например:

    UUID={blablabla} ext4 defaults 0 0

    ОтветитьУдалить
    Ответы
    1. с ошибкой написал, но думаю суть понятна :)

      Удалить
    2. А что будет в таком случае при загрузке системы, если этого винта к ней не подключено? Ну и плюс надо для каждого девайса прописывать что-то. А тут один раз настроил и забыл - все работает...

      Удалить
    3. в этом плане да, Вы правы

      Удалить