Небольшое пояснительное вступление. Материал писался довольно давно и многое с той поры изменилось: немного поменялась инфраструктура, задействованная для развертывания и использования self-hosted сервисов, набор вспомогательного ПО, список самих self-hosted сервисов, да и сервер теперь у меня другой - тоже старенький, но чуть более мощный, и так далее и тому подобное. К этому можно добавить и то, что на некоторые вопросы я теперь знаю ответы. Тем не менее, основная тема данной статьи, как мне кажется, все равно актуальна, поэтому я не стал подгонять второстепенные детали под современное состояние дел - оставил все в первоначальном виде, ну, разве что, добавил пару сносок. Итак - вперед и с песней!

С некоторых пор у меня появился домашний сервер. Ну как сервер... Старенький netbook, на который я установил Debian, и стал использовать для различных приложений - BarracudaDrive[1], Calibre. Я даже умудрился установить на него виртуалку, на которой развернул ownCloud, что уж говорить, например, о transmission.

Но, исторически, сложилось так, что основной мой контент размещается на домашних NAS-ах производства Western Digital - MyBookLive и MyBookLiveDuo. Что за контент? Да самый обычный: разнообразные фильмы, сериалы, музыка, программы, фотографии, книги и так далее и тому подобное. Эти же устройства я использую для хранения резервных копий рабочих файлов и разнообразных документов. В общем, все пришло к тому, что мне теперь надо постоянно переносить информацию между новоявленным сервером и заматеревшими сетевыми устройствами. Не то, чтобы раньше мне не приходилось копировать данные на NAS-ы и обратно, просто раньше я делал это из под Windows, а тут же Linux.

Начинал я, как водится, с scp. Но, так как я не большой фанат командной строки, то быстренько переметнулся в Midnight Commander, в более привычный и удобный мир двух панелей. Midnight Commander, спасибо авторам, умеет работать с файлами и каталогами, размещенными на других компьютерах сети - достаточно лишь знать, где находится нужные вам ресурсы, ну и иметь к ним доступ.

Если быть абсолютно честным, эту функциональность Midnight Commander-а я стал осваивать еще до появления доморощенного сервера - приходилось копировать файлы между самими NAS-ами, а также наполнять время от времени беспроводной переносимый диск Seagate Wireless Plus - его я использовал во время поездок в качестве перевозимого мини-медиасервера. Так что, как говорится, было не привыкать. Но..

Пока я пользовался всеми этими плюшками на маломощных устройствах, меня все устраивало. Тут же мне стало казаться, что и скорость неплохо бы поднять, да и функционала хотелось побольше - например, хотелось получить доступ к информации, хранящейся на NAS-ах, из WebDAV каталогов, которые поддерживались BarracudaDrive, развернутой на сервере. Этого хотелось еще и потому, что, когда BarracudaDrive была установлена на Windows 7, мне удавалось организовывать такой доступ.

В общем, я стал "копать". А, как известно, кто ищет - тот найдет! И я нашел! Надо сказать, выбор оказался довольно разнообразным: NFS, SMB, FTP и... SSH. Да-да, и SSH. И, благодаря тому, что продукция Western Digital поддерживает все перечисленные технологии, я мог попробовать использовать различные подходы (это не реклама Western Digital, существует масса того, что они не поддерживают).

Cразу хочу сделать оговорку. То, что я напишу дальше - это мой личный опыт и мои личные выводы на данном конкретном этапе получения знаний о новой для меня операционной системе. Это описание не претендует на истину, более того, оно может содержать теоретические, методологические, да и просто практические ошибки. Тогда зачем я это пишу? Просто хочу рассказать о своем опыте получения знаний - графоманию еще ведь не научились лечить? 🤓 🤫 Множество людей приходят в мир Linux из мира Windows и оказываются в беспомощном состоянии, в совершенно другой вселенной с другими приоритетами и законами. Иногда мучительно трудно просто сформулировать правильный вопрос, чтобы для отвечающего стали ясны истинные потребности вопрошающего. Лично я с этим сталкивался не раз. Быть может, кто-то, прочитав этот текст, находясь в такой же растерянности, как и я, получит хотя бы крупицу полезной информации, которая поможет ему в каких-то вопросах. Быть может, кто-то укажет мне на очевидные (или не очевидные) ошибки и тогда станет проще мне. В любом случае, дальнейший текст - это не учебник, это рассказ, описание процесса. Итак, начну, пожалуй.

Даже мне, полному ламеру в мире Linux, известно, что для доступа к файловой системе, размещенной на другом компьютере, можно примонтировать нужную ее часть к файловой системе своего компьютера, ну того, с которого этот доступ, собственно говоря, и требуется получить. Естественно, компьютер, к файловой системе которого мы вероломно собираемся подключиться, должен предоставлять возможность это сделать. И тут мне, конечно же, сильно повезло, так как мои NAS-ы уже не только обладали всеми нужными программными средствами для предоставления этого самого доступа с использованием разнообразных технологий, но еще имели какую-никакую первичную настройку для их использования, что называется, из коробки. Поэтому, по крайней мере, на первых порах, мне предстояло возиться только с клиентским софтом, но, для начала, надо было определиться, в какой последовательности я буду обниматься с этими технологиями. Я посмотрел еще раз на названия, пробежался взглядом по результатам поисковой выдачи Google, и решил: пусть это будет SSH.

Итак, что надо сделать, чтобы получить доступ к удаленной файловой системе с использованием SSH? Ответ незамысловат: надо установить у себя на компьютере файловую систему SSHFS. Именно она позволит примонтировать удаленный файловый каталог в локальную файловую систему.

Чтобы установить эту файловую систему, необходимо выполнить следующую команду (не забудем, что я сейчас веду речь про Debian Jessie, ну и помним также про apt-get update и apt-get upgrade перед установкой):

apt-get install sshfs

Иногда можно встретить в качестве примера установки SSHFS такую команду:

apt-get install fuse-utils sshfs

но я использовал первый вариант и все сработало нормально. Единственное, что еще надо бы добавить - установку надо производить из под "суперпользователя" - пользователя root. Тут, опять же, существует множество вариантов. Я, обычно, использую следующие два, в зависимости от требуемого сценария.

Первый сценарий: если мне требуется выполнить из под root-а несколько команд, то я сначала ввожу команду

su

после ввода пароля набираю свои команды и, по завершении, набираю команду

exit

чтобы выйти из режима "суперпользователя".

Второй сценарий: если надо выполнить всего лишь одну команду, то я, опять же, использую команду su, но немного по-другому:

su -c "нужная_команда"

Опять потребуется ввести пароль root-а, но после выполнения вы останетесь самим собой и не придется вводить команду exit.[2]

Возвращаясь к нашему примеру - с учетом всего вышесказанного, установку я выполнял с помощью следующей команды:

su -c "apt-get install sshfs"

Спустя небольшое время установка завершилась и... собственно и все, можно заниматься непосредственно монтированием.

На самом деле, я встречал рекомендации сделать еще несколько вещей. Первое - загрузить FUSE (что это такое можно почитать тут). Осуществить загрузку можно при помощи команды (выполнять из под "суперпользователя")

modprobe fuse

Второе - включить пользователя, под которым будет производится монтирование удаленной файловой системы, в группу fuse (тоже в режиме "суперпользователя"):

adduser [your-user] fuse

Если быть совсем уж откровенным, я не в полной мере понимаю (пока) смысл этих манипуляций, когда их нужно выполнять, когда - нет. Поэтому я их выполнил, ну, то есть, попытался выполнить. И, если загрузка fuse (команда modprobe) просто выполнилась, без каких бы то ни было сообщений об ошибках или успехе, то попытка добавить пользователя в группу выдала ошибку - точный текст не помню, но что-то про то, что группы такой нет. Позже, роясь в интернете, я встретил документацию, в которой говорилось о том, что для Debian Jessie добавление пользователя в группу не требуется (о, вот, нашел ссылку). Возможно, загрузка модуля тоже не требуется (в явном виде). Не знаю, может, кто прояснит ситуацию?

Итак, файловую систему установили. Теперь неплохо бы опробовать ее. Но для начала - намного отвлеченной информации. С точки зрения использования SSHFS эта информация, может, не очень-то и нужна, но мне было интересно - яжпрограммист 😉

SSHFS использует FUSE, что есть сокращение от Filesystem in Userspace. FUSE разрабатывался с прицелом на то, чтобы помочь разработчикам в создании всевозможных виртуальных файловых систем. Идея заключалась в том, чтобы стало возможным добавлять свои собственные файловые системы не внося изменений в ядро Linux. Со стороны все выглядит так, как-будто пользователи общаются с ресурсами, как с файлами. Работа с файлами ведется в ядре ОС, FUSE же, работая в качестве модуля ядра ОС, позволяет зарегистрировать обработчик, не являющийся частью ядра[3], и выступает в качестве моста, перенаправляя операции в этот самый обработчик. Авторы SSHFS очень дальновидно остановили свой выбор на таком подходе - SSHFS и есть тот самый обработчик.

Одним из замечательных свойств SSHFS является то, что для начала работы не требуется настройки ни сервера, ни клиента. Хорошо-хорошо. В предыдущем приложении есть доля лукавства. К серверу, все-таки, предъявляются определенные требования - он должен быть SSH сервером (точнее, SFTP сервером), то есть, на нем должно быть установлено соответствующее программное обеспечение. Конечно, многие устройства изначально предоставляют нужный функционал, но мне как-то пришлось возиться с установкой dropbear на Seagate Wireless Plus (смотри мой старый блог). Так что, работа с сервером, все-таки, может потребоваться. Да и с клиентом тоже не все так уж и просто - настройка будет не нужна, если у пользователя, пожелавшего воспользоваться SSHFS, уже настроен SSH доступ к нужному серверу. Хотя, обычно, так и бывает.

Другим, не менее замечательным свойством является то, что монтирование может производить любой пользователь, даже если он не является "суперпользователем" (спасибо надо сказать все тому же решению основываться на FUSE).

Еще одна привлекательная особенность - безопасность. Так как SSHFS использует в качестве транспорта SFTP, то весь трафик шифруется. Конечно, это имеет и обратную сторону - скорость передачи снижается. Но так уж устроен этот мир - за все надо платить.

Теперь, обогащенные новыми знаниями, вернемся к нашей задаче - примонтировать нужный удаленный каталог. Пока что мы только установили нужное ПО. Далее - необходимо подготовить точку монтирования - локальный каталог, который будет использоваться для доступа к удаленной файловой системе (или ее части). Если такого каталога у вас нет, следует создать его:

mkdir /локальный/каталог/для/монтирования

Если же каталог уже есть, надо убедиться, что он пуст: у меня, например, при попытке использовать непустой каталог выдавалось предупреждение/подтверждение об использовании каталога с данными - если честно, я не стал проверять, что будет, если продолжить монтирование.

Само монтирование выполняется при помощи следующей команды:

sshfs имя_пользователя@имя_или_ip_адрес_хоста:/путь/к/монтируемому/каталогу  /локальный/каталог/для/монтирования

Как, наверное, ясно, производится монтирование каталога /путь/к/монтируемому/каталогу, находящегося на удаленном хосте имя_или_ip_адрес_хоста, в каталог /локальный/каталог/для/монтирования на локальном хосте; подключение к удаленному хосту при этом производится от имени пользователя имя_пользователя (пользователь должен быть создан на удаленном хосте и обладать нужным набором прав доступа).

При выполнении команды будет выдан запрос ввода пароля пользователя имя_пользователя на удаленном хосте имя_или_ip_адрес_хоста. При правильном ответе монтирование будет осуществлено. Если же с вводом пароля вы ошиблись, то, увы, придется повторить попытку.

Если монтирование произведено успешно, то, переходя в каталог /локальный/каталог/для/монтирования, вы получаете доступ к содержимому /путь/к/монтируемому/каталогу, находящегося на удаленном хосте имя_или_ip_адрес_хоста, так, как если бы вы были пользователем имя_пользователя@имя_или_ip_адрес_хоста.

Возникает логичный вопрос: а что делать, если доступ к данным на удаленном хосте больше не нужен. И правильный ответ: надо размонтировать каталог. Для этого можно воспользоваться командой

umount /локальный/каталог/для/монтирования

правда, при этом следует учитывать, что команда доступна только "суперпользователям", то есть, либо придется стать таковым - сменить текущего пользователя при помощи команды su, или воспользоваться синтаксисом su -c "команда" (и в том и в другом случае у вас спросят пароль).

Есть и другой способ: воспользоваться командой

fusermount -u /локальный/каталог/для/монтирования

В этом случае никаких суперспособностей не потребуется.

То, что я сейчас описал, является простейшим сценарием использования файловой системы SSHFS. На самом деле, есть еще некоторое количество плюшек, и об одной из них я обязательно расскажу... чуть позже.


  1. Сейчас BarracudaDrive называется немного иначе - FuguHub, но суть осталась прежней ↩︎

  2. Почему su, а неsudo? Потому, что в моем дистрибутиве sudo изначально не присутствовал, надо было устанавливать. ↩︎

  3. При этом есть требование, что при разработке необходимо использовать специальную библиотеку libfuse ↩︎