Bagikan melalui


Solusi untuk masalah umum untuk Azure IoT Edge

Berlaku untuk ikon:yes IoT Edge 1.1

Penting

IoT Edge 1.1 tanggal akhir dukungan adalah 13 Desember 2022. Periksa Siklus Hidup Produk Microsoft untuk mendapatkan informasi tentang bagaimana produk, layanan, teknologi, atau API ini didukung. Untuk informasi selengkapnya tentang memperbarui ke versi terbaru IoT Edge, lihat Memperbarui IoT Edge.

Gunakan artikel ini untuk mengidentifikasi dan mengatasi masalah umum saat menggunakan solusi IoT Edge. Jika Anda memerlukan informasi tentang cara menemukan log dan kesalahan dari perangkat IoT Edge Anda, lihat Memecahkan masalah perangkat IoT Edge Anda.

Provisi dan Penyebaran

Modul IoT Edge berhasil menyebarkan dan kemudian menghilang dari perangkat

Gejala

Setelah mengatur modul untuk perangkat IoT Edge, modul berhasil disebarkan tetapi setelah beberapa menit modul menghilang dari perangkat dan dari detail perangkat di portal Azure. Modul selain yang ditentukan mungkin juga muncul pada perangkat.

Penyebab

Jika penyebaran otomatis menargetkan perangkat, ia lebih memprioritaskan pada pengaturan modul secara manual untuk satu perangkat. Fungsionalitas Atur modul di portal Azure atau Buat penyebaran untuk fungsionalitas perangkat tunggal dalam Visual Studio Code berlaku sejenak. Anda akan melihat modul yang Anda tentukan untuk dimulai pada perangkat. Kemudian prioritas penyebaran otomatis dimulai dan menimpa properti yang diinginkan perangkat.

Solusi

Hanya gunakan satu jenis mekanisme penyebaran per perangkat, baik penyebaran otomatis atau penyebaran perangkat individu. Jika Anda memiliki beberapa penyebaran otomatis yang menargetkan perangkat, Anda dapat mengubah deskripsi prioritas atau target untuk memastikan penyebaran yang benar diterapkan ke perangkat tersebut. Anda juga dapat memperbarui kembaran perangkat agar tidak lagi cocok dengan deskripsi target penyebaran otomatis.

Untuk informasi selengkapnya, lihat Memahami penyebaran otomatis IoT Edge untuk satu perangkat atau berskala.

Tidak bisa mendapatkan log runtime IoT Edge di Windows

Gejala

Anda mendapatkan EventLogException saat menggunakan Get-WinEvent pada Windows.

Penyebab

Perintah PowerShell Get-WinEvent bergantung pada entri registri yang dihadirkan untuk menemukan log dengan ProviderName tertentu.

Solusi

Atur entri registri untuk daemon IoT Edge. Buat file iotedge.reg dengan konten berikut ini, dan impor ke Registri Windows dengan mengeklik ganda atau menggunakan perintah reg import iotedge.reg:

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

Kesalahan klien DPS

Gejala

IoT Edge gagal memulai dengan pesan kesalahanfailed to provision with IoT Hub, and no valid device backup was found dps client error.

Penyebab

Pendaftaran grup digunakan untuk memprovisikan perangkat IoT Edge ke IoT Hub. Perangkat IoT Edge dipindahkan ke hub yang berbeda. Pendaftaran dihapus di DPS. Pendaftaran baru dibuat di DPS untuk hub baru. Perangkat tidak disediakan ulang.

Solusi

  1. Verifikasi kredensial DPS Anda sudah benar.
  2. Terapkan konfigurasi Anda menggunakan sudo iotedge apply config.
  3. Jika perangkat tidak disediakan ulang, mulai ulang perangkat menggunakan sudo iotedge system restart.
  4. Jika perangkat tidak disediakan ulang, paksa provisi ulang menggunakan sudo iotedge system reprovision.

Untuk memprovisi ulang secara otomatis, atur dynamic_reprovisioning: true dalam file konfigurasi perangkat. Mengatur bendera ini ke keikutsertaan sejati ke fitur provisi ulang dinamis. IoT Edge mendeteksi situasi di mana perangkat tampaknya telah disediakan ulang di cloud dengan memantau koneksi IoT Hub sendiri untuk kesalahan tertentu. IoT Edge merespons dengan mematikan semua modul Edge dan dirinya sendiri. Saat daemon dimulai lagi, daemon akan mencoba memprovisikan ulang perangkat ini dengan Azure untuk menerima informasi provisi IoT Hub baru.

Saat menggunakan provisi eksternal, daemon juga akan memberi tahu titik akhir provisi eksternal tentang peristiwa provisi ulang sebelum dimatikan. Untuk informasi selengkapnya, lihat konsep provisi ulang perangkat IoT Hub.

Runtime IoT Edge

agen IoT Edge berhenti setelah satu menit

Gejala

Modul edgeAgent dimulai dan berjalan dengan sukses selama sekitar satu menit, lalu berhenti. Log mengindikasikan bahwa agen IoT Edge mencoba untuk terhubung ke IoT Hub melalui AMQP, dan kemudian mencoba untuk terhubung menggunakan AMQP melalui WebSocket. Ketika itu gagal, agen IoT Edge keluar.

Contoh log 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...

Penyebab

Konfigurasi jaringan pada jaringan host mencegah agen IoT Edge menjangkau jaringan. Agen mencoba untuk terhubung melalui AMQP (port 5671) terlebih dahulu. Jika koneksi gagal, ia mencoba WebSockets (port 443).

Runtime IoT Edge menyiapkan jaringan untuk setiap modul untuk berkomunikasi. Pada Linux, jaringan ini adalah jaringan jembatan. Pada Windows, ia menggunakan NAT. Masalah ini lebih umum terjadi pada perangkat Windows menggunakan kontainer Windows yang menggunakan jaringan NAT.

Solusi

Pastikan bahwa ada rute ke internet untuk alamat IP yang ditetapkan ke jaringan bridge/NAT ini. Terkadang konfigurasi VPN pada host menimpa jaringan IoT Edge.

Modul Edge Agent terus melaporkan 'file konfigurasi kosong' dan tidak ada modul yang dimulai pada perangkat

Gejala

Perangkat mengalami kesulitan memulai modul yang ditentukan di penyebaran. Hanya edgeAgent yang berjalan tetapi terus melaporkan 'file konfigurasi kosong...'.

Penyebab

Secara default, IoT Edge memulai modul dalam jaringan kontainer terisolasi sendiri. Perangkat mungkin mengalami masalah dengan resolusi nama DNS dalam jaringan privat ini.

Solusi

Pilihan 1: Mengatur server DNS di pengaturan mesin kontainer

Tentukan server DNS untuk lingkungan Anda di pengaturan mesin kontainer, yang akan berlaku untuk semua modul kontainer yang dimulai oleh mesin. Buat file bernama daemon.json, lalu tentukan server DNS yang akan digunakan. Contohnya:

{
    "dns": ["1.1.1.1"]
}

Server DNS ini diatur ke layanan DNS yang dapat diakses publik. Namun beberapa jaringan, seperti jaringan perusahaan, memiliki server DNS mereka sendiri yang terinstal dan tidak akan mengizinkan akses ke server DNS publik. Oleh karena itu, jika perangkat edge Anda tidak dapat mengakses server DNS publik, ganti dengan alamat server DNS yang dapat diakses.

Tempatkan daemon.json di lokasi yang tepat untuk platform Anda:

Platform Lokasi
Linux /etc/docker
Host Windows dengan kontainer Windows C:\ProgramData\iotedge-moby\config

Jika lokasi sudah berisi file daemon.json, tambahkan kunci dns ke sana dan simpan file.

Mulai ulang mesin kontainer agar pembaruan berdampak.

Platform Perintah
Linux sudo systemctl restart docker
Windows (Admin PowerShell) Restart-Service iotedge-moby -Force

Pilihan 2: Mengatur server DNS di penyebaran IoT Edge per modul

Anda dapat mengatur server DNS untuk setiap createOptions modul di penyebaran IoT Edge. Contohnya:

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

Peringatan

Jika Anda menggunakan metode ini dan menentukan alamat DNS yang salah, edgeAgent kehilangan koneksi dengan IoT Hub dan tidak dapat menerima penyebaran baru untuk memperbaiki masalah. Untuk mengatasi masalah ini, Anda dapat menginstal ulang runtime IoT Edge. Sebelum Anda menginstal instans baru IoT Edge, pastikan untuk menghapus kontainer edgeAgent apa pun dari penginstalan sebelumnya.

Pastikan untuk mengatur konfigurasi ini untuk modul edgeAgent dan edgeHub juga.

Agen IoT Edge tidak dapat mengakses gambar modul (403)

Gejala

Kontainer gagal dijalankan, dan log edgeAgent melaporkan kesalahan 403.

Penyebab

Modul agen IoT Edge tidak memiliki izin untuk mengakses gambar modul.

Solusi

Pastikan kredensial registri kontainer Anda benar manifes penyebaran perangkat Anda.

Hub IoT Edge gagal memulai

Gejala

Modul edgeHub gagal memulai. Anda mungkin melihat pesan seperti salah satu kesalahan berikut dalam log:

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)

Atau

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)

Penyebab

Beberapa proses lain pada komputer host telah mengikat port yang coba diikat oleh modul edgeHub. Hub IoT Edge memetakan port 443, 5671, dan 8883 untuk digunakan dalam skenario gateway. Modul gagal memulai jika proses lain telah mengikat salah satu port tersebut.

Solusi

Anda dapat menyelesaikan masalah ini dengan dua cara:

Jika perangkat IoT Edge berfungsi sebagai perangkat gateway, maka Anda perlu menemukan dan menghentikan proses yang menggunakan port 443, 5671, atau 8883. Kesalahan untuk port 443 biasanya berarti proses lainnya merupakan server web.

Jika Anda tidak perlu menggunakan perangkat IoT Edge sebagai gateway, maka Anda dapat menghapus pengikatan port dari pilihan pembuatan modul edgeHub. Anda dapat mengubah pilihan pembuatan di portal Azure atau langsung di file deployment.json.

Di portal Azure:

  1. Navigasi ke hub IoT Anda dan pilih Perangkat di bawah menu Manajemen perangkat .

  2. Pilih perangkat IoT Edge yang ingin Anda perbarui.

  3. Pilih Atur Modul.

  4. Pilih Pengaturan Runtime.

  5. Di pengaturan modul Edge Hub, hapus semuanya dari kotak teks Buat Pilihan.

  6. Simpan perubahan Anda dan buat penyebaran.

Di file deployment.json:

  1. Buka file deployment.json yang Anda terapkan ke perangkat IoT Edge Anda.

  2. Temukan pengaturan edgeHub di bagian properti yang diinginkan 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. Hapus baris createOptions, dan koma yang mengikuti pada akhir baris image sebelumnya:

    "edgeHub": {
        "settings": {
            "image": "mcr.microsoft.com/azureiotedge-hub:1.1"
        },
        "type": "docker",
        "status": "running",
        "restartPolicy": "always"
    }
    
  4. Simpan file dan terapkan ke perangkat IoT Edge Anda lagi.

Modul IoT Edge gagal mengirim pesan ke edgeHub dengan kesalahan 404

Gejala

Modul IoT Edge kustom gagal mengirim pesan ke hub IoT Edge dengan kesalahan Module not found 404. Runtime IoT Edge mencetak pesan berikut ke log:

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 )

Penyebab

Runtime IoT Edge memberlakukan identifikasi proses untuk semua modul yang terhubung ke edgeHub karena alasan keamanan. Ia memverifikasi semua pesan yang dikirim oleh modul berasal dari ID proses utama modul. Jika pesan dikirim oleh modul dari ID proses yang berbeda dari yang awalnya ditetapkan, pesan akan ditolak dengan pesan kesalahan 404.

Solusi

Pada versi 1.0.7, semua proses modul diizinkan untuk terhubung. Untuk informasi selengkapnya, lihat log perubahan rilis 1.0.7.

Jika peningkatan ke 1.0.7 tidak dimungkinkan, selesaikan langkah-langkah berikut. Pastikan ID proses yang sama selalu digunakan oleh modul IoT Edge kustom untuk mengirim pesan ke edgeHub. Untuk instans, pastikan untuk menjalankan ENTRYPOINT daripada perintah CMD di file Docker Anda. Perintah CMD mengarah ke satu ID proses untuk modul dan ID proses lainnya untuk perintah bash yang menjalankan program utama, tetapi ENTRYPOINT mengarah ke satu ID proses.

Masalah stabilitas pada perangkat yang lebih kecil

Gejala

Anda mungkin mengalami masalah stabilitas pada perangkat yang dibatasi sumber daya seperti Raspberry Pi, terutama saat digunakan sebagai gateway. Gejalanya mencakup pengecualian memori dalam modul hub IoT Edge, perangkat hilir gagal terhubung, atau perangkat gagal mengirim pesan telemetri setelah beberapa jam.

Penyebab

Hub IoT Edge, yang merupakan bagian dari runtime IoT Edge, dioptimalkan untuk kinerja secara default dan mencoba mengalokasikan gugus memori yang besar. Pengoptimalan ini tidak ideal untuk perangkat edge yang dibatasi dan dapat menyebabkan masalah stabilitas.

Solusi

Untuk hub IoT Edge, atur variabel lingkungan OptimizeForPerformance ke false. Ada dua cara untuk mengatur variabel lingkungan:

Di portal Azure:

Di IoT Hub Anda, pilih perangkat IoT Edge Anda dan dari halaman detail perangkat lalu pilih Atur Modul>Pengaturan Runtime. Buat variabel lingkungan untuk modul hub IoT Edge yang disebut OptimizeForPerformance yang diatur ke false.

OptimizeForPerformance diatur ke false

Di manifes penyebaran:

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

Daemon keamanan tidak berhasil dimulai

Gejala

Daemon keamanan gagal dimulai dan kontainer modul tidak dibuat. Modul edgeAgentkustom , edgeHub dan lainnya tidak dimulai oleh layanan IoT Edge. Dalam aziot-edged log, Anda akan melihat kesalahan ini:

  • Daemon tidak berhasil memulai: Tidak dapat memulai layanan manajemen
  • disebabkan oleh: Terjadi kesalahan untuk path /var/run/iotedge/mgmt.sock
  • disebabkan oleh: Izin ditolak (kesalahan os 13)

Penyebab

Untuk semua distro Linux kecuali CentOS 7, konfigurasi default IoT Edge adalah menggunakan systemd aktivasi soket. Kesalahan izin terjadi jika Anda mengubah file konfigurasi untuk tidak menggunakan aktivasi soket tetapi membiarkan URL sebagai /var/run/iotedge/*.sock, karena iotedge pengguna tidak dapat menulis untuk /var/run/iotedge berarti tidak dapat membuka kunci dan memasang soket itu sendiri.

Solusi

Anda tidak perlu menonaktifkan aktivasi soket pada distribusi tempat aktivasi soket didukung. Namun, jika Anda lebih suka tidak menggunakan aktivasi soket sama sekali, masukkan soket ke dalam /var/lib/iotedge/.

  1. Jalankan systemctl disable iotedge.socket iotedge.mgmt.socket untuk menonaktifkan unit soket sehingga systemd tidak memulainya secara tidak perlu
  2. Mengubah konfigurasi iotedge untuk digunakan /var/lib/iotedge/*.sock di bagian connect dan listen
  3. Jika Anda sudah memiliki modul, modul tersebut memiliki dudukan lama /var/run/iotedge/*.sock , jadi docker rm -f modul tersebut.

Tidak dapat memulai modul karena ketidakcocokan OS

Gejala

Modul edgeHub gagal dimulai di IoT Edge versi 1.1.

Penyebab

Modul Windows menggunakan versi Windows yang tidak kompatibel dengan versi Windows pada host. IoT Edge Windows versi 1809 build 17763 diperlukan sebagai lapisan dasar untuk gambar modul, tetapi versi yang berbeda sedang digunakan.

Solusi

Periksa versi berbagai sistem operasi Windows Anda di Memecahkan masalah ketidakcocokan host dan gambar kontainer. Jika sistem operasi berbeda, perbarui ke IoT Edge Windows versi 1809 build 17763 dan bangun kembali gambar Docker yang digunakan untuk modul tersebut.

Jaringan

Daemon keamanan IoT Edge gagal dengan nama host tidak valid

Gejala

Pencobaan untuk memeriksa log manajer keamanan IoT Edge gagal dan mencetak pesan berikut:

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

Penyebab

Runtime IoT Edge hanya dapat mendukung hostname yang lebih pendek dari 64 karakter. Komputer fisik biasanya tidak memiliki hostname yang panjang, tetapi masalah ini lebih umum terjadi pada komputer virtual. Hostname yang dihasilkan secara otomatis untuk komputer virtual Windows yang di-host di Azure, khususnya, cenderung panjang.

Solusi

Ketika Anda melihat kesalahan ini, Anda dapat menyelesaikannya dengan mengonfigurasikan nama DNS komputer virtual Anda, lalu mengatur nama DNS sebagai hostname di perintah penyiapan.

  1. Di portal Azure, buka halaman gambaran umum komputer virtual Anda.

  2. Pilih konfigurasikan di bawah nama DNS. Jika komputer virtual Anda sudah memiliki nama DNS yang dikonfigurasikan, Anda tidak perlu mengonfigurasikan yang baru.

    Mengonfigurasikan nama DNS komputer virtual

  3. Berikan nilai untuk Label nama DNS dan pilih Simpan.

  4. Salin nama DNS baru, yang harus dalam format <DNSnamelabel>.< vmlocation.cloudapp.azure.com>.

  5. Di dalam komputer virtual, gunakan perintah berikut untuk mengatur runtime IoT Edge dengan nama DNS Anda:

    • Pada Linux:

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

      notepad C:\ProgramData\iotedge\config.yaml
      

Modul IoT Edge melaporkan kesalahan konektivitas

Gejala

Modul IoT Edge yang terhubung langsung ke layanan cloud, termasuk modul runtime, berhenti bekerja seperti yang diharapkan dan mengembalikan kesalahan di sekitar kegagalan koneksi atau jaringan.

Penyebab

Kontainer mengandalkan penerusan paket IP untuk terhubung ke internet sehingga dapat berkomunikasi dengan layanan cloud. Penerusan paket IP diaktifkan secara default di Docker, tetapi jika dinonaktifkan maka modul apa pun yang terhubung ke layanan cloud tidak akan berfungsi seperti yang diharapkan. Untuk informasi selengkapnya, lihat Memahami komunikasi kontainer di dokumentasi Docker.

Solusi

Gunakan langkah-langkah berikut untuk mengaktifkan penerusan paket IP.

Di Windows:

  1. Buka aplikasi Run.

  2. Masukkan regedit di kotak teks dan pilih Oke.

  3. Di jendela Registry Editor, ramban ke HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

  4. Carilah parameter IPEnableRouter.

    1. Jika parameter ada, setel nilai parameter ke 1.

    2. Jika parameter tidak ada, tambahkan sebagai parameter baru dengan pengaturan berikut:

      Pengaturan Nilai
      Nama IPEnableRouter
      Jenis REG_DWORD
      Nilai 1
  5. Tutup jendela editor registri.

  6. Mulai ulang sistem Anda untuk menerapkan perubahan.

Di Linux:

  1. Buka file sysctl.conf.

    sudo nano /etc/sysctl.conf
    
  2. Tambahkan baris berikut ke file.

    net.ipv4.ip_forward=1
    
  3. Simpan dan tutup file.

  4. Mulai ulang layanan jaringan dan layanan buruh pelabuhan untuk menerapkan perubahan.

Langkah berikutnya

Apakah Anda menemukan bug di platform Azure IoT Edge? Kirim masalah agar kami dapat terus melakukan peningkatkan.

Jika Anda memiliki pertanyaan lain, buat Permintaan dukungan untuk bantuan.