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

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

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

Важно!

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

Сфера применения

Тип общей папки SMB NFS
Общие папки уровня "Стандартный" (GPv2), LRS/ZRS
Общие папки уровня "Стандартный" (GPv2), GRS/GZRS
Общие папки уровня "Премиум" (FileStorage), LRS/ZRS

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

На платформах 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 не поддерживается поддержка символьных ссылок (символьных ссылок). Может появиться следующее сообщение об ошибке:

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

Решение

Клиент Linux SMB не поддерживает создание символьных ссылок в стиле Windows по протоколу SMB 2 или 3. В настоящее время клиент Linux поддерживает другой стиль символьных ссылок под названием Minshall+французские символьные ссылки для операций создания и последующего выполнения. Клиенты, которым нужны символические ссылки, могут использовать параметр подключения 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 и /или сторонние приложения, могут завершиться ошибкой "Нет такого файла или каталога" при доступе к общей папке; однако вы можете отправлять файлы в эти папки с помощью портал Azure.

Причина

Папки или файлы были отправлены из системы, которая кодирует символы в конце имени в другой символ. Файлы, отправленные с компьютера Macintosh, могут иметь символ "0xF028" или "0xF029" вместо 0x20 (пробел) или 0X2E (точка).

Решение

Используйте параметр 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

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

Файловые операции ввода-вывода в подключенной файловой системе начинают давать ошибки "Узел не работает" или "Отказано в разрешении". В журналах Linux dmesg на клиенте отображаются повторяющиеся ошибки, например:

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

Вы также увидите, что полное доменное имя сервера теперь разрешается на IP-адрес, отличный от того, к которому он подключен в настоящее время.

Причина

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

Обходной путь

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

Чтобы лучше обойти эту проблему, очистите кэш сопоставителя 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
    

Решение

Для постоянного исправления обновите клиентную ОС до версии дистрибутива Linux с поддержкой миграции учетных записей. В основное ядро Linux отправлено несколько исправлений для клиента ядра SMB Linux. В ядре версии 5.15+ и Keyutils-1.6.2+ есть исправления. Некоторые дистрибутивы поддерживают эти исправления, и вы можете проверка, если в используемой версии дистрибутива существуют следующие исправления:

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

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

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, используйте проверку подлинности Kerberos/Azure AD. Дополнительные сведения см. в статье Включение проверки подлинности 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:

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

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

См. также

Свяжитесь с нами для получения помощи

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