Distribuire IoT Edge in una macchina virtuale Ubuntu in Azure Stack Edge

SI APPLICA A:Yes for Pro GPU SKUAzure Stack Edge Pro - GPUYes for Pro 2 SKUAzure Stack Edge Pro 2Yes for Pro R SKUAzure Stack Edge Pro RYes for Mini R SKUAzure Stack Edge Mini R

Questo articolo descrive come distribuire un runtime IoT Edge in una macchina virtuale Ubuntu in esecuzione nel dispositivo Azure Stack Edge. Per il nuovo lavoro di sviluppo, usare il metodo di distribuzione self-service descritto in questo articolo perché usa la versione software più recente.

Flusso generale

Il flusso generale è il seguente:

  1. Creare o identificare l'istanza del servizio Device Provisioning (DPS) hub IoT o hub IoT di Azure.
  2. Usare l'interfaccia della riga di comando di Azure per acquisire l'immagine della macchina virtuale Ubuntu 20.04 LTS.
  3. Caricare l'immagine Ubuntu nella libreria di immagini della macchina virtuale Azure Stack Edge.
  4. Distribuire l'immagine Ubuntu come macchina virtuale seguendo questa procedura:
    1. Specificare il nome della macchina virtuale, il nome utente e la password. La creazione di un altro disco è facoltativa.
    2. Configurare la configurazione di rete.
    3. Specificare uno script cloud-init preparato nella scheda Avanzate.

Prerequisiti

Prima di iniziare, verifica di disporre di:

  • Un dispositivo Azure Stack Edge attivato. Per i passaggi dettagliati, vedere Attivare Azure Stack Edge Pro GPU.

  • Accesso all'immagine di macchina virtuale Ubuntu 20.04 più recente, ovvero l'immagine di Azure Marketplace o un'immagine personalizzata che si sta portando:

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160

    Usare la procedura descritta in Cercare immagini di Azure Marketplace per acquisire l'immagine della macchina virtuale.

Preparare lo script cloud-init

Per distribuire il runtime di IoT Edge nella macchina virtuale Ubuntu, usare uno script cloud-init durante la distribuzione della macchina virtuale.

Usare i passaggi in una delle sezioni seguenti:

Usare il provisioning di chiavi simmetriche

Per connettere il dispositivo a hub IoT senza DPS, seguire la procedura descritta in questa sezione per preparare uno script cloud-init per la pagina Avanzate di creazione della macchina virtuale per distribuire il runtime di IoT Edge e il runtime del contenitore nvidia.

  1. Usare un hub IoT esistente o creare un nuovo hub. Usare questi passaggi per creare un hub IoT.

  2. Seguire questa procedura per registrare il dispositivo Azure Stack Edge in hub IoT.

  3. Recuperare la stringa di Connessione primaria da hub IoT per il dispositivo e quindi incollarla nel percorso seguente per Device Connessione ionString.

Script cloud-init per il provisioning di chiavi simmetriche


#cloud-config

runcmd:
  - dcs="<DeviceConnectionString>"
  - |
      set -x
      (

        # Wait for docker daemon to start

        while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
          sleep 3
        done
        
        if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

          #install Nvidia drivers

          apt install -y ubuntu-drivers-common
         ubuntu-drivers devices
          ubuntu-drivers autoinstall

          # Install NVIDIA Container Runtime

          curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
          distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
          curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
          apt update
          apt install -y nvidia-container-runtime
        fi
        
        # Restart Docker

        systemctl daemon-reload
        systemctl restart docker

        # Install IoT Edge

        apt install -y aziot-edge

        if [ ! -z $dcs ]; then
          iotedge config mp --connection-string $dcs
          iotedge config apply
        fi
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi       ) &

apt:
  preserve_sources_list: true
  sources:
    msft.list:
      source: "deb https://packages.microsoft.com/ubuntu/20.04/prod focal main"
      key: |
        -----BEGIN PGP PUBLIC KEY BLOCK-----
        Version: GnuPG v1.4.7 (GNU/Linux)

        mQENBFYxWIwBCADAKoZhZlJxGNGWzqV+1OG1xiQeoowKhssGAKvd+buXCGISZJwT
        LXZqIcIiLP7pqdcZWtE9bSc7yBY2MalDp9Liu0KekywQ6VVX1T72NPf5Ev6x6DLV
        7aVWsCzUAF+eb7DC9fPuFLEdxmOEYoPjzrQ7cCnSV4JQxAqhU4T6OjbvRazGl3ag
        OeizPXmRljMtUUttHQZnRhtlzkmwIrUivbfFPD+fEoHJ1+uIdfOzZX8/oKHKLe2j
        H632kvsNzJFlROVvGLYAk2WRcLu+RjjggixhwiB+Mu/A8Tf4V6b+YppS44q8EvVr
        M+QvY7LNSOffSO6Slsy9oisGTdfE39nC7pVRABEBAAG0N01pY3Jvc29mdCAoUmVs
        ZWFzZSBzaWduaW5nKSA8Z3Bnc2VjdXJpdHlAbWljcm9zb2Z0LmNvbT6JATUEEwEC
        AB8FAlYxWIwCGwMGCwkIBwMCBBUCCAMDFgIBAh4BAheAAAoJEOs+lK2+EinPGpsH
        /32vKy29Hg51H9dfFJMx0/a/F+5vKeCeVqimvyTM04C+XENNuSbYZ3eRPHGHFLqe
        MNGxsfb7C7ZxEeW7J/vSzRgHxm7ZvESisUYRFq2sgkJ+HFERNrqfci45bdhmrUsy
        7SWw9ybxdFOkuQoyKD3tBmiGfONQMlBaOMWdAsic965rvJsd5zYaZZFI1UwTkFXV
        KJt3bp3Ngn1vEYXwijGTa+FXz6GLHueJwF0I7ug34DgUkAFvAs8Hacr2DRYxL5RJ
        XdNgj4Jd2/g6T9InmWT0hASljur+dJnzNiNCkbn9KbX7J/qK1IbR8y560yRmFsU+
        NdCFTW7wY0Fb1fWJ+/KTsC4=
        =J6gs
        -----END PGP PUBLIC KEY BLOCK----- 
packages:
  - moby-cli
  - moby-engine
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

Usare dps

Usare la procedura descritta in questa sezione per connettere il dispositivo a DPS e IoT Central. Si preparerà un file script.sh per distribuire il runtime di IoT Edge durante la creazione della macchina virtuale.

  1. Usare la hub IoT esistente e il servizio Device Provisioning oppure creare un nuovo hub IoT.

  2. Passare alla risorsa dps e creare una registrazione singola. 

    1. Passare a Servizio>Device Provisioning Gestire le registrazioni>Aggiungi registrazione singola.
    2. Assicurarsi che la selezione per Chiave simmetrica per il tipo di attestazione e il dispositivo IoT Edge sia True. La selezione predefinita è False.
    3. Recuperare le informazioni seguenti dalla pagina della risorsa DPS:
      • ID registrazione. È consigliabile usare lo stesso ID dell'ID dispositivo per il hub IoT.
      • Ambito ID disponibile nel menu Panoramica.
      • Chiave di firma di accesso condiviso primaria dal menu Registrazione singola.
  3. Copiare e incollare valori da hub IoT (IDScope) e DPS (RegistrationID, Symmetric Key) negli argomenti dello script.

Script cloud-init per il servizio Device Provisioning di hub IoT


#cloud-config

runcmd:
    - dps_idscope="<DPS IDScope>"
    - registration_device_id="<RegistrationID>"
    - key="<Symmetric Key>"
    - |
      set -x
      (
      
      wget https://github.com/Azure/iot-edge-config/releases/latest/download/azure-iot-edge-installer.sh -O azure-iot-edge-installer.sh \
      && chmod +x azure-iot-edge-installer.sh \
      && sudo -H ./azure-iot-edge-installer.sh -s $dps_idscope -r $registration_device_id -k $key \
      && rm -rf azure-iot-edge-installer.sh
      
      # Wait for docker daemon to start

      while [ $(ps -ef | grep -v grep | grep docker | wc -l) -le 0 ]; do 
        sleep 3
      done

      systemctl stop aziot-edge

      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then

        #install Nvidia drivers

        apt install -y ubuntu-drivers-common
        ubuntu-drivers devices
        ubuntu-drivers autoinstall

        # Install NVIDIA Container Runtime

        curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | apt-key add -
        distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
        curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | tee /etc/apt/sources.list.d/nvidia-container-runtime.list
        apt update
        apt install -y nvidia-container-runtime
      fi

      # Restart Docker

      systemctl daemon-reload
      systemctl restart docker

      systemctl start aziot-edge    
      if [ $(lspci | grep NVIDIA | wc -l) -gt 0 ]; then      
         reboot
      fi
      ) &
write_files:
  - path: /etc/systemd/system/docker.service.d/override.conf
    permissions: "0644"
    content: |
      [Service]
      ExecStart=
      ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime --log-driver local

Distribuire il runtime di IoT Edge

La distribuzione del runtime di IoT Edge fa parte della creazione di macchine virtuali usando lo script cloud-init indicato in precedenza.

Ecco i passaggi generali per distribuire la macchina virtuale e il runtime di IoT Edge:

  1. Acquisire l'immagine della macchina virtuale Ubuntu da Azure Marketplace. Per i passaggi dettagliati, seguire le istruzioni in Usare l'immagine di Azure Marketplace per creare un'immagine di macchina virtuale per Azure Stack Edge.

    1. Nel portale di Azure passare ad Azure Marketplace.
    2. Connessione ad Azure Cloud Shell o a un client con l'interfaccia della riga di comando di Azure installata. Per i passaggi dettagliati, vedere Avvio rapido per Bash in Azure Cloud Shell.

    Nota

    La chiusura della sessione della shell eliminerà tutte le variabili create durante la sessione della shell. La riapertura della sessione richiederà la ricreazione delle variabili.

    c. Eseguire il comando seguente per impostare la sottoscrizione.

    az account set –subscription <subscription id>
    
  2. Usare la procedura descritta in Cercare immagini di Azure Marketplace per cercare un'immagine Ubuntu 20.04 LTS in Azure Marketplace.

    Esempio di immagine Ubuntu 20.04 LTS:

    $urn = Canonical:0001-com-ubuntu-server-focal:20_04-lts:20.04.202007160
    
  3. Creare un nuovo disco gestito dall'immagine del Marketplace. Per informazioni dettagliate, vedere Usare l'immagine di Azure Marketplace per creare un'immagine di macchina virtuale per Azure Stack Edge.

  4. Esportare un disco rigido virtuale dal disco gestito in un account Archiviazione di Azure. Per i passaggi dettagliati, vedere Esportare un disco rigido virtuale dal disco gestito in Archiviazione di Azure.

  5. Seguire questa procedura per creare una macchina virtuale Ubuntu usando l'immagine della macchina virtuale.

    1. Specificare lo script cloud-init nella scheda Avanzate. Per creare una macchina virtuale, vedere Distribuire una macchina virtuale GPU tramite portale di Azure o Distribuire una macchina virtuale tramite portale di Azure.

      Screenshot of the Advanced tab of VM configuration in the Azure portal.

    2. Specificare i stringa di connessione del dispositivo appropriati in cloud-init per connettersi al dispositivo hub IoT o DPS. Per i passaggi dettagliati, vedere Effettuare il provisioning con chiavi simmetriche o Effettuare il provisioning con hub IoT DPS.

      Screenshot of the Custom data field of VM configuration in the Azure portal.

Se non è stato specificato cloud-init durante la creazione della macchina virtuale, sarà necessario distribuire manualmente il runtime di IoT Edge dopo la creazione della macchina virtuale:

  1. Connessione alla macchina virtuale tramite SSH.
  2. Installare il motore del contenitore nella macchina virtuale. Per i passaggi dettagliati, vedere Creare ed effettuare il provisioning di un dispositivo IoT Edge in Linux usando chiavi simmetriche o Avvio rapido : Configurare hub IoT DPS con il portale di Azure.

Verificare il runtime di IoT Edge

Usare questi passaggi per verificare che il runtime di IoT Edge sia in esecuzione.

  1. Passare a hub IoT risorsa nel portale di Azure.

  2. Selezionare il dispositivo IoT Edge.

  3. Verificare che il runtime di IoT Edge sia in esecuzione.

    Screenshot of the IoT Edge runtime status in the Azure portal.

    Per risolvere i problemi relativi alla configurazione del dispositivo IoT Edge, vedere Risolvere i problemi del dispositivo IoT Edge.

Aggiornare il runtime IoT Edge

Per aggiornare la macchina virtuale, seguire le istruzioni riportate in Aggiornare IoT Edge. Per trovare la versione più recente di Azure IoT Edge, fare riferimento alle versioni di Azure IoT Edge.

Passaggi successivi

Per distribuire ed eseguire un modulo IoT Edge nella macchina virtuale Ubuntu, vedere la procedura descritta in Distribuire moduli IoT Edge.

Per distribuire il modulo DeepStream di Nvidia, vedere Distribuire il modulo Nvidia DeepStream nella macchina virtuale Ubuntu in Azure Stack Edge Pro con GPU.

Per distribuire NVIDIA DIGITS, vedere Abilitare una GPU in un modulo NVIDIA prefabricato.