Автомонтирование без ФМ

Я люблю GUI, но не люблю десктоп. А ещё я не люблю линуксные гуёвые файловые менеджеры - не из идейных соображений, а просто из-за их убогости и неудобности по сравнению даже с mc. Так что живу под голым openbox, а с файлами работаю в mc. В связи с этим возникет проблема автомонтирования сменных носителей. Я эту проблему решаю при помощи правил udev, сделанных по мотивам чего-то, что гуглится по тексту "media-by-label-auto-mount.rules".
Но тут возникает одна проблема: если файл правила присутствует в /etc/udev/rules.d/ до загрузки системы, то это правило работает наперегонки с системным монтированием через fstab, и результаты непредсказуемы. Я это выпрямляю при помощи безобразной затычки: в исходном состоянии на месте правила нет, оно копируется в /etc/udev/rules.d/ аж в автозапуске openbox, а перед завершением системы файл правила в /etc/udev/rules.d/ уничтожается.
А как бы это сделать более цивилизованно?
Если кому интересно - вот мой /etc/udev/rules.d/12-media-by-label-auto-mount.rules
KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_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}="usbhd-%k"
# Global mount options
ACTION=="add", ENV{mount_options}="uid=1000,umask=022,dmask=0"
# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="vfat", ENV{mount_options}="$env{mount_options},codepage=866,iocharset=utf8"
ACTION=="add", ENV{ID_FS_TYPE}=="ntfs", ENV{mount_options}="defaults,$env{mount_options}"
# Mount the device
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{dir_name}", 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="media_by_label_auto_mount_end"
Что значит "до загрузки системы"? В initramfs, что ли?
И почему нельзя наперегонки с fstab? Вроде у вас автомонтирование идёт в каталог внутри /media/ , а значит непосредственно к корневой ФС, где и fstab, и само правило UDEV для автомонтирования, – ничто не мешает монтировать в любом порядке.

В общем, картина неясна, вы что-то важное забыли упомянуть, без этого я не вижу проблемы.

И кстати, мне очень интересно, как вы решили проблему отмонтирования? Вы же знаете, что флешка не CD, и отмонтировать автоматически при извлечении её невозможно, и ваши инструкции на umount в UDEV лишь удаляют запись о монтировании после нештатного извлечения. Следовательно, вы всё же как-то руками отмонтируете эти флешки?
Natrio
Что значит "до загрузки системы"? В initramfs, что ли?
До загрузки системы - в самом прямом смысле. Компьютер выключен, а на винте в /etc/udev/rules.d/ файл есть.
Natrio
И почему нельзя наперегонки с fstab? Вроде у вас автомонтирование идёт в каталог внутри /media/ , а значит непосредственно к корневой ФС, где и fstab, и само правило UDEV для автомонтирования, – ничто не мешает монтировать в любом порядке."
Как-то не приходило в голову. У меня в fstab прописано монитирование разделов винта в /mnt, а в правиле udev - монтирование в /media. А перенацелить всё в одно место, чтобы результат не зависел от того, кто монтирует, - наверно, можно. Я эту мысль буду думать, спасибо.
Natrio
И кстати, мне очень интересно, как вы решили проблему отмонтирования? Вы же знаете, что флешка не CD, и отмонтировать автоматически при извлечении её невозможно, и ваши инструкции на umount в UDEV лишь удаляют запись о монтировании после нештатного извлечения. Следовательно, вы всё же как-то руками отмонтируете эти флешки?
Скрипт парсит /proc/self/mounts и генерирует динамическое меню для openbox. Генерация и вызов этого меню повешена на горячую клавишу (Win+u, от Unmount). Так что в простейшем случае, когда воткнута всего одна флэшка, отмонтирование делается в три клавиши: Win+u, Enter. В общее иерархическое меню эта штука тоже вставлена, как подменю, - на случай, если рука к мышке приклеилась.
Но сейчас этот скрипт выбирает из mounts то, что смонтировано в /media, а не в /mnt, так что если все монитирования валить в одно место, надо будет как-то иначе различать постоянные и временные носители.
первое, что приходит на ум - убрать букву a(b,c) из sd[a-z][0-9]. Это будет работать в большинстве случаев, хотя, иногда флешки определяются при загрузке, как sda. Второе - проверять метку/uuid и только потом монтировать
PGP 0x31361F01
arcanisrepo
akorop, так ваша проблема видимо в том, что вы неправильно настроили автомонтирование, и потому оно захватывает разделы винчестера. Сделайте так, чтобы разделы винчестера из автомонтирования заведомо исключались.
Я для автомоунта пользуюсь утилиткой udisks-glue. В ней можно настраивать какие устройства автоматически монтировать, а какие нет.
www.emunix.org
Я для автомонтирования пользуюсь udevil, точнее входящим в его состав devmon, монтирует от пользователя, отмонтирует при извлечении диска или если флешка - по команде, которую я повесила на горячую клавишу. Удобно.
Koluchka
udevil
Крайне плюсую, очень удобный скрипт и тонко настраивается, при необходимости.
gentoo
А я вообще не люблю автомонтирование – не всегда надо монтировать всё подряд.

У меня есть скрипт, отзывающийся на команды mnt (монтирует всё что вставлено), umt (отмонтирует что смонтировано) и mls (показывает что есть).
Команды специально из трёх букв, чтобы быстрее набирать :)
Со списком устройств в аргументах (от)монтирует только их, без аргументов – всё что можно.

Монтирование идёт через pmount в /media/устройство_метка/ (например /media/sdb1_Label/ ) – чтобы избежать конфликта и сохранить порядок подключения.

Работает от пользователя.

Фильтрует девайсы по группе storage, в которую у меня специальное правило UDEV добавляет все блочные устройства, кроме CD/DVD и заранее заданного по ID винчестера.
arcanis
первое, что приходит на ум - убрать букву a(b,c) из sd[a-z][0-9]. Это будет работать в большинстве случаев, хотя, иногда флешки определяются при загрузке, как sda.
Просто и эффективно, спасибо! А насчёт флэшек как sda, - это, возможно, от BIOS зависит. У меня, к счастью, флэшка никогда не определяется как sda, если загрузка с винчестера.
Мой итог обсуждения: в правиле udev поменял "sd[a-z][0-9]" на "sd[b-z][0-9]", и забыл про фокусы с копирование и удалением.
Ну и чтобы совсем закруглиться, привожу свои средства отмонтирования, заточенные на openbox.
1. Скрипт, генерирующий динамическое (под)меню openbox:
[[email protected] bin]# cat umenu.py
#!/usr/bin/python
print("<openbox_pipe_menu>")
n = 0
automount_dir = '/media/'
print('<separator label="removables"/>')
for s in open("/proc/self/mounts"):
  media = ''
  s = s.replace(chr(9), ' ')
  word = s.split(' ', 3)
  dev = word[0]
  i1 = s.find(automount_dir)
  if (dev != "") and (i1 >= 0):
    if media != dev[:len(automount_dir)]:
      if n != 0:
        print('<separator/>')
      # remove the number (f.e. sdb13 -> sdb), but not for sr0
      media = dev
      if (media != '/dev/sr0'):
        while media[-1].isdigit():
          media = media[:-1]
      print('<item label="eject ' + media[:-1] + '_' + media[-1] + '">')
      print('  <action name="Execute">')
      print('    <execute>')
      print('       d-eject ' + media)
      print('    </execute>')
      print('  </action>')
      print('</item>')
    n = n + 1
    point = word[1]
    print('<item label="umount ' + '  ' + dev + ' -> ' + point + '">')
    print('  <action name="Execute">')
    print('    <execute>')
    print('       d-umount ' + dev)
    print('    </execute>')
    print('  </action>')
    print('</item>')
if n == 0:
    print('<item label="none"/>')
print("</openbox_pipe_menu>")
2. Включение этого скрипта в систему меню (файл menu.xml):
<menu execute="umenu.py" id="umount_removable" label="_Unmount removable"/>
3. Навешивание этого меню на горячую клавишу Win+u (файл rc.xml, секция <keyboard>):
<keybind key="W-u"> <action name="ShowMenu"> <menu>umount_removable</menu> </action> </keybind>
 
Зарегистрироваться или войдите чтобы оставить сообщение.