===== Задача ===== Кто имеет дело с 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: username=user password=passWord Устанавливаем права для этого файла: # chmod 600 /etc/smb.pc2.auth Есть одна особенность: //название локальных каталогов, куда будут монтироваться ресурсы, нужно создавать на английском, иначе autofs не обрабатывает строки и не монтирует ресурсы, хотя в логе пишет, что монтирование вроде-как состоялось.// Теперь создаём файл с параметрами монтирований для 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 можно увидеть предупреждение о несоответствии версии и в этом случае необходимо принудительно выставить нужную, например: 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**, иначе будете получать сообщение о запрете на создание файлов и\или каталогов. Последний пример будет выглядеть так: 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 из файлов опций монтирований можно удалить - она не обрабатывается. Опция _netdev указывает на то, что файловая система располагается в сети и если сеть не работает на машине, не нужно делать попыток монтирования. В разных дистрибутивах эта опция обрабатывается по-разному. В логе видно как при обращении ресурсы монтируются, а если обращений нет или соединение к ресурсу закрыто, по таймауту делается демонтирование. На этом проверка завершена. Если всё работает как надо, можно убрать детальный вывод работы autofs в лог, изменив параметр **LOGGING** в файле /etc/default/autofs и перезагрузив демон. Возможны ситуации, когда машина с удалённым ресурсом недоступна в сети. При входе в каталог, куда монтируются ресурсы, возможно "подвисание" программ (файловых менеджеров, ls и прочих) на секунд 10...15 - в это время autofs пробует смонтировать ресурс. Не стоит этого пугаться - это нормальная работа демона. Если ресурс недоступен, каталоги будут отображаться как "битые" символьные ссылки. \\ ===== Смотрите также ===== * [[http://www.nixzeya.ru.net/forum/index.php?topic=243.msg636#msg636|Обсуждение статьи на форуме]] * [[Реализация файлообменной системы в домашней сети, децентрализованный вариант]]