Монтирование SSHFS

🕒 6 мин.

Из статьи вы узнаете про монтирование Linux каталога по сети с использованием SSHFS. Рассмотрим ручное и автоматическое монтирование с помощью с помощью systemd.

Введение

Linux монтирование SSHFS

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

Монтирование ко всем перечисленным сетевым файловым системам можно выполнять по 3-ём разным сценариям:

  • ручное монтирование с помощью команды mount,
  • автоматическое монтирование с помощью файла fstab,
  • автоматическое монтирование с помощью systemd.

Все примеры в этой статье были выполнены в Debian 12.

Установка SSHFS

На той системе, от куда мы хотим выполнять монтирование, нужно установить пакет sshfs:

$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt install sshfs

На удалённой системе должен быть установлен и работать ssh-сервер, настройку которого в этой статье я не рассматриваю.

Ручное монтирование

Создадим точку монтирования в домашнем каталоге:

alex@deb-11:~$ mkdir storage

Монтировать sshfs может не только пользователь root, а любой пользователь системы.

Монтирование выполняется с помощью команды sshfs, после которой нужно указать от куда мы монтируем (пользователь@адрес:/удалённый_каталог). И куда мы монтируем (/локальный_каталог).

Вот пример монтирования:

$ sshfs alex@172.28.90.32:/home/alex ~/storage/

А размонтировать можем с помощью команды umount. Ей нужно передать точку монтирования. При этом размонтировать может только тот пользователь, кто осуществлял монтирование.

$ umount ~/storage

Использование ssh-ключей

Чтобы монтирование выполнялось без запроса пароля, мы можем использовать ssh-ключи.

С помощью трёх команд ниже создадим ключ, перекинем его на удалённый сервер и примонтируем каталог без запроса пароля:

$ ssh-keygen
$ ssh-copy-id alex@172.28.90.32
$ sshfs alex@172.28.90.32:/home/alex ~/storage/

В случае, если пароль у вас спросило, значит вам придётся разбираться с ключами ssh. Я писал про них в этой статье: Используем ssh ключи на Linux.

Опции монтирования

По умолчанию к удалённому каталогу сможет получить доступ только тот пользователь, который выполнял монтирование. Но это можно изменить. Вначале включим такую возможность, добавив в файл /etc/fuse.conf опцию user_allow_other:

$ sudo nano /etc/fuse.conf
user_allow_other

Размонтируем каталок, и выполним монтирование с опцией allow_other:

$ umount ~/storage
$ sshfs -o allow_other alex@172.28.90.32:/home/alex ~/storage/

Теперь любой пользователь локальной системы сможет выполнять с файлами всё что разрешено удалённому пользователю alex. Поэтому бывает удобно включить проверку прав на локальной системе, это делает опция default_permissions:

$ umount ~/storage
$ sshfs -o allow_other,default_permissions \
  alex@172.28.90.32:/home/alex ~/storage/

Также мы можем указать uid и gid владельца (на локальной стороне). Для примера создадим пользователя max, вычислим его uid и при монтировании укажем:

  • uid — своего пользователя;
  • gid — пользователя max.
$ umount ~/storage
$ sudo adduser max

$ id max
uid=1001(max) gid=1001(max) группы=1001(max),100(users)

$ sshfs -o allow_other,default_permissions,uid=1000,gid=1001 \
  alex@172.28.90.32:/home/alex ~/storage/

$ ls -l ~/storage/
итого 0
-rw-r--r-- 1 alex max 0 фев 25 21:15 test.txt

К сожалению в sshfs нет опций dmask и fmask, то есть мы не можем указать права на монтируемые файлы и каталоги. Но есть опция umask, она отнимет из текущих прав указанное число. Например на удалённом сервере есть каталог с правами 755 а в нём файл с правами 644. Так вот, если мы при монтировании укажем опцию umask=111, то каталог в локальной системе получит права 644, а файл 533.

Подробнее про Linux права можете почитать в другой моей статье: Стандартные права доступа в Linux.

Дополнительно вы можете включить компрессию (compression=yes) по умолчанию она выключена. И включить автоматическое переподключение к серверу, если соединение прерывается (reconnect).

$ umount ~/storage
$ sshfs -o compression=yes,reconnect \
  alex@172.28.90.32:/home/alex ~/storage/

И расскажу про ещё одну опцию. По умолчанию, когда мы используем ключи ssh, то ключ ищется по такому пути (~/.ssh/id_rsa). Мы можем указать местоположение ключа вручную, с помощью опции identityfile (например identityfile=/home/max/.ssh/id_rsa). Но к этому файлу у вас должны быть права доступа.

Остальные опции можете посмотреть выполнив:

$ man sshfs

Монтирование с помощью systemd

Предварительно размонтируем каталог:

$ umount ~/storage

Мы можем сделать mount systemd и монтировать удалённый каталог с его помощью. Давайте вначале сделаем общую точку монтирования в /mnt:

$ sudo mkdir /mnt/stor

Создадим группу, члены которой смогут обращаться к примонтированному каталогу (запомним GID):

$ sudo addgroup stor
Добавляется группа «stor» (GID 1002) ...
Готово.

Теперь можем сгенерировать ssh-ключи для пользователя root. И передадим ключ на удалённый сервер:

$ sudo ssh-keygen
$ sudo ssh-copy-id alex@192.168.0.27

Попробуем примонтировать каталог под root пользователем (для этого используем sudo):

$ sudo sshfs alex@172.28.90.32:/home/alex /mnt/stor/

Если каталог примонтировался без запроса пароля, значит вы всё сделал правильно.

Размонтируем каталог:

$ sudo umount /mnt/stor

И напишем юнит systemd:

$ 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@172.28.90.32:/home/alex
Where=/mnt/stor/
Type=fuse.sshfs
Options=allow_other,default_permissions,uid=0,gid=1002,umask=007,reconnect

Применим изменения:

$ sudo systemctl daemon-reload

Попробуем примонтировать и проверим доступ:

$ sudo systemctl start mnt-stor.mount

$ ls -ld /mnt/stor/
drwxrwx--- 1 root stor 4096 фев 25 21:17 /mnt/stor/

Как видим доступ к каталогу только для пользователя root и группы stor.

Добавим в эту группу некоторых пользователей:

$ sudo usermod -aG stor alex
$ sudo usermod -aG stor max

Проверим, появился ли у них доступ:

$ su - max
Пароль:

$ ls -l /mnt/stor/
итого 0
-rwxrwx--- 1 root stor 0 фев 25 21:15 test.txt

$ echo 123 > /mnt/stor/test.txt
$ cat /mnt/stor/test.txt
123

Как видим, пользователь max может и писать и читать в файлы, на примонтированном каталоге. Пользователь alex тоже.

Кстати, если перезагрузится удалённый сервер, то благодаря опции reconnect, каталог должен перемонтироваться. Я проверял, у меня это срабатывало.

Можем добавить наш юнит в автозагрузку, чтобы при перезагрузке локальной машины удалённый каталог тоже примонтировался:

$ sudo systemctl enable mnt-stor.mount

Но если удалённый сервер будет выключен в момент загрузки локального сервера, то mount не сработает и каталог не будет примонтирован.

Чтобы избежать этого можно сделать ещё один юнит типа service, и в таком юните можно указать перезапуск в случае ошибок. И именно этот юнит будет выполнять mount.

Вначале выключим автозапуск первого юнита:

$ sudo systemctl disable mnt-stor.mount

Теперь напишем новый юнит:

$ 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

Применим изменения и добавим юнит в автозагрузку:

$ sudo systemctl daemon-reload
$ 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.

Если понравилась статья, подпишись на мой канал в VK или Telegram.

Мы используем cookie-файлы для наилучшего представления нашего сайта. Продолжая использовать этот сайт, вы соглашаетесь с использованием cookie-файлов.
Принять
Отказаться
Политика конфиденциальности