Azure HyperVGeneration V2虚拟机创建



我希望使用node/Javascript SDK for Azure来启动虚拟机。到目前为止,我对我的代码很满意,它基本上如预期的那样工作。然而,我想升级第2代/Hypervv2虚拟机,而不是默认的v1。以下是我的代码片段:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      HyperVGeneration: 'V2',
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18.04-LTS', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

我遇到的问题是:

HyperVGeneration: 'V2'

因为它似乎根本不适用。我也没有得到任何错误,只是创建了一个V1虚拟机。Azure文档在这里有点欠缺:https://learn.microsoft.com/en-us/javascript/api/@azure/arm计算/超级生成?view=azure节点最新我还尝试了其他参数,如HyperVGenerationType/Types,结果相同。

我想通了!

我在这里做了一个错误的假设。不是将VM生成/HyperVGeneration配置为V2,而是以某种方式使用第2代映像sku将操作系统磁盘作为基础,自动将VM生成配置为V2。MS用多个名称调用同一个东西也于事无补:VM生成、HyperV生成、映像生成。

无论如何,解决方案是实际查找所有可以安装的可用映像,并从中选择正确的映像。要获得您所在地区的可用图像:

az vm image list --all --publisher 'Canonical' --sku '18_04' --output table

返回类似于:

Offer                                         Publisher    Sku                           Urn                                                                                          Version
--------------------------------------------  -----------  ----------------------------  -------------------------------------------------------------------------------------------  ---------------
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04                         Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04:18.04.20210309                  18.04.20210309
0001-com-ubuntu-confidential-vm-experimental  Canonical    18_04-gen2                    Canonical:0001-com-ubuntu-confidential-vm-experimental:18_04-gen2:18.04.20210309             18.04.20210309
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200318                              18.04.20200318
0001-com-ubuntu-pro-advanced-sla              Canonical    18_04                         Canonical:0001-com-ubuntu-pro-advanced-sla:18_04:18.04.20200605                              18.04.20200605
...

另一件值得注意的事情是,一些Ubuntu映像的sku为";18.04〃;以及一些";18_04";这进一步混淆了事物。

最终的解决方案是使用这个片段将其放在一起:

return new Promise((resolve, reject) => {
    let resourceClient = new ComputeManagementClient(credentials, azureSubscriptionID);
    resourceClient.virtualMachines.createOrUpdate(reourceGroup, name, {
      location: location,
      osProfile: { computerName: name, adminUsername: 'admin', adminPassword: adminPassword, customData: Buffer.from(prepScript).toString('base64') },
      hardwareProfile: { vmSize: 'Standard_B2s' },
      storageProfile: {
        imageReference: { publisher: 'Canonical', offer: 'UbuntuServer', sku: '18_04-lts-gen2', version: 'latest' },
        osDisk: { name: name + '-disk', createOption: 'FromImage' }
      },
      networkProfile: {
        networkInterfaces: [{ id: nic.id, primary: true }]
      }
    }, function (err, result) {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  }

注意图像sku是18_04-lts-gen2而不是18.04-lts

最新更新