Установка SMB 2.0 в качестве протокола по умолчанию для операций монтирования

Установка SMB 2.0 в качестве протокола по умолчанию для операций монтирования

Использование 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

Связанный контент