Устранение неполадок в Файлы Azure в Linux (SMB)

Применимо к: ✔️ общим папкам Azure SMB

В этой статье перечислены распространенные проблемы, которые могут возникнуть при использовании общих папок SMB Azure с клиентами Linux. Кроме того, здесь представлены возможные причины этих проблем и способы их устранения.

Внимание

Эта статья относится только к ресурсам SMB. Дополнительные сведения об общих папках NFS см. в статье Устранение проблем с общими папками NFS в Azure.

Выполнить диагностику

Средства диагностики помогают убедиться, что у клиентов выполнены необходимые предварительные условия, а также собирать отладочные данные о проблемах, возникающих в реальных условиях эксплуатации, которые бывает трудно воспроизвести.

Использование AzFileDiagnostics

Используйте AzFileDiagnostics , чтобы автоматизировать обнаружение симптомов и убедиться, что клиент Linux имеет правильные предварительные требования. Это средство помогает настроить среду для оптимальной производительности.

Используйте средство диагностики Always-On

Вы также можете использовать средство диагностики Always-On (AOD) для сбора журналов на клиентах Linux SMB и NFSv4. Управляющая программа выполняется в фоновом режиме в качестве системной службы и может быть настроена для обнаружения аномалий в различных источниках, таких как журналы dmesg, отладочные данные, метрики ошибок и метрики задержки. Он может записывать данные из tcpdump, nfsstat, mountstats и других источников, а также использования ЦП и памяти системы.

Средство диагностики Always-On в настоящее время совместимо с системами под управлением SUSE Linux Enterprise Server 15 (SLES 15) и Red Hat Enterprise Linux 8 (RHEL 8). Выполните действия по установке, соответствующие операционной системе:

В SLES 15 следуйте этим указаниям, чтобы установить средство постоянной диагностики:

  1. Добавьте репозиторий Майкрософт. Возможно, потребуется добавить ключ репозитория Майкрософт в список доверенных ключей.

    sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
    sudo zypper addrepo --check --refresh --name 'Microsoft' https://packages.microsoft.com/sles/15/prod microsoft
    
  2. Обновите репозитории.

    sudo zypper refresh
    
  3. Проверьте, добавляется ли репозиторий и aod пакет доступен для установки.

    zypper search aod
    
  4. Установите пакет .

    sudo zypper install aod
    

Метки времени теряются при копировании файлов

На платформах Linux/Unix команда cp -p завершается ошибкой, если файл 1 и файл 2 принадлежат разным пользователям.

Причина

Флаг принудительного выполнения f в COPYFILE вызывает выполнение cp -p -f в Unix-системах. Этой команде также не удается сохранить метку времени файла, который вам не принадлежит.

Обходное решение

Используйте пользователя учетной записи хранения для копирования файлов:

  • str_acc_name=[storage account name]
  • sudo useradd $str_acc_name
  • sudo passwd $str_acc_name
  • su $str_acc_name
  • cp -p filename.txt /share

ls: не удается получить доступ к "<path>": ошибка ввода-вывода

При попытке перечислить файлы в общей папке Azure с помощью ls команды команда зависает при перечислении файлов. Вы увидите следующую ошибку:

ls: не удается получить доступ к "<path>": ошибка ввода-вывода

Решение

Обновите ядро Linux до версии, которая включает исправление этой проблемы. Используйте одну из следующих версий:

  • 4.4.87+
  • 4.9.48+
  • 4.12.11+
  • Любая версия 4.13 или более поздняя

Причина

По умолчанию при подключении общих файловых ресурсов Azure в Linux с помощью SMB поддержка символических ссылок (symlinks) не включена. Может появиться сообщение об ошибке:

sudo ln -s linked -n t
ln: failed to create symbolic link 't': Operation not supported

Решение

Клиент SMB Linux не поддерживает создание символьных ссылок в стиле Windows по протоколу SMB 2 или 3. Сейчас клиент Linux поддерживает для операций создания и отслеживания символьные ссылки в другом стиле (Minshall/French). Пользователи, которым нужны символьные ссылки, могут использовать параметр монтирования mfsymlinks. Используйте mfsymlinks , так как это также формат, используемый Mac.

Чтобы использовать символические ссылки, добавьте следующий параметр в конец команды монтирования SMB:

,mfsymlinks

Поэтому команда выглядит следующим образом:

sudo mount -t cifs //<storage-account-name>.file.core.windows.net/<share-name> <mount-point> -o vers=<smb-version>,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino,mfsymlinks

Теперь вы сможете создавать символьные ссылки, как описано на вики-сайте.

Не удается получить доступ к папкам или файлам

Невозможно получить доступ к папкам или файлам из общей папки Azure во время подключения к Linux. Команды, такие как du и ls, и сторонние приложения могут завершаться с ошибкой «Нет такого файла или каталога» при доступе к общему ресурсу.

Причина 1

Папки или файлы имеют имена, содержащие символы, закодированные по-разному системой, которая отправляет их. Например, файлы, загруженные с клиента macOS, могут содержать символ 0xF028 или 0xF029 вместо 0x20 (пробела) или 0x2E (точки).

Решение 1

mapchars Используйте параметр при подключении общей папки в Linux.

Вместо:

sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino

Используйте:

sudo mount -t cifs $smbPath $mntPath -o vers=3.0,username=$storageAccountName,password=$storageAccountKey,serverino,mapchars

Причина 2

Если удалить файл, но оставить дескриптор открытым, сервер SMB сохраняет файл-зомби, пока не будет закрыт последний дескриптор этого файла. Любые попытки выполнить операции с этим зомби-файлом могут привести к ошибкам "Нет таких файлов или каталогов" в Linux.

Решение 2

При необходимости восстановите удаленный файл из последней резервной копии.

Проблемы DNS с динамической миграцией учетных записей хранения Azure

Операции ввода-вывода с файлами в смонтированной файловой системе начинают выдавать ошибки «Хост недоступен» или «Доступ запрещен». Журналы Dmesg Linux на клиенте показывают повторяющиеся ошибки, такие как:

Status code returned 0xc000006d STATUS_LOGON_FAILURE
cifs_setup_session: 2 callbacks suppressed
CIFS VFS: \\contoso.file.core.windows.net Send error in SessSetup = -13

Вы также видите, что FQDN сервера теперь разрешается в IP-адрес, отличный от того, к которому в данный момент установлено подключение. Эта проблема может возникнуть в любом случае, когда IP-адрес сервера может измениться, например миграция учетных записей. Другой известный сценарий — переключение при отказе учетной записи хранилища, так как сопоставление DNS может измениться.

Причина

Для балансировки ёмкости система иногда выполняет оперативную миграцию учётных записей хранилища из одного кластера хранилища в другой. Миграция учетных записей обновляет сопоставления DNS, указывающие на целевой кластер, который перенаправляет Файлы Azure трафик из исходного кластера в целевой кластер. Это обновление блокирует весь трафик исходного кластера из этой учетной записи. Ожидается, что клиент SMB будет получать обновления DNS и перенаправлять дальнейший трафик в целевой кластер. Однако из-за ошибки в SMB-клиенте ядра Linux это перенаправление не вступает в силу. В результате трафик данных продолжает переходить в исходный кластер, который перестает обслуживать эту учетную запись после миграции.

Обходное решение

Эту проблему можно устранить, перезагрузив клиентскую ОС, но вы можете снова столкнуться с проблемой, если вы не обновите клиентскую ОС до версии дистрибутива Linux с поддержкой миграции учетных записей.

Хотя отключение и повторное подключение общего ресурса может временно устранить проблему, это не является окончательным решением. При повторном подключении клиента к серверу может возникнуть проблема. Это временное решение обусловлено тем, что новая операция монтирования обходит кэш SMB в ядре и разрешает DNS-адрес в пользовательском пространстве. Однако кэш DNS ядра используется при любом восстановлении сетевого подключения после разрыва, из-за чего проблема может возникнуть снова. Это поведение сохраняется даже за пределами миграции учетных записей хранения.

Чтобы лучше обойти эту проблему, снимите кэш сопоставителя DNS ядра:

  1. Отображение состояния модуля ядра dns_resolver , выполнив следующую команду:

    grep '.dns_resolver' /proc/keys
    

    Вы должны увидеть выходные данные команды, как показано в следующем примере:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: 1
    
  2. Снимите кэш сопоставителя DNS ядра, выполнив следующую команду:

    sudo keyctl clear $((16#$(grep '.dns_resolver' /proc/keys | cut -f1 -d\ ) ))
    
  3. Снова отобразите состояние модуля ядра dns_resolver :

    grep '.dns_resolver' /proc/keys
    

    Вы должны увидеть результат выполнения команды, примерно как в следующем примере, что означает, что кэш теперь пуст:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: empty
    
  4. Размонтируйте и снова смонтируйте общий ресурс, чтобы устранить проблему.

Примечание.

В некоторых старых дистрибутивах Linux шаги по устранению рисков могут не работать. В таких случаях перезагрузка клиентской ОС временно решает проблему. Чтобы окончательно устранить проблему, добавьте частную конечную точку для вашей учетной записи хранения и подключитесь к файловому ресурсу с помощью частного канала.

Решение

Для окончательного исправления обновите клиентскую ОС до версии дистрибутива Linux с поддержкой переноса учетных записей. Несколько исправлений для клиента ядра SMB Linux отправляются в основное ядро Linux. Следующие дистрибутивы включают следующие исправления:

  • Ubuntu: 20.04, 22.04, 24.04 и AKS 22.04 (исправления развертываются в ядре версии 5.15.0-1068)
  • RHEL: 8.6+
  • SLES: 15SP2, 15SP3, 15SP4 и 15SP5
  • Azure Linux: 2.0 (исправления включены в версию ядра 5.15.159.1) и 3.0

Некоторые дистрибутивы поддерживают эти исправления. Проверьте, существуют ли следующие исправления в используемой версии дистрибутива:

Не удается подключить общую папку SMB при включении FIPS

При включении федерального стандарта обработки информации (FIPS) на виртуальной машине Linux невозможно подключить общую папку SMB. Журналы dmesg Linux на клиенте отображают такие ошибки, как:

kernel: CIFS: VFS: Could not allocate crypto hmac(md5)
kernel: CIFS: VFS: Error -2 during NTLMSSP authentication
kernel: CIFS: VFS: \\contoso.file.core.windows.net Send error in SessSetup = -2
kernel: CIFS: VFS: cifs_mount failed w/return code = -2

Внимание

FIPS — это набор стандартов, которые правительство США использует для обеспечения безопасности и целостности компьютерных систем. Если система находится в режиме FIPS, она соответствует определенным требованиям шифрования, описанным в этих стандартах.

Причина

Клиент общей папки SMB использует проверку подлинности NTLMSSP, которая требует алгоритма хэширования MD5. Однако в режиме FIPS алгоритм MD5 ограничен, так как он не соответствует FIPS. MD5 — это широко используемая хэш-функция, которая создает 128-разрядное хэш-значение. Однако MD5 считается небезопасным для криптографических целей.

Как проверить, включен ли режим FIPS

Чтобы проверить, включен ли режим FIPS на клиенте, выполните следующую команду. Если значение установлено равным 1, то FIPS включён.

sudo cat /proc/sys/crypto/fips_enabled

Решение

Чтобы устранить эту проблему, включите проверку подлинности Kerberos для общей папки SMB. Если FIPS включен непреднамеренно, обратитесь к параметру 2 , чтобы отключить его.

Вариант 1. Включение проверки подлинности Kerberos для общей папки SMB

Чтобы подключить файловый ресурс SMB на виртуальной машине Linux с включенным FIPS, используйте аутентификацию на основе удостоверений. Дополнительные сведения см. в статье Включение проверки подлинности Active Directory через SMB для клиентов Linux, получающих доступ к Файлы Azure.

Вариант 2. Отключение FIPS для подключения общей папки Samba

  1. Измените значение crypto.fips_enabled sysctl на 0 в /etc/sysctl.conf.

  2. Измените GRUB_CMDLINE_LINUX_DEFAULT в файле /etc/default/grub и удалите параметр fips=1.

  3. Перестройте файл конфигурации grub2 с помощью следующей команды:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  4. Перестройте образ initramfs с помощью следующей команды:

    sudo dracut -fv
    
  5. Перезагрузите виртуальную машину.

Дополнительные сведения см. в следующих документах от распространителей Linux:

Нужна помощь?

Если вам все еще нужна помощь, обратитесь в службу поддержки, которая поможет быстро устранить проблему.

См. также