Использование mount -t cifs -v <address>
возвращает Host is Down
ошибку при подключении к серверу, работающему по протоколу SMB 2.0 (с отключенным SMB 1.0). Обходной путь — указать vers=2.0
в списке аргументов mount
. Это работает нормально, если вы монтируете через командную строку и можете указать этот аргумент. Но при использовании графического интерфейса или какой-либо программы, которая вызывает mount
от вашего имени, этот аргумент не указывается.
Есть ли способ сделать SMB 2.0+ протоколом по умолчанию для всех mount -t cifs
вызовов, независимо от того, кто его вызывает? Возможно, в smb.conf
?
В настоящее время работает под управлением Arch Linux.
РЕДАКТИРОВАТЬ:
Добавлен и min protocol = SMB2
перезапущен /etc/samba/smb.conf
сервис. Оба mount
и smbclient
по-прежнему требуют указания версии SMB перед подключением к серверу.
ПРАВКА2:
Добавление client min protocol = SMB2
и client max protocol = SMB3
позволяет smbclient
подключаться к серверу без указания аргумента версии. Но, mount
все еще не учитывает недавно добавленные строки в smb.conf
.
решение1
К сожалению, модуль файловой системы ядра вообще cifs
не читает /etc/samba/smb.conf
. Клиентский модуль CIFS, который позволяет монтировать общие файлы Windows, полностью отделен от Samba.
Уровень протокола по умолчанию в cifs
модуле был изменен на SMB3 в версии ванильного ядра 4.13, а патч для согласования нескольких диалектов (фактически устанавливающий значение по умолчанию на «SMB2.1 или более позднюю версию») был добавлен в ванильные ядра в сентябре 2017 года.
Я почти уверен, что «корпоративные» дистрибутивы Linux уже перенесли патч на более ранние ядра, но в Arch единственным вариантом может быть обновление до версии ядра 4.13 или более поздней.
Вот ссылка на соответствующий патч в kernel.org Git.Идентификатор коммита может быть полезен для отслеживания исправления в определенных версиях ядра.
решение2
В рамках исследования этой проблемы я написал скрипт, который настраивает параметры CIFS для mount
команды.
#!/bin/bash
#
# Force SMB2.0 mount. We prefix the options list because a later explicit
# "vers=..." option overrides the one we add.
########################################################################
#
args=()
# Only consider checking options if we have a CIFS mount
[[ "$*" =~ '-t cifs' ]] && cifs=yes || cifs=
options=
for arg in "$@"
do
if [[ $next == 'options' ]]
then
# Prefix version to options string
arg="vers=2.0,$arg"
next=
fi
args+=("$arg")
# CIFS options check
if [[ $cifs == 'yes' ]]
then
[[ $arg == '-o' ]] && next=options
fi
done
logger -p user.notice -t "${0/*\/}" "intercepted $0 ${args[*]}"
exec "$0.real" "${args[@]}"
Установите этот скрипт как /bin/mount.sh
. Затем выполните эти команды
chmod a+x /bin/mount.sh
mv /bin/mount /bin/mount.real && ln -fs mount.sh /bin/mount
Удалите его с помощью
test -L /bin/mount && rm -f /bin/mount && mv -f /bin/mount.real /bin/mount
rm -f /bin/mount.sh