автоматическое монтирование подключаемых устройств через udev

    Задача автоматического монтирования флешек решается довольно просто в KDE или GNOME — эти среды можно настроить так, что они сами всё смонтируют, откроют файловый менеджер и покажут значок в трее. Но что делать, если у вас только консоль или стоит, например, awesome? Или вы не хотите разбираться с конкретным DE, а ищите универсальное решение?

    Независимое от DE решение есть — udev.
    Создаём новый файл /etc/udev/rules.d/automount.rules со следующим содержанием:
    ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mkdir -p /mnt/%E{ID_VENDOR}_%E{ID_MODEL}_%n"
    ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mount -o uid=1000 /dev/%k /mnt/%E{ID_VENDOR}_%E{ID_MODEL}_%n"
    ACTION=="remove" KERNEL=="sd[c-z][0-9]" RUN+="/bin/rmdir /mnt/%E{ID_VENDOR}_%E{ID_MODEL}_%n"

    Укажем udev-у, что появилось новое правило:
    sudo udevadm control --reload-rules

    Результат
    Вставляю флешку и вижу каталог /mnt/KINGMAX_Flash_Disk_1, в котором содержимое флешки. Размонтирую и вынимаю — каталог пропал.

    Замечания
    1. KERNEL==«sd[c-z][0-9]» — значит, что будет срабатывать на все устройства вида /dev/sdc1 /dev/sdc2, /dev/sdg7. У меня 2 жестких диска: sda и sdb, поэтому я начал regex с «с».
    2. mount -o uid=1000 — зашит id пользователя, который будет owner-ом. Если у вас не стандартный, то подправьте (проверка id -u). Конечно, можно действовать через группы и маски, но я выбрал наиболее простое решение.

    umount
    Проблему размонтирования (нужны права суперпользователя) я решил так:
    1. sudo visudo
    2. добавить строчку %wheel ALL= NOPASSWD: /bin/umount

    upd
    Как заметил darkk, ID_VENDOR="; /bin/rm -rf /;" — потенциальная дыра в безопасности, поэтому лучше перестраховаться в ущерб наглядности:
    ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mkdir -p /mnt/%k"
    ACTION=="add" KERNEL=="sd[c-z][0-9]" RUN+="/bin/mount -o uid=1000 /dev/%k /mnt/%k"
    ACTION=="remove" KERNEL=="sd[c-z][0-9]" RUN+="/bin/rmdir /mnt/%k"


    Поделиться публикацией

    Комментарии 41

      +1
      А не лучше ли будет воспользоваться ivman? Заодно решается куча всяких проблем (с правами, группами, названием томов и пр.)
        –1
        udev сейчас много где есть, про ivman я не слышал. проблемы с правами и названием томов я решил. с радостью бы прочитал статью про ваш ivman ;-)
          0
          да, я на gentoo пробывал сначала — через udev, были шероховатости с картридером, применил ivman — вся встало на свои места ;)
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              ivman умер, родился halevt. Свято место пусто не бывает.

              udev нужен для базового управления базой устройств в /dev/, и в общем случае управлением фирмварью и пр (при учете включения DevKit). А вот что с этими устройствами делать, должен решать пользователь. Информацию об этом он получает через HAL.
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Конкретно вы можете делать что угодно. Хоть вообще autofs использовать (кстати неплохое решение). А расширяемо и правильно использовать вышеозначенные подсистемы.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Потому что это единственный способ, который позволяет покрыть все (по крайней мере известные мне) проблемы связанные с автомонтированием способом отличным от «через пень-колоду». :]

                      Один интерактивный ввод чего стоит, и права пользователя, когда оных > 1.
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Ну делай конечно, но зачем же об костылях писать статью? Не дай бог люди начнут ими пользоваться :)
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Это централизованный источник информации об устройствах с унифицированным интерфейсом, причем информация обновляется и актуальна.
            0
            вот только остается проблема с монтированием внешнего hdd форматированного в NTFS как бы указать чтоб при его монтировании автоматически использовался ntds-3g?
              0
              Посмотрите в Wiki Arch Linux про udev — там пример с монтированием ntfs есть.
              0
              Поправочка: sudo udevadm control --reload_rules
                +1
                Еще можно сделать man pmount
                  +4
                  А, я ошибся, pmount позволяет монтировать съемные устройства без sudo, но вручную.

                  Кстати, а бывают флэшки с ID_VENDOR="; /bin/rm -rf /;"? Как udev поведет себя в таком случае?
                    0
                    Только если ID_VENDOR="; cd /; /bin/rm -rf;" :)
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Ну ок, а если bash -c /bin/rm -rf /* /.*
                        • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  А я не смог заставить работать ivman, поэтому сделал также через udev, но только незнаю как побороть если у флэшки нету названия тома и если флэшка просто sdb,sdc.
                  Правила такие:
                  KERNEL==«sd[b-z]», DRIVER==«usb-storage», GROUP=«storage»ACTION==«add»
                  KERNEL==«sd[b-z][0-9]», GROUP=«storage», RUN+="/bin/mkdir -p /media/$env{ID_FS_LABEL_ENC}«ACTION==»add"
                  KERNEL==«sd[b-z][0-9]», PROGRAM=="/lib/udev/vol_id -t %N", RESULT==«vfat», RUN+="/bin/mount -t vfat -o rw,flush,quiet,nodev,noauto,noexec,nosuid,noatime,dmask=000,fmask=111,iocharset=utf8 /dev/%k /media/$env{ID_FS_LABEL_ENC}«ACTION==»add"
                  KERNEL==«sd[b-z][0-9]», PROGRAM=="/lib/udev/vol_id -t %N", RESULT==«ntfs», RUN+="/bin/mount -t ntfs-3g -o rw,flush,quiet,nodev,noauto,noexec,nosuid,noatime,dmask=000,fmask=111,iocharset=utf8 /dev/%k /media/$env{ID_FS_LABEL_ENC}«ACTION==»add"
                  KERNEL==«sd[b-z][0-9]», RUN+="/bin/mount -o rw,noauto,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /media/$env{ID_FS_LABEL_ENC}"
                  ACTION==«remove», KERNEL==«sd[b-z][0-9]», RUN+="/bin/umount /dev/%k"
                  ACTION==«remove», KERNEL==«sd[b-z][0-9]», RUN+="/bin/rmdir /media/$env{ID_FS_LABEL_ENC}"
                    0
                    Ну создайте скрипт, который в зависимости от наличия метки тома или её отсутствие будет задавать название точки монтирования и исполняйте его.
                    0
                    Ах да, забыл написать. Файл лучше обозвать 10-название.rules, чтобы была очередь загрузки правил
                      0
                      Чего люди только не придумают, лишь бы halevt не использовать.
                        –5
                        Разве в fstab этого сделать нельзя? Правда папка куда монтируем будет видна всегда, ну и ничего страшного.
                          +1
                          Универсальное решение есть, и это halevt (ivman помер). Делать автомонтирование через udev — рассово неправильно.
                            +1
                            а ведь человек прав. udev предназначен не для монтирования флешек.
                              +2
                              Общеизвестно, что правота и правильность на хабре не являются абсолютными критериями.
                            0
                            У меня в конце ~/.config/awesome/rc.lua написано:
                            awful.spawn(«pgrep thunar || thunar --daemon»)

                            Это, конечно, требует, наличия thunar, зато работает правильно и надежно.
                              +1
                              Внимание вопрос, что вы будете делать, если подключение устройства будет требовать какую то информацию, получаемую в интерактивном режиме? К примеру подключение зашифрованного носителя.
                                0
                                Ох! Неужели наконец-то в линуксе сделали то что у Эппла было в 84-м?

                                Пара вопросов:

                                1) Что будет если я выну флешку не размонитруя?
                                2) Насколько я понимаю, доступ к флешке будет только у 1 пользователя, котортого надо прописать рукми по id? (((
                                3) Почему тогда в ведущих дистрибутивах сделана дурацкая схема, при которой без иксов ничего не монтируется :( хотя можно было бы сделать проще, как тут написано? Или это способ имеет недостатки и баги?
                                  0
                                  В линуксе были различные способы автомонтирования достаточно давно. Это были и autofs, и supermount, и после своего появления udev, а потом uevent/hal.

                                  1) Если вы выймете флешку не размонтированной может быть бяка (не вижу опции sync, но ее пихать и не стоит). Особенно если туда что то пишеться. В общем случае кеши на флеш сбрасываются почти сразу, так что с некоторой вероятностью будет все хорошо, но так делать, конечно же, не стоит.

                                  2) В вышеозначенном примере так и будет. В примере как вот тут habrahabr.ru/blogs/linux/58769/#comment_1588556 доступ будет вообще у всех.

                                  3) Этот способ очевидно имеет недостатки и баги, некоторые из которых можно видеть в вопросе 1 и 2. Можно и без иксов, необходим какой нибудь демон навроде ivman или halevt. Схема кстати не дурацкая, а достаточно симпатичная и йузабельная.
                                    –1
                                    > Можно и без иксов, необходим какой нибудь демон навроде ivman или halevt. Схема кстати не дурацкая, а достаточно симпатичная и йузабельная.

                                    Точно, про ivman забыл. А схема дурацкая, так как подвела меня аж минимум 2 раза — 1) когда сломались иксы, а правильный конфиг лежал на флешке :( 2) когда я решил попробовать какой-то легкий менеджер окон место Гнома. Так что не понимаю почему ведущие дистрибюутивы ее используют. Вообще по моему такие вещи как монтирование любых носителей, или доступ к файлам по сети должны быть всегда доступны пользователю, даже если у него сломались иксы (про mount я знаю, но руками монтировать — это страшный изврат и каменный век).
                                      0
                                      Почему же каменный век? В этом нет ничего военного, к тому же ситуацию можно описать как форс-мажорную :] И я опять же не понимаю, что такого в том же ивмане. Самый адекватный и настраиваемый способ.
                                  –3
                                    0
                                    В таком варианте нужно монтировать с опцией sync или ещё как-то чтобы обезопасить от ошибок при вытаскивании флешки в момент когда туда не успел скинуться весь кеш. Бывает очень часто нужно срочно вынуть флешку и бежать, а не ждать пока туда докачается куча файлов…
                                      0
                                      был ленивый такой поиск решения, которое не решатся упрекнуть в расовой неправильности. и по возможности стандартными средствами. решения пока не нашед, но решил поделиться своими находками. вдруг кто-то ткнёт ссылкой.

                                      1. начал разбираться с «проблемой размонтирования». выяснил, что в mtab пишется именно uid, а не user.

                                      2. добавил опцию utf8, бо не читались русские буквы.

                                      3. курил мануалы. интересно что автор допускает автомонтирование с udev, но отправляет к HAL:
                                      Q: Can I use udev to automount a USB device when I connect it?
                                      A: Technically, yes, but udev is not intended for this. All major distributions
                                      use HAL (http://freedesktop.org/wiki/Software_2fhal) for this, which also
                                      watches devices with removable media and integrates the Desktop environment.

                                      Alternatively, it is easy to add the following to fstab:
                                      /dev/disk/by-label/PENDRIVE /media/PENDRIVE vfat user,noauto 0 0

                                      This means that users can access the device with:
                                      $mount /media/PENDRIVE
                                      and doen't have to be root, but will get full permissions on the device.
                                      Using the persistent disk links (label, uuid) will always catch the
                                      same device regardless of the actual kernel name.


                                        0
                                        PS: цитата из ФАКа
                                        0
                                        Может кто подскажет почему могут не работать udev rules на Ubuntu 14.04?

                                        Для теста создал файл /etc/udev/rules.d/70-music.rules
                                        И в нем одну строчку
                                        ACTION=="add" RUN+="/usr/bin/notify-send title text"
                                        


                                        Потом обновил правила, но когда втыкаю флешку ничего не происходит.

                                        Что я делаю не так?

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое