Compartilhar via


Resolver problemas dos Ficheiros do Azure no Linux (SMB)

Este artigo lista problemas comuns que podem ocorrer ao utilizar partilhas de ficheiros do Azure SMB com clientes Linux. Também fornece possíveis causas e resoluções para estes problemas.

Pode utilizar o AzFileDiagnostics para automatizar a deteção de sintomas e garantir que o cliente Linux tem os pré-requisitos corretos. Ajuda a configurar o seu ambiente para obter um desempenho ideal. Também pode encontrar estas informações na resolução de problemas das partilhas de ficheiros do Azure.

Importante

Este artigo aplica-se apenas a partilhas SMB. Para obter detalhes sobre partilhas NFS, veja Resolver problemas de partilhas de ficheiros do Azure NFS.

Aplicável a

Tipo de partilha de ficheiros SMB NFS
Partilhas de ficheiros standard (GPv2), LRS/ZRS
Partilhas de ficheiros standard (GPv2), GRS/GZRS
Partilhas de ficheiros Premium (FileStorage), LRS/ZRS

Os carimbos de data/hora foram perdidos ao copiar ficheiros

Nas plataformas Linux/Unix, o cp -p comando falhará se os diferentes utilizadores forem os próprios ficheiros 1 e 2.

Motivo

O sinalizador f de força em COPYFILE resulta na execução cp -p -f no Unix. Este comando também não preserva o carimbo de data/hora do ficheiro que não possui.

Solução alternativa

Utilize o utilizador da conta de armazenamento para copiar os ficheiros:

  • 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: não é possível aceder ao "<caminho>": Erro de entrada/saída

Quando tenta listar ficheiros numa partilha de ficheiros do Azure com o ls comando , o comando bloqueia ao listar ficheiros. Obtém o seguinte erro:

ls: não é possível aceder a'path<>': Erro de entrada/saída

Solução

Atualize o kernel do Linux para as seguintes versões que têm uma correção para este problema:

  • 4.4.87+
  • 4.9.48+
  • 4.12.11+
  • Todas as versões que são maiores ou iguais a 4.13

Motivo

Por predefinição, a montagem de partilhas de ficheiros do Azure no Linux com o SMB não ativa o suporte para ligações simbólicas (symlinks). Poderá ver um erro como este:

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

Solução

O cliente SMB do Linux não suporta a criação de ligações simbólicas ao estilo do Windows através do protocolo SMB 2 ou 3. Atualmente, o cliente Linux suporta outro estilo de ligações simbólicas chamadas Minshall+Symlinks franceses para criar e seguir operações. Os clientes que precisam de ligações simbólicas podem utilizar a opção de montagem "mfsymlinks". Recomendamos "mfsymlinks" porque é também o formato que os Macs utilizam.

Para utilizar symlinks, adicione o seguinte ao fim do comando de montagem SMB:

,mfsymlinks

Assim, o comando tem o seguinte aspeto:

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

Em seguida, pode criar symlinks conforme sugerido no wiki.

Não é possível aceder a pastas ou ficheiros com um espaço ou um ponto no final

Não pode aceder a pastas ou ficheiros a partir da partilha de ficheiros do Azure enquanto estiver montado no Linux. Comandos como du e ls e/ou aplicações de terceiros podem falhar com um erro "Não existe esse ficheiro ou diretório" ao aceder à partilha; No entanto, pode carregar ficheiros para estas pastas através do portal do Azure.

Motivo

As pastas ou ficheiros foram carregados a partir de um sistema que codifica os carateres no final do nome para um caráter diferente. Os ficheiros carregados a partir de um computador Macintosh podem ter um caráter "0xF028" ou "0xF029" em vez de 0x20 (espaço) ou 0X2E (ponto).

Solução

Utilize a opção mapchars na partilha ao montar a partilha no Linux:

Em vez de:

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

Use:

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

Problemas de DNS com a migração em direto de contas de armazenamento do Azure

A E/S do ficheiro no sistema de ficheiros montado começa a apresentar erros "O anfitrião está inativo" ou "Permissão negada". Os registos dmesg do Linux no cliente mostram erros repetidos como:

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

Também verá que o FQDN do servidor é agora resolvido para um endereço IP diferente do que está atualmente ligado.

Motivo

Por vezes, para fins de balanceamento de carga de capacidade, as contas de armazenamento são migradas em direto de um cluster de armazenamento para outro. A migração de contas aciona o tráfego dos Ficheiros do Azure para ser redirecionado do cluster de origem para o cluster de destino ao atualizar os mapeamentos DNS para apontarem para o cluster de destino. Isto bloqueia todo o tráfego para o cluster de origem dessa conta. Espera-se que o cliente SMB selecione as atualizações de DNS e redirecione mais tráfego para o cluster de destino. No entanto, devido a um erro no cliente kernel SMB do Linux, este redirecionamento não tem efeito. Como resultado, o tráfego de dados continua a ir para o cluster de origem, que deixou de servir esta conta após a migração.

Solução alternativa

Pode mitigar este problema ao reiniciar o SO cliente, mas poderá voltar a encontrar o problema se não atualizar o SO cliente para uma versão de distribuição do Linux com suporte de migração de conta.

Embora desmontar e montar novamente a partilha possa parecer resolver o problema temporariamente, não é uma solução permanente. Quando o cliente voltar a ligar ao servidor, o problema poderá ocorrer novamente. A mitigação temporária ocorre porque uma nova ação de montagem ignora a cache do kernel SMB e resolve o endereço DNS no espaço de utilizador. No entanto, a cache DNS do kernel é utilizada durante qualquer recuperação de desligamento da rede, o que pode fazer com que o problema se repita. Este comportamento persiste mesmo fora das migrações da conta de armazenamento.

Para resolver melhor este problema, limpe a cache de resolução de DNS do kernel:

  1. Apresente o estado do módulo kernel dns_resolver ao executar o seguinte comando:

    grep '.dns_resolver' /proc/keys
    

    Deverá ver a saída do comando como no exemplo seguinte:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: 1
    
  2. Limpe a cache de resolução de DNS do kernel ao executar o seguinte comando:

    sudo keyctl clear $((16#$(grep '.dns_resolver' /proc/keys | cut -f1 -d\ ) ))
    
  3. Apresentar novamente o estado do módulo kernel dns_resolver :

    grep '.dns_resolver' /proc/keys
    

    Deverá ver a saída do comando como no exemplo seguinte, que indica que a cache está agora vazia:

    132b6bbf I------     1 perm 1f030000     0     0 keyring   .dns_resolver: empty
    
  4. Desmontar e montar novamente a partilha para mitigar o problema.

Observação

Em algumas distribuições do Linux mais antigas, os passos de mitigação anteriores podem não funcionar. Nestes casos, reiniciar o SO cliente é a única mitigação conhecida.

Solução

Para uma correção permanente, atualize o SO cliente para uma versão de distribuição do Linux com suporte de migração de conta. Foram submetidas várias correções para o cliente de kernel SMB do Linux para o kernel do Linux de linha principal. A versão 5.15 e superior do kernel e o Keyutils-1.6.2+ têm as correções. Algumas distribuições suportaram estas correções e pode verificar se existem as seguintes correções na versão de distribuição que está a utilizar:

Não é possível montar a partilha de ficheiros SMB quando o FIPS está ativado

Quando o FiPS (Federal Information Processing Standard) está ativado numa VM do Linux, a partilha de ficheiros SMB não pode ser montada. O dmesg do Linux regista os erros de apresentação do cliente, tais como:

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

Importante

O FIPS é um conjunto de normas que o governo dos EUA utiliza para garantir a segurança e integridade dos sistemas informáticos. Quando um sistema está no modo FIPS, cumpre requisitos criptográficos específicos descritos por estas normas.

Motivo

O cliente da partilha de ficheiros SMB utiliza a autenticação NTLMSSP, que requer o algoritmo hash MD5. No entanto, no modo FIPS, o algoritmo MD5 é restrito porque não é compatível com FIPS. MD5 é uma função hash amplamente utilizada que produz um valor hash de 128 bits. No entanto, o MD5 é considerado inseguro para fins criptográficos.

Como verificar se o modo FIPS está ativado

Para verificar se o modo FIPS está ativado no cliente, execute o seguinte comando. Se o valor estiver definido como 1, o FIPS está ativado.

sudo cat /proc/sys/crypto/fips_enabled

Solução

Para resolver este problema, ative a autenticação Kerberos para a partilha de ficheiros SMB. Se o FIPS estiver ativado involuntariamente, veja a opção2 para desativá-lo.

Opção 1: Ativar a autenticação Kerberos para a partilha de ficheiros SMB

Para montar uma partilha de ficheiros SMB na VM do Linux onde o FIPS está ativado, utilize a autenticação Kerberos/Azure AD. Para obter mais informações, veja Ativar a autenticação do Active Directory através de SMB para clientes Linux que acedem aos Ficheiros do Azure.

Opção 2: Desativar o FIPS para montar a partilha Samba

  1. Altere o valor de sysctl de crypto.fips_enabled para 0 em /etc/sysctl.conf.

  2. Modifique o GRUB_CMDLINE_LINUX_DEFAULT ficheiro no /etc/default/grub e remova o parâmetro fips=1.

  3. Reconstruiu o ficheiro de configuração grub2 com o seguinte comando:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  4. Recrie a imagem initramfs com o seguinte comando:

    sudo dracut -fv
    
  5. Reinicie a VM.

Para obter mais informações, consulte os seguintes documentos dos distribuidores do Linux:

Precisa de ajuda?

Se ainda precisar de ajuda, contacte o suporte para resolver o problema rapidamente.

Confira também

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.