Partilhar via


Soluções para problemas comuns do Azure IoT Edge

Aplica-se a: ícone sim IoT Edge 1.1

Importante

A data de fim do suporte do IoT Edge 1.1 foi 13 de dezembro de 2022. Consulte o Ciclo de Vida de Produtos da Microsoft para obter informações sobre como é suportado este produto, serviço, tecnologia ou API. Para obter mais informações sobre como atualizar para a versão mais recente do IoT Edge, consulte Atualizar o IoT Edge.

Use este artigo para identificar e resolver problemas comuns ao usar soluções do IoT Edge. Se você precisar de informações sobre como localizar logs e erros do seu dispositivo IoT Edge, consulte Solucionar problemas do dispositivo IoT Edge.

Provisionamento e implantação

O módulo do IoT Edge foi implementado com êxito e desaparece do dispositivo

Sintomas

Depois de definir módulos para um dispositivo IoT Edge, os módulos são implantados com êxito, mas depois de alguns minutos eles desaparecem do dispositivo e dos detalhes do dispositivo no portal do Azure. Outros módulos além dos definidos também podem aparecer no dispositivo.

Motivo

Se uma implantação automática tiver como alvo um dispositivo, ela terá prioridade sobre a configuração manual dos módulos para um único dispositivo. A funcionalidade Definir módulos no portal do Azure ou Criar implantação para funcionalidade de dispositivo único no Visual Studio Code entra em vigor por um momento. Você vê os módulos que você definiu iniciar no dispositivo. Em seguida, a prioridade da implantação automática é iniciada e substitui as propriedades desejadas do dispositivo.

Solução

Use apenas um tipo de mecanismo de implantação por dispositivo, seja uma implantação automática ou implantações de dispositivos individuais. Se você tiver várias implantações automáticas direcionadas a um dispositivo, poderá alterar as descrições de prioridade ou destino para garantir que a correta se aplique a um determinado dispositivo. Você também pode atualizar o dispositivo gêmeo para não corresponder mais à descrição de destino da implantação automática.

Para obter mais informações, consulte Compreender as implantações automáticas do IoT Edge para dispositivos únicos ou em escala.

Não é possível obter os logs de tempo de execução do IoT Edge no Windows

Sintomas

Você obtém um EventLogException ao usar Get-WinEvent no Windows.

Motivo

O Get-WinEvent comando PowerShell depende de uma entrada do Registro para estar presente para localizar logs por um ProviderNamearquivo .

Solução

Defina uma entrada do Registro para o daemon do IoT Edge. Crie um arquivo iotedge.reg com o seguinte conteúdo e importe para o Registro do Windows clicando duas vezes nele ou usando o reg import iotedge.reg comando:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\iotedged]
"CustomSource"=dword:00000001
"EventMessageFile"="C:\\ProgramData\\iotedge\\iotedged.exe"
"TypesSupported"=dword:00000007

Erro do cliente DPS

Sintomas

Falha ao iniciar o IoT Edge com mensagem de erro failed to provision with IoT Hub, and no valid device backup was found dps client error.

Motivo

Um registro de grupo é usado para provisionar um dispositivo IoT Edge para um Hub IoT. O dispositivo IoT Edge é movido para um hub diferente. O registo é eliminado no DPS. Um novo registro é criado no DPS para o novo hub. O dispositivo não é reprovisionado.

Solução

  1. Verifique se as credenciais do DPS estão corretas.
  2. Aplique sua configuração usando sudo iotedge apply configo .
  3. Se o dispositivo não for reprovisionado, reinicie o dispositivo usando sudo iotedge system restarto .
  4. Se o dispositivo não for reprovisionado, force o reprovisionamento usando sudo iotedge system reprovisiono .

Para reprovisionar automaticamente, defina dynamic_reprovisioning: true no arquivo de configuração do dispositivo. Definir esse sinalizador como true aceita o recurso de reprovisionamento dinâmico. O IoT Edge deteta situações em que o dispositivo parece ter sido reprovisionado na nuvem monitorando sua própria conexão do Hub IoT em busca de determinados erros. O IoT Edge responde desligando todos os módulos Edge e a si mesmo. Na próxima vez que o daemon for iniciado, ele tentará reprovisionar esse dispositivo com o Azure para receber as novas informações de provisionamento do Hub IoT.

Ao usar o provisionamento externo, o daemon também notificará o ponto de extremidade de provisionamento externo sobre o evento de reprovisionamento antes de desligar. Para obter mais informações, consulte Conceitos de reprovisionamento de dispositivos do Hub IoT.

Runtime do IoT Edge

O agente IoT Edge para após um minuto

Sintomas

O módulo edgeAgent é iniciado e executado com êxito por cerca de um minuto e, em seguida, para. Os logs indicam que o agente do IoT Edge tenta se conectar ao Hub IoT sobre AMQP e, em seguida, tenta se conectar usando AMQP sobre WebSocket. Quando isso falha, o agente do IoT Edge é encerrado.

Exemplo de logs do edgeAgent:

2017-11-28 18:46:19 [INF] - Starting module management agent.
2017-11-28 18:46:19 [INF] - Version - 1.0.7516610 (03c94f85d0833a861a43c669842f0817924911d5)
2017-11-28 18:46:19 [INF] - Edge agent attempting to connect to IoT Hub via AMQP...
2017-11-28 18:46:49 [INF] - Edge agent attempting to connect to IoT Hub via AMQP over WebSocket...

Motivo

Uma configuração de rede na rede host está impedindo que o agente IoT Edge alcance a rede. O agente primeiro tenta ligar através de AMQP (porta 5671). Se a conexão falhar, ele tenta WebSockets (porta 443).

O runtime do IoT Edge configura uma rede para comunicar em cada um dos módulos. No Linux, esta rede é uma rede de ponte. No Windows, utiliza NAT. Este problema é mais comum nos dispositivos Windows com contentores do Windows que utilizam a rede NAT.

Solução

Certifique-se de que existe uma rota para a Internet para os endereços IP atribuídos a esta rede bridge/NAT. Por vezes, uma configuração de VPN no anfitrião sobrepõe-se à rede do IoT Edge.

O módulo do Agente do Edge indica "ficheiro de configuração vazio" e nenhum módulo é iniciado no dispositivo

Sintomas

O dispositivo tem problemas para iniciar os módulos definidos na implantação. Apenas o edgeAgent está em execução, mas continuamente relatando 'arquivo de configuração vazio...'.

Motivo

Por padrão, o IoT Edge inicia módulos em sua própria rede de contêineres isolados. O dispositivo pode estar a ter problemas com a resolução de nomes DNS nesta rede privada.

Solução

Opção 1: Definir o servidor DNS nas configurações do mecanismo de contêiner

Especifique o servidor DNS para seu ambiente nas configurações do mecanismo de contêiner, que se aplicarão a todos os módulos de contêiner iniciados pelo mecanismo. Crie um ficheiro com o nome daemon.jsone, em seguida, especifique o servidor DNS a utilizar. Por exemplo:

{
    "dns": ["1.1.1.1"]
}

Este servidor DNS está definido como um serviço DNS acessível publicamente. No entanto, algumas redes, como redes corporativas, têm seus próprios servidores DNS instalados e não permitem acesso a servidores DNS públicos. Portanto, se o dispositivo de borda não puder acessar um servidor DNS público, substitua-o por um endereço de servidor DNS acessível.

Coloque daemon.json no local certo para a sua plataforma:

Plataforma Location
Linux /etc/docker
Host do Windows com contêineres do Windows C:\ProgramData\iotedge-moby\config

Se o local já contiver daemon.json o arquivo, adicione a chave dns a ele e salve o arquivo.

Reinicie o mecanismo de contêiner para que as atualizações entrem em vigor.

Plataforma Comando
Linux sudo systemctl restart docker
Windows (PowerShell de administrador) Restart-Service iotedge-moby -Force

Opção 2: Definir o servidor DNS na implantação do IoT Edge por módulo

Você pode definir o servidor DNS para createOptions de cada módulo na implantação do IoT Edge. Por exemplo:

"createOptions": {
  "HostConfig": {
    "Dns": [
      "x.x.x.x"
    ]
  }
}

Aviso

Se você usar esse método e especificar o endereço DNS errado, o edgeAgent perderá a conexão com o Hub IoT e não poderá receber novas implantações para corrigir o problema. Para resolver esse problema, você pode reinstalar o tempo de execução do IoT Edge. Antes de instalar uma nova instância do IoT Edge, certifique-se de remover todos os contêineres edgeAgent da instalação anterior.

Certifique-se de definir essa configuração para os módulos edgeAgent e edgeHub também.

O agente do IoT Edge não consegue aceder a uma imagem do módulo (403)

Sintomas

Um contêiner não é executado e os logs do edgeAgent relatam um erro 403.

Motivo

O módulo do agente IoT Edge não tem permissões para acessar a imagem de um módulo.

Solução

Verifique se as credenciais do Registro do contêiner estão corretas no manifesto de implantação do dispositivo.

O hub do IoT Edge falha ao iniciar

Sintomas

O módulo edgeHub falha ao iniciar. Poderá ver uma mensagem como um dos seguintes erros nos registos:

One or more errors occurred.
(Docker API responded with status code=InternalServerError, response=
{\"message\":\"driver failed programming external connectivity on endpoint edgeHub (6a82e5e994bab5187939049684fb64efe07606d2bb8a4cc5655b2a9bad5f8c80):
Error starting userland proxy: Bind for 0.0.0.0:443 failed: port is already allocated\"}\n)

Ou

info: edgelet_docker::runtime -- Starting module edgeHub...
warn: edgelet_utils::logging -- Could not start module edgeHub
warn: edgelet_utils::logging --     caused by: failed to create endpoint edgeHub on network nat: hnsCall failed in Win32:  
        The process cannot access the file because it is being used by another process. (0x20)

Motivo

Algum outro processo na máquina host vinculou uma porta que o módulo edgeHub está tentando vincular. O hub IoT Edge mapeia as portas 443, 5671 e 8883 para uso em cenários de gateway. O módulo não será iniciado se outro processo já tiver vinculado uma dessas portas.

Solução

Você pode resolver esse problema de duas maneiras:

Se o dispositivo IoT Edge estiver funcionando como um dispositivo de gateway, você precisará localizar e parar o processo que está usando a porta 443, 5671 ou 8883. Um erro para a porta 443 geralmente significa que o outro processo é um servidor web.

Se você não precisar usar o dispositivo IoT Edge como um gateway, poderá remover as ligações de porta das opções de criação de módulo do edgeHub. Você pode alterar as opções de criação no portal do Azure ou diretamente no arquivo deployment.json.

No portal do Azure:

  1. Navegue até o hub IoT e selecione Dispositivos no menu Gerenciamento de dispositivos.

  2. Selecione o dispositivo IoT Edge que você deseja atualizar.

  3. Selecione Definir Módulos.

  4. Selecione Configurações de tempo de execução.

  5. Nas configurações do módulo Hub de Borda , exclua tudo da caixa de texto Criar Opções .

  6. Salve suas alterações e crie a implantação.

No ficheiro deployment.json:

  1. Abra o arquivo deployment.json que você aplicou ao seu dispositivo IoT Edge.

  2. Encontre as edgeHub configurações na seção de propriedades desejadas do edgeAgent:

    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always"
    }
    
  3. Remova a createOptions linha e a vírgula à direita no final da image linha antes dela:

    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1"
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always"
    }
    
  4. Salve o arquivo e aplique-o ao seu dispositivo IoT Edge novamente.

O módulo do IoT Edge não envia uma mensagem para o edgeHub com o erro 404

Sintomas

Um módulo personalizado do IoT Edge não consegue enviar uma mensagem para o hub do IoT Edge com um erro 404 Module not found . O tempo de execução do IoT Edge imprime a seguinte mensagem nos logs:

Error: Time:Thu Jun  4 19:44:58 2018 File:/usr/sdk/src/c/provisioning_client/adapters/hsm_client_http_edge.c Func:on_edge_hsm_http_recv Line:364 executing HTTP request fails, status=404, response_buffer={"message":"Module not found"}u, 04 )

Motivo

O tempo de execução do IoT Edge impõe a identificação do processo para todos os módulos que se conectam ao edgeHub por motivos de segurança. Ele verifica se todas as mensagens enviadas por um módulo vêm do ID do processo principal do módulo. Se uma mensagem estiver sendo enviada por um módulo de um ID de processo diferente do estabelecido inicialmente, ele rejeitará a mensagem com uma mensagem de erro 404.

Solução

A partir da versão 1.0.7, todos os processos do módulo estão autorizados a se conectar. Para obter mais informações, consulte o changelog de versão 1.0.7.

Se não for possível atualizar para a versão 1.0.7, conclua as etapas a seguir. Certifique-se de que o mesmo ID de processo seja sempre usado pelo módulo IoT Edge personalizado para enviar mensagens para o edgeHub. Por exemplo, certifique-se de que em ENTRYPOINT vez de comando no seu arquivo Docker CMD . O CMD comando leva a um ID de processo para o módulo e outro ID de processo para o comando bash executando o programa principal, mas ENTRYPOINT leva a um único ID de processo.

Problemas de estabilidade em dispositivos mais pequenos

Sintomas

Você pode ter problemas de estabilidade em dispositivos com restrição de recursos, como o Raspberry Pi, especialmente quando usado como um gateway. Os sintomas incluem exceções de falta de memória no módulo de hub IoT Edge, dispositivos downstream que não conseguem se conectar ou o dispositivo não consegue enviar mensagens de telemetria após algumas horas.

Motivo

O hub IoT Edge, que faz parte do tempo de execução do IoT Edge, é otimizado para desempenho por padrão e tenta alocar grandes blocos de memória. Essa otimização não é ideal para dispositivos de borda restrita e pode causar problemas de estabilidade.

Solução

Para o hub IoT Edge, defina uma variável de ambiente OptimizeForPerformance como false. Há duas maneiras de definir variáveis de ambiente:

No portal do Azure:

No Hub IoT, selecione seu dispositivo IoT Edge e, na página de detalhes do dispositivo, selecione Definir configurações de tempo de execução de módulos>. Crie uma variável de ambiente para o módulo de hub IoT Edge chamada OptimizeForPerformance que está definida como false.

OptimizeForPerformance definido como false

No manifesto de implantação:

"edgeHub": {
  "type": "docker",
  "settings": {
    "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
    "createOptions": <snipped>
  },
  "env": {
    "OptimizeForPerformance": {
      "value": "false"
    }
  },

O daemon de segurança não pôde ser iniciado com êxito

Sintomas

O daemon de segurança falha ao iniciar e os contêineres de módulo não são criados. O edgeAgent, edgeHub e outros módulos personalizados não são iniciados pelo serviço IoT Edge. Nos aziot-edged logs, você vê este erro:

  • O daemon não pôde ser iniciado com êxito: Não foi possível iniciar o serviço de gerenciamento
  • causado por: Ocorreu um erro para o caminho /var/run/iotedge/mgmt.sock
  • causado por: Permissão negada (erro OS 13)

Motivo

Para todas as distribuições Linux, exceto o CentOS 7, a configuração padrão do IoT Edge é usar systemd a ativação de soquete. Um erro de permissão acontece se você alterar o arquivo de configuração para não usar a ativação de soquete, mas deixar as URLs como /var/run/iotedge/*.sock, já que o iotedge usuário não pode gravar para /var/run/iotedge o que significa que não pode desbloquear e montar os soquetes em si.

Solução

Não é necessário desativar a ativação de soquete em uma distribuição onde a ativação de soquete é suportada. No entanto, se você preferir não usar a ativação de soquete, coloque os soquetes em /var/lib/iotedge/.

  1. Execute systemctl disable iotedge.socket iotedge.mgmt.socket para desativar as unidades de soquete para que o systemd não as inicie desnecessariamente
  2. Alterar a configuração iotedge para usar /var/lib/iotedge/*.sock em ambas as connect seções e listen
  3. Se você já tem módulos, eles têm as montagens antigas /var/run/iotedge/*.sock , então docker rm -f eles.

Não foi possível iniciar o módulo devido a incompatibilidade do SO

Sintoma

O módulo edgeHub falha ao iniciar no IoT Edge versão 1.1.

Motivo

O módulo do Windows usa uma versão do Windows que é incompatível com a versão do Windows no host. IoT Edge Windows versão 1809 build 17763 é necessária como a camada base para a imagem do módulo, mas uma versão diferente está em uso.

Solução

Verifique a versão dos seus vários sistemas operativos Windows em Resolução de problemas de incompatibilidades de imagens de anfitrião e contentor. Se os sistemas operacionais forem diferentes, atualize-os para o IoT Edge Windows versão 1809 build 17763 e reconstrua a imagem do Docker usada para esse módulo.

Rede

O daemon de segurança do IoT Edge falha com um nome do anfitrião inválido

Sintomas

A tentativa de verificar os logs do gerenciador de segurança do IoT Edge falha e imprime a seguinte mensagem:

Error parsing user input data: invalid hostname. Hostname cannot be empty or greater than 64 characters

Motivo

O tempo de execução do IoT Edge só pode oferecer suporte a nomes de host com menos de 64 caracteres. As máquinas físicas geralmente não têm nomes de host longos, mas o problema é mais comum em uma máquina virtual. Os nomes de host gerados automaticamente para máquinas virtuais do Windows hospedadas no Azure, em particular, tendem a ser longos.

Solução

Quando vir este erro, pode resolvê-lo configurando o nome DNS da sua máquina virtual e, em seguida, definindo o nome DNS como o nome de anfitrião no comando de configuração.

  1. No portal do Azure, navegue até a página de visão geral da sua máquina virtual.

  2. Selecione configurar em Nome DNS. Se sua máquina virtual já tiver um nome DNS configurado, não será necessário configurar um novo.

    Configurar o nome DNS da máquina virtual

  3. Forneça um valor para o rótulo do nome DNS e selecione Salvar.

  4. Copie o novo nome DNS, que deve estar no formato <DNSnamelabel.><vmlocation.cloudapp.azure.com>.

  5. Dentro da máquina virtual, use o seguinte comando para configurar o tempo de execução do IoT Edge com seu nome DNS:

    • No Linux:

      sudo nano /etc/iotedge/config.yaml
      
    • No Windows:

      notepad C:\ProgramData\iotedge\config.yaml
      

O módulo do IoT Edge reporta erros de conectividade

Sintomas

Os módulos do IoT Edge que se conectam diretamente aos serviços de nuvem, incluindo os módulos de tempo de execução, param de funcionar conforme o esperado e retornam erros relacionados a falhas de conexão ou rede.

Motivo

Os contêineres dependem do encaminhamento de pacotes IP para se conectarem à Internet e poderem se comunicar com serviços em nuvem. O encaminhamento de pacotes IP é habilitado por padrão no Docker, mas se for desativado, todos os módulos que se conectam a serviços de nuvem não funcionarão conforme o esperado. Para obter mais informações, consulte Compreender a comunicação de contêiner na documentação do Docker.

Solução

Use as etapas a seguir para habilitar o encaminhamento de pacotes IP.

No Windows:

  1. Abra o aplicativo Executar .

  2. Entre regedit na caixa de texto e selecione Ok.

  3. Na janela Editor do Registro, navegue até HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

  4. Procure o parâmetro IPEnableRouter .

    1. Se o parâmetro existir, defina o valor do parâmetro como 1.

    2. Se o parâmetro não existir, adicione-o como um novo parâmetro com as seguintes configurações:

      Definição Valor
      Nome IPEnableRouter
      Type REG_DWORD
      Value 1
  5. Feche a janela do editor do Registro.

  6. Reinicie o sistema para aplicar as alterações.

No Linux:

  1. Abra o arquivo sysctl.conf .

    sudo nano /etc/sysctl.conf
    
  2. Adicione a seguinte linha ao ficheiro.

    net.ipv4.ip_forward=1
    
  3. Guarde e feche o ficheiro.

  4. Reinicie o serviço de rede e o serviço docker para aplicar as alterações.

Próximos passos

Encontrou um erro na plataforma do IoT Edge? Envie uma questão para que possamos continuar a melhorar.

Se você tiver mais perguntas, crie uma solicitação de suporte para obter ajuda.