Главная
» LINUX
»
Как автоматически монтировать удаленный каталог SSHFS при загрузке в Debian
Как автоматически монтировать удаленный каталог SSHFS при загрузке в Debian
Вы настраиваете монтирование SSHFS, подтверждаете его работоспособность, перезагружаете Debian, и внезапно удаленный каталог снова оказывается пустым. Ручная команда сработала, потому что вы были авторизованы, сеть уже была подключена, и SSH мог запрашивать подтверждение пароля или ключа хоста, если это было необходимо. При загрузке системы эти удобства отсутствуют.
Надежное решение — сделать аутентификацию SSH неинтерактивной, создать постоянную /etc/fstabзапись и сообщить systemd, что файловая система зависит от сети. В этом руководстве сначала рассматривается простейшая рабочая конфигурация, а затем добавляются параметры для медленных сетей и разорванных SSH-сессий. В примерах user@server.example.com:/srv/dataв качестве удаленного каталога используется , а /mnt/remoteв качестве локальной точки монтирования — .
На странице пакетов Debian в настоящее время указана SSHFS 3.7.3 для Debian 12 (Bookworm), и SSHFS использует подсистему SFTP, предоставляемую SSH. См. страницу пакетов SSHFS в Debian и руководство по SSHFS от разработчиков . Версии пакетов различаются в разных версиях Debian, но описанный ниже подход к монтированию при загрузке основан на стандартном поведении fstab и systemd.
Почему монтирование SSHFS вручную работает, но не работает при загрузке?
Большинство сбоев происходит по трем причинам. Во-первых, SSH может по-прежнему требовать пароль, кодовую фразу для ключа или подтверждение ключа хоста при первом подключении. Загрузочная система не имеет терминала, где можно было бы ответить на эти запросы. Во-вторых, монтирование может начаться до того, как сеть или DNS станут полностью работоспособными. В-третьих, длительное SSH-соединение может впоследствии стать неактивным после прерывания сети.
В документации systemd в Debian поясняется, что эта _netdevопция заставляет обрабатывать монтирование как сетевое. Сетевые монтирования располагаются после network-online.target. В той же документации отмечается, что /etc/fstabзаписи преобразуются в собственные единицы монтирования systemd при загрузке. См. systemd.mount(5) в Debian .
1. Установите SSHFS и создайте точку монтирования.
Установите пакетный клиент SSHFS и создайте локальный каталог, который обеспечит доступ к удалённым файлам:
SSHFS построена на основе FUSE, интерфейса файловой системы Linux в пользовательском пространстве. В Debian 12 этот sshfsпакет зависит от FUSE 3 и клиента OpenSSH.
Установите пакет SSHFS и создайте локальный каталог, который станет точкой монтирования.
2. Настройте аутентификацию SSH, которая может выполняться без запроса подтверждения.
Для монтирования в масштабе всей системы, запускаемого systemd, создание выделенного ключа, принадлежащего root, не представляет сложности, поскольку вспомогательная программа монтирования работает от имени root. Генерируйте ключ без парольной фразы только в том случае, если сама машина является доверенной и ключ предназначен исключительно для этой цели:
Если эта команда завершится успешно без запроса подтверждения, аутентификация готова к загрузке. Если система запросит подтверждение отпечатка сервера, подключитесь один раз в интерактивном режиме от имени root, проверьте отпечаток по доверенному источнику и подтвердите его. Не следует обходить ошибки ключа хоста, отключая проверку хоста.
Документация OpenSSH BatchMode=yesспециально предназначена для скриптов и пакетных заданий, поскольку она отключает запросы пароля и подтверждения. Ключи хоста проверяются по файлу пользователя known_hosts. См. руководство Debian ssh(1) и ssh_config(5) .
Подготовьте SSH-доступ по ключу и убедитесь, что соединение может быть установлено без интерактивного ввода.
3. Перед редактированием файла fstab вручную подтвердите монтирование SSHFS.
Не отлаживайте порядок загрузки, пока не заработает базовая команда SSHFS. Смонтируйте каталог один раз, используя тот же ключ:
Убедитесь, что вы можете получить список удаленных файлов, затем отмонтируйте их и проверьте файл fstab:
ls -la /mnt/remote
sudo fusermount3 -u /mnt/remote
В руководстве по SSHFS, предоставленном разработчиками, рекомендуется reconnectвосстанавливать прерванные соединения. Там также объясняется, что это ServerAliveIntervalможет предотвратить кажущееся зависание монтирования, когда неактивное SSH-соединение незаметно обрывается. При интервале в 15 секунд и значении OpenSSH по умолчанию, равном трем неотвеченным запросам, неработа соединения обнаруживается примерно через 45 секунд; здесь количество указано явно, чтобы поведение было очевидным.
4. Добавьте постоянную запись SSHFS в файл /etc/fstab.
Перед редактированием файла сделайте его резервную копию:
Этот fuse.sshfsподтип понятен инструментам монтирования Debian. В руководстве по SSHFS от разработчиков также указан sshfsтип файловой системы в fstab и примечания fuse.sshfsдля обеспечения совместимости. В руководстве Debian fstab(5) описаны шесть полей fstab и рекомендуется использовать обозначение подтипа файловой системы, например fuse.sshfs, .
Вариант
Почему это здесь?
_netdev
Это заставляет systemd рассматривать точку монтирования как зависящую от сети.
IdentityFile=...
Выбирает закрытый ключ явно, вместо того чтобы полагаться на интерактивного агента.
BatchMode=yes
Вместо ожидания запроса пароля или подтверждения происходит сбой.
reconnect
Позволяет SSHFS восстановить разорванное соединение.
ServerAliveInterval=15
Отправляет запросы подтверждения соединения на уровне SSH в периоды простоя.
ServerAliveCountMax=3
Ограничивает количество неотвеченных запросов подтверждения соединения до разрыва соединения по SSH.
default_permissions
Включает проверку локальных разрешений в дополнение к удаленной авторизации.
Добавьте точку монтирования SSHFS в файл /etc/fstab, указав явно параметры сети, идентификации и переподключения.
5. Проверьте запись в файле fstab перед перезагрузкой.
Опечатку /etc/fstabгораздо проще исправить до перезагрузки. Попросите systemd перезагрузить сгенерированные модули монтирования, а затем проверьте запись:
sudo systemctl daemon-reload
sudo mount -a
findmnt -T /mnt/remote
ls -la /mnt/remote
Если mount -aкоманда не возвращает ошибок и findmntсообщает об ошибке fuse.sshfs, синтаксис fstab принимается, и файловая система монтируется. Руководство Debian по команде mount(8) подтверждает, что mount -aмонтирует файловые системы fstab, за исключением записей, помеченных как noauto.
Перед перезагрузкой проверьте запись в файле fstab с помощью команд mount -a, findmnt и сгенерированного systemd модуля монтирования.
Что если сеть не будет готова достаточно скоро?
_netdevЭто обеспечивает systemd правильную семантику порядка выполнения команд, но network-online.targetточность зависит от службы управления сетью, которая её предоставляет. Wi-Fi, VPN, задержки DHCP, задержки DNS и необычные сетевые стеки могут сделать ненадежной мгновенную загрузку с монтирования.
В этом случае используйте автоматическое монтирование systemd, чтобы процесс загрузки создавал точку автоматического монтирования и устанавливал соединение SSHFS только при первом обращении к файлу /mnt/remote. Добавьте x-systemd.automountв параметры:
Это часто является лучшим выбором для ноутбуков, систем Wi-Fi или серверов, где удаленный хост может быть иногда недоступен. Это немного меняет семантику: автоматическое монтирование подготавливается во время загрузки, но фактическое SSH-соединение устанавливается при первом доступе. Если приложению абсолютно необходимо подключение к удаленному каталогу до его запуска, сохраните обычное сетевое монтирование и настройте systemd этого приложения так, чтобы он зависел от монтированного каталога.
Вам нужна опция allow_other?
По умолчанию доступ к монтированию FUSE возможен только с правами, связанными с контекстом монтирования. В руководстве по SSHFS описаны allow_otherспособы предоставления доступа другим локальным пользователям. Не добавляйте эту функцию, если служба или другая учетная запись действительно не нуждаются в смонтированных файлах.
Если вы используете FUSE allow_other, /etc/fuse.confсначала изучите его и последствия для безопасности. default_permissionsКак правило, целесообразно использовать его в паре с FUSE, чтобы не пропускать локальные проверки разрешений Unix. В конечном итоге, удаленная учетная запись SSH по-прежнему определяет, какие операции разрешает сервер.
Устранение неполадок, возникающих при загрузке SSHFS.
Крепление ожидает ввода пароля.
Повторите точно такой же неинтерактивный тест с помощью sudo ssh ... -o BatchMode=yes. Если он не пройден, исправьте аутентификацию по открытому ключу, прежде чем трогать systemd. Для ключа, защищенного парольной фразой, также потребуется агент или другой механизм сохранения секрета во время загрузки; обычный монтирование fstab не сможет ввести парольную фразу за вас.
Проверка ключа хоста не удалась.
Не используйте это StrictHostKeyChecking=noкак универсальное решение. Убедитесь, что сервер был пересобран или его ключ хоста был законно изменен. Проверка ключа хоста SSH — это мера безопасности, предотвращающая подмену личности и атаки типа «человек посередине».
Монтирование работает после входа в систему, но не во время загрузки.
Проверьте сгенерированное имя юнита и его журнал. В случае с /mnt/remote, systemd обычно экранирует путь к mnt-remote.mount:
systemctl status mnt-remote.mount
journalctl -b -u mnt-remote.mount
Если вы добавили x-systemd.automount, проверьте также:
systemctl status mnt-remote.automount
Доступ зависает после отключения сервера или сети.
Включены функции Keep reconnectи SSH Keepalive. В руководстве по SSHFS указано, что операции с файловой системой могут блокироваться на неопределенное время, если не обнаружено обрыва соединения. Функция Keepalive ограничивает обнаружение сбоев, но любая операция ввода-вывода, которая выполнялась в момент обрыва соединения, все еще может завершиться неудачей и может потребовать повторной попытки со стороны приложения.
Как убедиться, что монтирование действительно сохраняется после перезагрузки?
После mount -aуспешного завершения перезагрузите компьютер:
sudo reboot
После переподключения выполните следующие проверки:
findmnt -T /mnt/remote
systemctl is-active mnt-remote.mount
ls -la /mnt/remote
Если вы выбрали этот вариант x-systemd.automount, монтируемый блок может быть неактивен до первого доступа. Сначала проверьте автоматическую установку, затем активируйте её с помощью команды ls:
systemctl is-active mnt-remote.automount
ls -la /mnt/remote
findmnt -T /mnt/remote
Успешная настройка характеризуется четырьмя наблюдаемыми свойствами: аутентификация SSH завершается без взаимодействия, запись в fstab проходит проверку mount -a, systemd распознает монтирование как зависящее от сети, и удаленные файлы становятся доступными после чистой перезагрузки. Если хотя бы одна из этих проверок не пройдена, следует устранять неполадки непосредственно на этом уровне, а не добавлять параметры монтирования случайным образом.