Задача
Кто имеет дело с Samba-ресурсами в Linux, причём когда сами ресурсы доступны не всегда, как например в домашней сети с несколькими компьютерами без выделенного сервера, наверняка заметил существенный недостаток монтирования этих ресурсов через файл fstab. Если ресурс недоступен в момент включения машины, операционная система не продолжает загрузку пока не попробует смонтировать сетевые ресурсы. В Debian на это уходит порядка 30…45 секунд в зависимости от количества ресурсов. Если попытки завершились неудачей, при появлении ресурсов в сети, их возможно смонтировать только через команду mount, что не всегда удобно.
В данной статье предлагается способ автоматического монтирования Samba-ресурсов по требованию - т.е. по мере обращения к ресурсу. Это позволяет не тратить время на попытки монтирования при загрузке, а также монтировать ресурсы в процессе работы командами.
Дано: установленный и работающий дистрибутив Debian, настроена сеть и Samba-ресурсы в этой сети.
Задача: настроить автоматическое монтирование ресурсов по требованию.
Уровень пользователя: средний, умение работать с текстовыми редакторами.
Решение:
Задача будет реализована посредством пакета autofs, которая позволяет автоматически выполнять команду монтирования с параметрами при обращении к ресурсу. Для примера, будет рассмотрена сеть из 3-х компьютеров. К одному из них будут монтироваться ресурсы остальных двух, причём ресурс incoming будет монтироваться с логином\паролем. Исходные данные представлены в таблице ниже:
| имя_компьютера | ip-адрес | ресурсы и права | учётные_данные |
|---|---|---|---|
| pc1 | 192.168.1.1 | video -- ro incoming -- rw | |
| pc2 | 192.168.1.2 | docs -- ro incoming -- rw | l: user p: passWord |
| pc3 | 192.168.1.3 | клиент |
Все действия по настройке проходят на машине pc3. Здесь главное разобраться и понять что и как работет, а дальше пользователь сможет сам настроить на базе этого простого примера нужное решение.
Autofs работает следующим образом: после запуска, демон читает конфигурационный файл /etc/default/autofs и находит в путь к мастер-файлу /etc/auto.master. В последнем прописано соответствие локального каталога и файла конфигурации, где прописан ресурс (или группа ресурсов) удалённого сервера. Например это будет файл /etc/auto.cifs.server1. Далее, в локальном каталоге создаются подкаталоги, описанные в /etc/auto.cifs.server1 и при обращии к ним происходит автоматическое монтирование ресурсов.
Шаг 1. Установка пакетов
Все действия выполняются от имени root`а. Устанавливаем пакет autofs с зависимостями:
# apt-get update # apt-get install autofs
Если монтирование Samba-ресурсов небыло настроено раньше, то необходимо доустановить пакеты для работы с Samba-ресурсами:
# apt-get install smbclient cifs-utils
После установки, демон autofs запустится автоматически, но на время конфигурирования его нужно отключить:
# /etc/init.d/autofs stop
Шаг 2. Настройка
Прежде чем перейти к настройке autofs, если ещё не созданы точки монтирования, их нужно создать. Например, ресурсы pc1 нужно монтировать в /mnt/pc1 , а ресурсы pc2 в /mnt/pc2 в локальной файловой системе:
# cd /mnt # mkdir pc1 # mkdir pc2
Основные конфигурационные файлы autofs: /etc/default/autofs и /etc/auto.master.
Внимание! В конце конфигов обязательно оставляем пустую строку.
Открываем на редактирование файл /etc/default/autofs и вносим некоторые изненения:
MASTER_MAP_NAME="/etc/auto.master" TIMEOUT=300 NEGATIVE_TIMEOUT=60 BROWSE_MODE="yes" LOGGING="verbose"
Немного по опциям:
- Опция BROWSE_MODE позволяет "видеть" ссылку на ресурс в файловой системе. Если выставить в no, то обращаться к ресурсу нужно будет вслепую или через символическую ссылку (т.е. ресурс создаётся в файловой системе только при обращении к нему), в некоторых случаях это не совсем удобно.
- TIMEOUT - это сколько секунд ресурс ещё будет примонтирован после последнего обращения.
- NEGATIVE_TIMEOUT - сколько секунд пытаться примонтировать недоступный ресурс.
- LOGGING - уровень подробности вывода сообщений в лог-файл (/var/log/syslog); для настройки пока выставим в verbose - подробно, а потом можно отключить вывод в лог, путём установки в none.
Теперь открываем на редактирование файл /etc/auto.master и комментируем (или удаляем) в нём все строки. Добавляем в этот файл такие строки:
/mnt/pc1 /etc/auto.cifs.pc1 /mnt/pc2 /etc/auto.cifs.pc2
Эти строки говорят, что ресурсы, описанные в /etc/auto.cifs.pc1 нужно монтировать в каталог /mnt/pc1 , аналогично и с pc2.
Создаём файлы с параметрами монтирований для pc1:
video -fstype=cifs,ro,guest,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.1/video incoming -fstype=cifs,rw,guest,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.1/incoming
Ресурс video монтируется как "гостевой", а incoming на pc2 монтируется с логином\паролем. Помещать учётные данные лучше в отдельный файл, а при монтировании указывать на него. Создаём файл с учётными данными, где будет прописан логин и пароль к ресурсу incoming на pc2:
- smb.pc2.auth
username=user password=passWord
Устанавливаем права для этого файла:
# chmod 600 /etc/smb.pc2.auth
Есть одна особенность: название локальных каталогов, куда будут монтироваться ресурсы, нужно создавать на английском, иначе autofs не обрабатывает строки и не монтирует ресурсы, хотя в логе пишет, что монтирование вроде-как состоялось.
Теперь создаём файл с параметрами монтирований для pc2:
- auto.cifs.pc2
docs -fstype=cifs,ro,guest,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.2/docs incoming -fstype=cifs,credentials=/etc/smb.pc2.auth,rw,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.2/incoming
Обратите внимание, что параметры uid и gid указывают в данном случае на uid и gid того пользователя, с правами которого будут отображаться файлы сетевого ресурса на локальном компьютере. Нужно указать параметры или псевдо-пользователя (объединяющего группы) или реального пользователя, работающего на данном компьютере.
Если у вас современный дистрибутив с ядром 4.*.*, возможно необходимо будет к строке опций монтирования добавить параметр vers, значение которого может быть из такого списка: 1.0 , 2.0 , 2.1 , 3.0 , 3.1.1 (или 3,11). Этим параметром указывается версия используемого протокола. 1.0 - это классический CIFS/SMBv1 протокол, 2.0 - используется в Windows Vista или MS Server 2008, 2.1 - в Windows 7 и Windows Server 2008R2, 3.0 - в Windows 8 и Windows Server 2012. В Xubuntu 18.04 по умолчанию используется вторая версия и в логах autofs или же в выводе команды mount можно увидеть предупреждение о несоответствии версии и в этом случае необходимо принудительно выставить нужную, например:
- auto.cifs.pc2
docs -fstype=cifs,vers=1.0,ro,guest,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.2/docs incoming -fstype=cifs,vers=1.0,credentials=/etc/smb.pc2.auth,rw,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 ://192.168.1.2/incoming
Внимание!
В более новых версиях Debian и Xubuntu 22.04 у которых версии:
- ядро - 6.5.0-28-generic,
- smbclient - 2:4.15.13
- cifs-utils - 2:6.14
- samba-common - 2:4.15.13
, автоматически подставляется параметры noforceuid и noforcegid, поэтому uid и gid для файлов и каталогов транслируются от сервера до клиентской машины - так если опции отображения uid и gid с сервера на местного пользователя (на клиентской стороне) не работают. Необходимо эти опции принудительно подкреплять опциями forceuid и forcegid, иначе будете получать сообщение о запрете на создание файлов и\или каталогов. Последний пример будет выглядеть так:
- auto.cifs.pc2
docs -fstype=cifs,vers=1.0,ro,guest,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,forceuid,forcegid ://192.168.1.2/docs incoming -fstype=cifs,vers=1.0,credentials=/etc/smb.pc2.auth,rw,iocharset=utf8,uid=1000,gid=1000,file_mode=0644,dir_mode=0755,forceuid,forcegid ://192.168.1.2/incoming
Когда все конфигурационные файлы созданы, пробуем запустить autofs и проверяем его работу:
# /etc/init.d/autofs start
Шаг 3. Проверка
Если всё настроено правильно и ресурсы доступны, листинг директорий /mnt/pc1 и /mnt/pc2 должен показать наличие каталогов ресурсов:
/mnt/pc1/
|- video
|- incoming
/mnt/pc2/
|- docs
|- incoming
Если какого-то подкаталога нет, значит либо ресурс недоступен, либо не монтируется по причине неправильных параметров. Фрагмент /var/log/syslog при исправной работе:
... Aug 27 13:24:06 pc3 automount[[1688]]: attempting to mount entry /mnt/pc1/video Aug 27 13:24:06 pc3 kernel: [[|9676.110056]] CIFS: Unknown mount option _netdev Aug 27 13:24:06 pc3 automount[[1688]]: mounted /mnt/pc1/video Aug 27 13:24:06 pc3 automount[[1688]]: attempting to mount entry /mnt/pc1/incoming Aug 27 13:24:06 pc3 kernel: [[|9676.327437]] CIFS: Unknown mount option _netdev Aug 27 13:24:06 pc3 automount[[1688]]: attempting to mount entry /mnt/pc2/docs Aug 27 13:24:06 pc3 automount[[1688]]: mounted /mnt/pc1/incoming Aug 27 13:24:06 pc3 kernel: [[|9676.335415]] CIFS: Unknown mount option _netdev Aug 27 13:24:06 pc3 automount[[1688]]: mounted /mnt/pc2/docs Aug 27 13:24:06 pc3 automount[[1688]]: attempting to mount entry /mnt/pc2/incoming Aug 27 13:24:06 pc3 kernel: [[|9676.342659]] CIFS: Unknown mount option _netdev Aug 27 13:24:06 pc3 automount[[1688]]: mounted /mnt/pc2/incoming ... Aug 27 13:29:41 pc3 automount[[1688]]: expiring path /mnt/pc1/video Aug 27 13:29:41 pc3 automount[[1688]]: expired /mnt/pc1/video Aug 27 13:29:41 pc3 automount[[1688]]: expiring path /mnt/pc1/incoming Aug 27 13:29:42 pc3 automount[[1688]]: expired /mnt/pc1/incoming Aug 27 13:29:42 pc3 automount[[1688]]: expiring path /mnt/pc2/docs Aug 27 13:29:42 pc3 automount[[1688]]: expired /mnt/pc2/docs Aug 27 13:29:42 pc3 automount[[1688]]: expiring path /mnt/pc2/incoming Aug 27 13:29:42 pc3 automount[[1688]]: expired /mnt/pc2/incoming
Обратите внимание на строку с сообщением о параметре _netdev - если выходит такое сообщение, значит опцию _netdev из файлов опций монтирований можно удалить - она не обрабатывается.
В логе видно как при обращении ресурсы монтируются, а если обращений нет или соединение к ресурсу закрыто, по таймауту делается демонтирование. На этом проверка завершена. Если всё работает как надо, можно убрать детальный вывод работы autofs в лог, изменив параметр LOGGING в файле /etc/default/autofs и перезагрузив демон.
Возможны ситуации, когда машина с удалённым ресурсом недоступна в сети. При входе в каталог, куда монтируются ресурсы, возможно "подвисание" программ (файловых менеджеров, ls и прочих) на секунд 10…15 - в это время autofs пробует смонтировать ресурс. Не стоит этого пугаться - это нормальная работа демона. Если ресурс недоступен, каталоги будут отображаться как "битые" символьные ссылки.