===[ CIFS on Linux ]=== #post-id: 6983-20-31 #original-date: 8.09.2019 Sun #original-time: 8:31 PM #original-day: 6983 #original-host: WinXP Home SP3 (Build 2600) Представьте ситуацию. Имеется NAS под покоцанной Красной Шапочкой, который поддерживает SFTP, FTP и Самбу. В основном – Самбу. Есть компьютер под Минтом с МАТЭ, который в числе прочих ходит на этот NAS через шары, которые создаются серверным ПО (точнее, тонной спагетти-скриптов). Шары защищены логином и паролем. Виндовые машины под XP испытывали с этим NAS ряд сложностей. Например, по какой-то причине галочка автоматического подключения сетевых дисков не всегда работала правильно. Периодически диски то совсем не подключались, то просили снова пароль. Поэтому для них был написан скрипт в VBScript, который при входе в систему ждёт немного, а потом подключает диски. При выходе из системы диски отключаются автоматом самой системой. Кроме того, то и дело возникала проблема, когда при проблемах с Инетом NAS оказывался частично неработоспособен. Тоесть я нормально заходила на него по SSH, через вэб-морду, FTP, а Самба не работала. При обращении коннект висел до таймаута, словно какой-то софт на сервере ломится вовне и не пробивается. Та же история была и при принудительном отключении Инета от NAS на том же роутере. При этом вроде бы все профильные службы-зонды были выключены, Самба ничего такого не содержит в себе, а в последнее время эта проблема вроде бы не проявляется. Что происходит – БП. Учитывая, что проблема в основном была во времена Дальсвязи, где DNS по большей части тупо рубился где-то у провайдера, даже провайдеровские серверы были не доступны, и единственный выход был – DNSCrypt (я БП как другие жили), возможно просто серверный софт что-то пытался разрешить, но делал это криво. Но всёже и после бегства с Дальсвязи проблема наблюдалась раза два, так что кто его знает. Так вот. В один прекрасный момент машина с Минтом перестала подключаться к шарам. До этого, как я уже писала, такое было раза два, поэтому поначалу я не обратила внимания, решила дождаться, пока оно само собой разрешится. Но время шло, машины под Windows подключались почти нормально (иногда случаются странные тормоза и подвисания коннектов), а эта никак. Как происходило подключение? Через Caja я зашла на NAS и примонтировала нужные мне шары (поочерёдно открыла каждую, а они уже сами). На запрос я ввела логин и пароль и поставила галочку «Запомнить». После этого наваяла такой Bash скрипт, который запихнула в автозапуск при входе в систему. > #!/bin/bash > > # Sleep for 1 minute and 30 seconds... > sleep 90 > > gvfs-mount "smb://goflex_home/GoFlex Home Personal" > gvfs-mount "smb://goflex_home/Внешняя память" Тут вызывается системная утилита, которая использует тот же механизм, что и Caja. Пароль запомнен, поэтому нужно указать только путь к шаре. Кроме того, для удобства я сделала симлинки в /mnt, которые ведут на точки монтирования шар, ибо эти точки просто инфернальны: > /run/user/1000/gvfs/smb-share:server=goflex_home,share=goflex%20home%20personal/ > > /run/user/1000/gvfs/smb-share:server=goflex_home,share=внешняя%20память/ Пока шары не подключены, симлинки не открываются. Как подключаются, можно ходить через них, например, в поисках музыки. Среди проблем такого подхода – необходимость доступности дубаса. Если зайти на машину по SSH, то скрипт не будет работать, выдавая странное сообщение об ошибке. На деле gvfs-mount просто не может найти дубас, поскольку некоторые переменные окружения не установлены. Так вот, после начала проблем, всё стало работать так: скрипт вызывает gvfs-mount, та долго думает, потом сообщает, что доступ закрыт, введите пароль, ну и начинает в интерактивном режиме просить логин, домен, пароль. При вводе всё идёт на второй круг и так до бесконечности. А во время логона даже этого не видно, поскольку для скрипта не создаётся окно терминала. Пару раз был небольшой просвет, и на день-другой шары начинали монтироваться, но потом всё сломалось вновь. Так я промучилась несколько месяцев, пока не решила загуглить, что всё же происходит ^^' Создалось впечатление, что проблема в новом ядре (я вместо третьего четвёртое впилила), где вырубили старую версию аутентификации в Самбе, а многие NAS'ы только её и умеют. Винда была готова к этому, а Линукс – нет. Поэтому на горизонте замаячила новая смертельная битва на костылях. Забегая вперёд, скажу, что проблема решилась без старого метода аутентификации. Почему – БП. Первый вариант решения проблемы был попроще. Надо было в smbd.conf добавить строчку, которая управляла используемым методом аутентификации, а потом перезагрузить демона. Как вы понимаете, самый простой способ не заработал. Скорее всего потому что smbd – это про сервер, а не про клиента. Вторым вариантом шли страшные слова cifs-mount и fstab. Существует некий пакет, который позволяет монтировать шары через утилиту mount (или напрямую вызовом утилиты cifs-mount). /* Кстати, CIFS – это новое название для SMB, протокола расшаривания файлов, каталогов и принтеров на виндовых машинах, от которого произошло слово «Самба». Точнее, CIFS – это развитие SMB, новая его версия. */ У утилиты этой куча параметров, и без чтения мана тут не обойтись. Кроме того, дело осложнял тот факт, что хотелось всё сделать легковесным (тоесть, не прибитым гвоздями), чтобы монтировалось при входе в систему, а не вместе с другими файловыми системами. В общем, попугавшись, я нашла пару хороших ссылок, открыла их и принялась ваять команду вызова. https://www.samba.org/~ab/output/htmldocs/manpages-3/mount.cifs.8.html На самом деле можно было обойтись маном, но это же не наш метод ^^ /* К слову, я уже имела дело с mount и fstab, когда пробовала davfs для закачки файлов с сервера на Яндекс.Диск, но это было так давно, что я и забыла об этом. Тем более что у этого метода были некоторые неприятные особенности (вроде копирования всех передаваемых данных в кэш и отсутствия какой-либо индикации, в каком состоянии находится передача), поэтому я перешла на cadaver (который работает как утилиты ftp и sftp), и забыла про это чудо-юдо, как страшный сон. */ В итоге я соорудила такой скрипт. > #!/bin/bash > > # Sleep for 1 minute and 30 seconds... > sleep 90 > > if [[ ! -e "/media/GoFlex Home Personal" ]] ; then > sudo mkdir "/media/GoFlex Home Personal" > fi > if [[ ! -e "/media/GoFlex Home Внешняя Память" ]] ; then > sudo mkdir "/media/GoFlex Home Внешняя Память" > fi > > sudo mount -t cifs "//goflex_home/GoFlex Home Personal" "/media/GoFlex Home Personal" --verbose -o user=ariel,password=Aquata,uid=lk,gid=lk,file_mode=0664,dir_mode=0775,domain=USURA-NET > sudo mount -t cifs "//goflex_home/Внешняя память" "/media/GoFlex Home Внешняя Память" --verbose -o user=ariel,password=Aquata,uid=lk,gid=lk,file_mode=0664,dir_mode=0775,domain=USURA-NET Для начала скрипт проверяет и создаёт два каталога, к которым будет цеплять файловую систему. Вместо /mnt я решила использовать /media, поскольку выяснился забавный факт. Если монтировать в этот каталог, то на рабочем столе автоматом появятся иконки для подключенных файловых систем. Именно так при подключении флэшки оная оказывается на рабочем столе (и в Caja). После создания недостающих каталогов выполняется mount со всеми необходимыми параметрами. «-t cifs» указывает тип файловой системы, благодаря чему mount передаёт управление утилите cifs-mount, которая знает как монтировать Самба шары. Первый путь – путь к шаре. Тут в отличие от gvfs-mount не указывается «протокол» smb, поскольку gvfs-mount – универсальная утилита, а cifs-mount заточена только под Самбу и ничего другого в этом пути быть не может. И, да, обратите внимание, что слэши тут прямые, а не обратные, как в Windows. Второй путь – каталог, который мы создали ранее, на который будет навешиваться файловая система. /* Забавно, что в Windows для того чтобы примонтировать устройство без буквы через диспетчер дисков, тоже нужен пустой каталог, хотя по факту там обычный симлинк по имени устройства. */ «-o» задаёт параметры, которые передаются утилите cifs-mount и объясняют как мы хотим примонтировать шару. Все параметры записываются как «имя=значение» и разделяются запятой. «user=ariel» – имя пользователя, которое используется при аутентификации. «password=Aquata» – пароль, который используется при аутентификации. «uid=lk» и «gid=lk» задают владельца (пользователя и группу, соответственно) для всех файлов и каталогов на примонтированной файловой системе. Я указала себя. Можно указать числовой идентификатор, например, «1000». «file_mode=0664» и «dir_mode=0775» задают права доступа к файлам и каталогам на примонтированной файловой системе. Гайки решила не закручивать. Кстати, указывать нужно четыре цифры. Если указать три, то будет сообщено об ошибке, и параметр будет проигнорирован. «domain=USURA-NET» – домен, в котором всё происходит. У меня рабочая группа, но на всякий случай указала её. Есть и другие параметры, но мне они не понадобились. В том числе и метод аутентификации, о чём я говорила выше. Тоесть я решила попробовать сначала так, а потом уже подкручивать. Но неожиданно всё заработало с первого раза, и с двухсекундной паузой все шары примонтировались и даже появились на рабочем столе. Менять аутентификацию не потребовалось. Радости моей не было предела, но очень быстро обнаружились первые проблемы. Во-первых, чтобы отмонтировать эти шары, нужно было запустить команду вида: > sudo umount "/media/GoFlex Home Personal" У иконок на рабочем столе был соответствующий пункт, но при попытке его использовать появлялось сообщение об ошибке, что дескать, в fstab этой системы нет, и вообще, где root? Кроме того, скрипт не годился для автозапуска, поскольку требовал пароль для команды sudo. Я могла бы придумать, как стартовать терминал и ручками вводить пароль, но... Короче, от fstab уйти не удалось. Поэтому я нашла вот такой сайт и начала ваять запись в fstab. http://timlehr.com/auto-mount-samba-cifs-shares-via-fstab-on-linux/ Прежде всего, хочу сказать, что без мана обойтись не удалось. Именно оттуда я впервые узнала, что проблемы ескейпятся через «\040», а не защищаются кавычками. Ну и по формату записи тоже помогло кое-что уточнить. Ну а вообще, виндузятники маны не читают :} Мне нужно было перенести команды из скрипта в формат fstab. Вот что у меня получилось: > //goflex_home/GoFlex\040Home\040Personal /media/GoFlex\040Home\040Personal cifs user=ariel,password=Aquata,uid=lk,gid=lk,file_mode=0664,dir_mode=0775,domain=USURA-NET,user,noauto 0 0 > //goflex_home/Внешняя\040память /media/GoFlex\040Home\040Внешняя\040Память cifs user=ariel,password=Aquata,uid=lk,gid=lk,file_mode=0664,dir_mode=0775,domain=USURA-NET,user,noauto 0 0 Каждая строка – описание способа монтирования одного устройства. Она состоит из «полей», которые разделяются пробелами. Количество пробелов не имеет значения: можно красиво выравнивать текст. По большей части тут всё почти как в команде mount, поэтому описание будет кратким. Итак. Первое и второе поле – это путь к шаре и путь к точке монтирования. Точка, как мы помним, должна существовать. Третье поле – файловая система, в нашем случае – cifs. Оно указывает, что вызываться будет cifs-mount. Далее у нас идут параметры, которые сообщают утилите монтирования, как монтировать файловую шару. Ну тоесть здесь пишется то же самое, что и в параметр «-o» команды mount. Но! Сюда же идут параметры самого fstab, которые дополнительно указывают, как файловая система будет монтироваться, и которые не идут нижестоящим утилитам. «user». Этот параметр не следует путать с параметром «user=ariel». Он не имеет значения и указывает fstab, что данную файловую систему можно монтировать непривилегированному пользователю. Тоесть без команды sudo. «noauto». Этот параметр сообщает, что при старте системы эта файловая система не должна монтироваться вместе с остальными. Иными словами, она монтируется только по запросу. Как видите, эти параметры именно то, что мне было нужно: никаких sudo, и никакой автоматики, всё монтируется скриптом. Последние два поля тоже что-то означают, но там обычно нули. /* Возвращаясь к davfs. Я ради интереса глянула fstab на сервере, и там была примерно такая же картина, только без «user» и параметров аутентификации, которые хранились в отдельном конфиге). */ Таким образом скрипт монтирования стал до неприличного прост: > #!/bin/bash > > # Sleep for 1 minute and 30 seconds... > sleep 90 > > mount "/media/GoFlex Home Personal" > mount "/media/GoFlex Home Внешняя Память" Я решила не создавать каталоги в скрипте, положившись на то, что они никуда не исчезнут. Поэтому скрипт полностью работоспособен при автозапуске. Для отмонтирования шары можно выбрать соответствующий пункт у иконки на рабочем столе, либо сделать команду: > umount "/media/GoFlex Home Personal" Опять без sudo. Короче, как-то так. Из того, что я заметила, пока писала пост. Возможно, стоило бы монтировать не в /media, а в /media/lk (для меня), чтобы другим пользователям было не доступно, раз уж я монтирую только при собственном входе в систему. Но других пользователей на машине нет, а папка эта появляется и исчезает самостоятельно. Тоесть для её создания снова потребуется рут, и не понятно, не улетит ли она сама при очередном срабатывании автоматики.