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
Não é possível criar ligações simbólicas – ln: falha ao criar a ligação simbólica 't': Operação não suportada
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:
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
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\ ) ))
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
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:
cifs: no cifs_reconnect, resolva o nome do anfitrião novamente
cifs: utilize a saída de expiração de dns_query para agendar a próxima resolução
cifs: defina um mínimo de 120s para a resolução dns seguinte
cifs: corrigir a fuga de memória de smb3_fs_context_dup::server_hostname
dns: Aplicar um TTL predefinido aos registos obtidos a partir de getaddrinfo()
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
Altere o valor de sysctl de
crypto.fips_enabled
para 0 em/etc/sysctl.conf
.Modifique o
GRUB_CMDLINE_LINUX_DEFAULT
ficheiro no/etc/default/grub
e remova o parâmetrofips=1
.Reconstruiu o ficheiro de configuração grub2 com o seguinte comando:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Recrie a imagem initramfs com o seguinte comando:
sudo dracut -fv
Reinicie a VM.
Para obter mais informações, consulte os seguintes documentos dos distribuidores do Linux:
- RedHat: Por que motivo ativaria o modo FIPS nas montagens CIFS de quebra de kernel
- SUSE: A montagem CIFS falha com o erro "erro de montagem(2): Não existe esse ficheiro ou diretório"
Precisa de ajuda?
Se ainda precisar de ajuda, contacte o suporte para resolver o problema rapidamente.
Confira também
- Resolver Problemas dos Ficheiros do Azure
- Resolver problemas de desempenho dos Ficheiros do Azure
- Resolver problemas de conectividade dos Ficheiros do Azure (SMB)
- Resolver problemas de autenticação e autorização (SMB) dos Ficheiros do Azure
- Resolver problemas gerais do NFS dos Ficheiros do Azure no Linux
- Resolver problemas do Azure File Sync
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.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de