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

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















Введение




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




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




Монтирование ко всем перечисленным файловым системам можно выполнять по 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.



2023-08-30T09:39:44
Администрирование Linux