===== Задача =====
Кто имеет дело с 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|Обсуждение статьи на форуме]]
* [[Реализация файлообменной системы в домашней сети, децентрализованный вариант]]