Из статьи вы узнаете про монтирование 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *