Automount afuse


Я хотел рассказать про своё открытие afuse — автомонтирование файловых систем по требованию, автоматически.

Разве не здорово просто сделать:

ls /mnt/remote/web.example.com/var/lib/www/

и сразу увидеть файлы web-сервера, никак не устанавливая с ним соединение специально?

Я этим пользуюсь уже давно, а главное:

  • Это работает из любого источника: Не важно, делаете вы указанный вывод в консоли, сохранили ссылку в MC или переходите из favorites вашего любимого менеджера такого как nautilus или dolphin
  • Вы можете переходить на любой хост, куда у вас есть доступ по ключам (настроить запрос пароля тоже можно, но это не интересно)
  • Вы можете запросто указать под каким пользователем входить на сервер, традиционно используя @:
    cd /mnt/remote/apache@web.example.com/var/lib/www/
    

Что это и зачем


Использоваться это может с разными системам, но удобнее всего конечно с sshfs. Думаю с ней многие имели дело, это действительно удобно, но если нужно походить по удалённой файловой системе, каждый раз приходится её монтировать:
sshfs hostname: mountpoint

Это становится крайне утомительно когда вы работаете с сотней удалённых серверов, особенно когда вам это нужно например, чтобы быстренько перекинуть маленький конфиг-файл с одного удалённого сервера на другой (а качать большие файлы по sshfs и не очень эффективно, лучше использовать rsync или bbcp).

Afuse проект с открытым исходным кодом и сам является fuse файловой системой. Он доступен для большинства современных дистрибутивов.

Очень неплохая статья про его описание, а также настройку уже была на хабре. Всех кто первый раз пробует, отправляю туда.

Мы же, чтобы не повторяться, пойдём немного дальше.

Единственное хотелось заметить что для дистрибутивов, базирующихся на RPM (Fedora, CentOS, RHEL, Scientific Linux…) вам потребуется использовать yum/dnf:

dnf install afuse

Используйте yum вместо dnf на более старых системах, таких как CentOS.

Настройка же ключей, хостов и опций монтирования вряд ли будет сильно отличаться, для тонкостей всегда можно обратиться к манулу.

Afuse automount


Полагаю что вы уже поигрались и вам понравилось монтирование sshfs налету. Вот только в вышеупомянутой статье указан ну очень кривой способ монтирования самого afuse. Полагаю что у вас тоже остался осадочек: «Как же так, файловую систему, монтирующую другие файловые системы, нужно каждый раз монтировать вручную?!»

Вот именно как это сделать я и хотел поделиться.
На самом деле, все механизмы уже есть в системе. Так, раз afuse сама является файловой системой, то почему бы не монтировать её стандартным образом из /etc/fstab?!
В принципе это очень даже возможно, однако нет прямого способа передать столько желаемых аргументов.

Поэтому предполагается создать скрипт-обертку /usr/sbin/mount.afuse (выложил также как gist кому так удобнее, там же есть более подробное описание его) приблизительно такого содержания:

# Mount under user and group which are owners of mount point
su -l $( ls -dl "$2" | cut -d' ' -f3) -c "afuse -o mount_template='sshfs -o reconnect -o auto_cache -o kernel_cache %r:/ %m' -o unmount_template='fusermount -u -z %m' -o auto_unmount '$2'"

Не забываем сделать его испольняемым:

chmod +x /usr/sbin/mount.afuse

Всё, теперь мы готовы добавить новую системную точку монтирования в /etc/fstab:
afuse# /mnt/remote afuse auto 0 0
Всё, теперь даже после перезагрузки системы afuse примонтирована, а все соединения с удалёнными хостами будут восстановлены автоматически, если какие-то программы работали с удалёнными файлами по таким путям. Не будет ошибок что что-то не доступно.

Разумеется точку монтирования вы можете изменить по своему желанию, может что-то типа /remote. Не забудьте только создать директорию.

Комментарии (8)

  • 11 февраля 2017 в 18:33

    0

    Используйте yum вместо dnf на более старых системах, таких как CentOS.

    Пожалуйста, объясните почему CentOS стала старой системой?
    • 11 февраля 2017 в 19:04

      +1

      На centos/rhel/debian обновления пакетов происходит с большей задержкой.
      На fedora/ubuntu обновления появляются раньше и чаще.

    • 11 февраля 2017 в 19:47 (комментарий был изменён)

      0

      В данном контексте это было лишь к тому что туда ещё не пришёл dnf на смену yum.
  • 11 февраля 2017 в 18:48

    0

    $( ls -dl "$2" | cut -d' ' -f3)
    

    *sigh* ну так же проще
    $( stat --format=%U "$2" )
    
    • 11 февраля 2017 в 19:49

      0

      Да можно и так. И ещё десятком способов…
  • 11 февраля 2017 в 19:41 (комментарий был изменён)

    +1

    Поясните, какие проблемы могут возникнуть, если, к примеру, будет потеряна связь с удаленным хостом, e; примонтированным, и как развитие ситуации, на котором есть открытые файлы и идет чтение/запись. И если причиной будет не сеть, а проблемы с удаленным сервером (перезапуск)?
    Корректно ли будет восстановлена связь или точка монтирования зависнет?

    Я помню у меня с обычным nfs проблемы были, даже -o soft не помогало. (точнее помогало, но как то странно и требовало закрытие всех приложений, использующих точку монтрования и перемонтрования)

    • 11 февраля 2017 в 19:57 (комментарий был изменён)

      0

      Если хост недоступен, разумеется вы не сможете читать его. Но, во-первых, это просто sshfs, поведение будет в точности такое же. К afuse это не имеет отношения.

      Но если вернуться к вопросу как оно будет себя вести, то при переходе в эту директорию команда просто подвиснет. В моём примере используется опция »-o reconnect», соответственно sshfs будет постоянно пытаться переконнектиться, и сделает это как только хост станет доступен, то есть вы увидите просто задержку. Если же хост стал полностью недоступен, вы можете просто убить соответствующий sshs процесс с помощью kill. Ну и отмонтировать конкретную директорию: fusermount -u somehost

    • 11 февраля 2017 в 20:08 (комментарий был изменён)

      0

      Кстати, вместо использования sshfs вы вполне также можете использовать автомаонтирование nfs с помощью afuse! Потребуются незначительные модификации скрипта-хелпера. Однако nfs требует экспорта файловых систем, вся прелесть sshfs в том что вы можете так монтировать любой хост, на который у вас есть ssh доступ, без каких-то дополнительных подготовок на нём.

© Habrahabr.ru