Из статьи вы узнаете про монтирование Linux каталога по сети с использованием SSHFS. Рассмотрим автоматическое и ручное монтирование.
Введение
Получить доступ к файлам Linux по сети можно с помощью монтирования сетевых файловых систем. Есть следующие сетевые файловые системы: NFS, SMB (CIFS), SSHFS. В этой статье будем изучать монтирование SSHFS. Из названия ясно что эта сетевая файловая система работает поверх SSH. Как следствие, для монтирования можно использовать логин и пароль пользователя или ssh-ключи.

Монтирование ко всем перечисленным файловым системам можно выполнять по 3-ём разным сценариям: ручное монтирование, автоматическое монтирование с помощью файла fstab и монтирование с помощью systemd.
Установка SSHFS
На той системе, от куда мы хотим выполнять монтирование нужно установить пакет sshfs:
alex@deb-11:~$ sudo apt install sshfs
На удалённой системе должен быть установлен и работать ssh-сервер, настройку которого в этой статье я не рассматриваю.
Ручное монтирование
Создадим точку монтирования в домашнем каталоге:
alex@deb-11:~$ mkdir storage
Монтировать sshfs может не только пользователь root, а любой пользователь системы. По крайней мере на сервере Debian 11 это так.
Монтирование выполняется с помощью команды sshfs, после которой нужно указать от куда мы монтируем (пользователь@адрес:/удалённый_каталог
). И куда мы монтируем (/локальный_каталог
).
Вот пример монтирования:
alex@deb-11:~$ sshfs alex@192.168.0.27:/home/alex/storage ~/storage/
А размонтировать можем с помощью команды umount
. Ей нужно передать точку монтирования. При этом размонтировать может только тот пользователь, кто осуществлял монтирование.
alex@deb-11:~$ umount ~/storage
Использование ssh-ключей
Чтобы монтирование выполнялось без запроса пароля, мы можем использовать ssh-ключи.
С помощью трёх команд ниже создадим ключ, перекинем его на удалённый сервер и примонтируем каталог без запроса пароля:
alex@deb-11:~$ ssh-keygen alex@deb-11:~$ ssh-copy-id alex@192.168.0.27 alex@deb-11:~$ sshfs alex@192.168.0.27:/home/alex/storage ~/storage/
А если пароль у вас спросило, значит вам придётся разбираться с ключами ssh.
Опции монтирования
По умолчанию к удалённому каталогу сможет получить доступ только тот пользователь, который выполнял монтирование. Но это можно изменить. Вначале включим такую возможность, добавив в файл /etc/fuse.conf опцию user_allow_other:
alex@deb-11:~$ sudo nano /etc/fuse.conf user_allow_other
И теперь выполним монтирование с опцией allow_other:
alex@deb-11:~$ sshfs -o allow_other alex@192.168.0.27:/home/alex/storage ~/storage/
Теперь любой пользователь локальной системы сможет выполнять с файлами всё что разрешено удалённому пользователю alex. Поэтому бывает удобно включить проверку прав на локальной системе, это делает опция default_permissions:
alex@deb-11:~$ umount storage alex@deb-11:~$ sshfs -o allow_other,default_permissions alex@168.168.0.27:/home/alex/storage ~/storage/
Также мы можем указать uid и gid владельца (на локальной стороне):
alex@deb-11:~$ sshfs -o allow_other,default_permissions,uid=1000,gid=1002 alex@192.168.0.27:/home/alex/storage ~/storage/ alex@deb-11:~$ ls -l storage/ итого 4 -rw-rw-r-- 1 alex max 180 авг 28 14:15 test.txt
К сожалению в sshfs нет опций dmask и fmask, то есть мы не можем указать права на монтируемые файлы и каталоги. Но есть опция umask, она отнимет из текущих прав указанное число. Например на удалённом сервере есть каталог с правами 755 а в нём файл с правами 644. Так вот, если мы при монтировании укажем опцию umask=111, то каталог в локальной системе получит права 644, а файл 533.
Подробнее про Linux права можете почитать здесь.
Дополнительно вы можете включить компрессию (compression=yes) по умолчанию она выключена. И включить автоматическое переподключение к серверу, если соединение прерывается (reconnect).
alex@deb-11:~$ sshfs -o compression=yes,reconnect alex@192.168.0.27:/home/alex/storage ~/storage
И расскажу про ещё одну опцию. По умолчанию, когда мы используем ключи ssh, то ключ ищется по такому пути (~/.ssh/id_rsa). Мы можем указать местоположение ключа вручную, с помощью опции identityfile (например identityfile=/home/max/.ssh/id_rsa). Но к этому файлу у вас должны быть права доступа.
Остальные опции можете посмотреть здесь.
Монтирование с помощью systemd
Мы можем сделать mount systemd и монтировать удалённый каталог с его помощью. Давайте вначале сделаем общую точку монтирования в /mnt:
alex@deb-11:~$ sudo mkdir /mnt/stor
Создадим группу, члены которой смогут обращаться к примонтированному каталогу (запомним GID):
alex@deb-11:~$ sudo addgroup stor Добавляется группа «stor» (GID 1003) ... Готово.
Теперь можем сгенерировать ssh-ключи для пользователя root. И передадим ключ на удалённый сервер:
alex@deb-11:~$ sudo ssh-keygen alex@deb-11:~$ sudo ssh-copy-id alex@192.168.0.27
Попробуем примонтировать каталог под root пользователем:
alex@deb-11:~$ sudo sshfs alex@192.168.0.27:/home/alex/storage /mnt/stor/
Если каталог примонтировался без запроса пароля, значит вы всё сделал правильно.
Размонтируем каталог:
alex@deb-11:~$ sudo umount /mnt/stor
И напишем юнит systemd:
alex@deb-11:~$ sudo nano /etc/systemd/system/mnt-stor.mount [Unit] Description=Mount remote filesystem sshfs After=network.target [Install] WantedBy=multi-user.target [Mount] What=alex@192.168.0.27:/home/alex/storage Where=/mnt/stor/ Type=fuse.sshfs Options=allow_other,default_permissions,uid=0,gid=1003,umask=007,reconnect
Применим изменения:
alex@deb-11:~$ sudo systemctl daemon-reload
Попробуем примонтировать и проверим доступ:
alex@deb-11:~$ sudo systemctl start mnt-stor.mount alex@deb-11:~$ ls -ld /mnt/stor/ drwxrwx--- 1 root stor 4096 авг 29 09:50 /mnt/stor/
Как видим доступ к каталогу только для пользователя root и группы stor.
Добавим в эту группу некоторых пользователей:
alex@deb-11:~$ sudo addgroup alex stor Добавляется пользователь «alex» в группу «stor» ... Добавление пользователя alex в группу stor Готово. alex@deb-11:~$ sudo addgroup max stor Добавляется пользователь «max» в группу «stor» ... Добавление пользователя max в группу stor Готово.
Проверим, появился ли у них доступ:
alex@deb-11:~$ su - max Пароль: max@deb-11:~$ cat /mnt/stor/test.txt 12312323423423 12321323423423 42344523423423 max@deb-11:~$ echo 56856462334534 >> /mnt/stor/test.txt max@deb-11:~$ exit alex@deb-11:~$
Как видим, пользователь max может и писать и читать в файлы, на примонтированном каталоге. Пользователь alex тоже.
Кстати, если перезагрузится удалённый сервер, то благодаря опции reconnect, каталог должен перемонтироваться. Я проверял, у меня это срабатывало.
Можем добавить наш юнит в автозагрузку, чтобы при перезагрузке локальной машины удалённый каталог тоже примонтировался:
alex@deb-11:~$ sudo systemctl enable mnt-stor.mount
Но если удалённый сервер будет выключен в момент загрузки локального сервера, то mount не сработает и каталог не будет примонтирован.
Чтобы избежать этого можно сделать ещё один юнит типа service, в таком юните можно указать перезапуск в случае ошибок. И именно этот юнит будет выполнять mount.
Вначале выключим автозапуск первого юнита:
alex@deb-11:~$ sudo systemctl disable mnt-stor.mount
Теперь напишем новый юнит:
alex@deb-11:~$ sudo nano /etc/systemd/system/mnt-stor.service [Unit] Description=SSH mount [Service] Type=oneshot ExecStart=systemctl start mnt-stor.mount Restart=on-failure StartLimitBurst=10 RestartSec=30s [Install] WantedBy=multi-user.target
Применим изменения и добавим юнит в автозагрузку:
alex@deb-11:~$ sudo systemctl daemon-reload alex@deb-11:~$ sudo systemctl enable mnt-stor.service
Теперь при загрузке сервера служба попытается 10 раз (каждые 30 секунд) примонтировать каталог. А если не сможет, то перестанет пытаться. Вы можете выставить другие, подходящие для вас параметры StartLimitBurst и RestartSec.
Монтирование при загрузке (fstab)
Выключим службу и проверим что каталог размонтировался. Также удалим службу из автозагрузки.
alex@deb-11:~$ sudo systemctl stop mnt-stor.mount alex@deb-11:~$ ls -l /mnt/stor/ итого 0 alex@deb-11:~$ sudo systemctl disable mnt-stor.service Removed /etc/systemd/system/multi-user.target.wants/mnt-stor.service.
В конфиг fstab запишем строку монтирования:
alex@deb-11:~$ sudo nano /etc/fstab alex@192.168.0.27:/home/alex/storage /mnt/stor/ fuse.sshfs allow_other,default_permissions,uid=0,gid=1003,umask=007,reconnect
И теперь можем монтировать, указав лишь точку монтирования:
alex@deb-11:~$ sudo mount /mnt/stor/ alex@deb-11:~$ ls -l /mnt/stor/ итого 4 -rwxrwx--- 1 root stor 225 авг 29 09:56 test.txt
При загрузке mount сработает автоматически. Но в случае недоступности удалённого каталога mount не сработает. И не сработает автоматически в будущем, когда удалённый каталог станет доступным. Поэтому этот способ я не рекомендую, лучше использовать монтирование systemd.
Итог
Вкратце пробежимся по основным моментам.
- Ручное монтирование делается с помощью команды
sshfs user@ip:/remote_path/ /local/path
. - Для монтирования sshfs можно использовать ключи ssh.
- Возможные опции монтирования:
- user_allow_other — разрешить другим пользователям использовать каталог;
- default_permissions — включить проверку прав на локальной стороне;
- uid=1000,gid=1000 — можем указать владельца и группу владельцев на локальной стороне;
- umask=000 — можем указать маску прав (реальные права будут урезаться на эту маску);
- compression=yes — включить компрессию;
- reconnect — переподключаться в случае сетевых проблем.
- Для автоматического монтирования можно использовать mount systemd или fstab.