Azure HyperVGeneration V2 VM 创建
Azure HyperVGeneration V2 VM creation
我正在寻找使用 Azure 的 node/Javascript SDK 启动 VM。到目前为止,我的代码很幸运,它几乎按预期工作。但是我想启动第 2 代/HyperV v2 VM 而不是默认的 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 Docs:https://docs.microsoft.com/en-us/javascript/api/@azure/arm-compute/hypervgeneration?view=azure-node-latest
我还尝试了其他参数,例如 HyperVGenerationType / Types,结果相同。
我想通了!
我在这里的假设是错误的。不是将 VM generation/HyperVGeneration 配置为 V2,而是使用 gen2 映像 sku 以 OS 磁盘为基础,自动将 VM 生成也配置为 V2。这也无助于 MS 以多个名称调用同一事物:VM 生成、HyperV 生成、映像生成。
无论如何,解决方案是实际查找所有可以安装的可用映像,然后从中选择正确的映像。
要获取您所在地区的可用图片:
az vm image list --all --publisher 'Canonical' --sku '18_04' --output table
其中 returns 类似于:
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”,有些图像的 sku 为“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.
我正在寻找使用 Azure 的 node/Javascript SDK 启动 VM。到目前为止,我的代码很幸运,它几乎按预期工作。但是我想启动第 2 代/HyperV v2 VM 而不是默认的 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 Docs:https://docs.microsoft.com/en-us/javascript/api/@azure/arm-compute/hypervgeneration?view=azure-node-latest 我还尝试了其他参数,例如 HyperVGenerationType / Types,结果相同。
我想通了!
我在这里的假设是错误的。不是将 VM generation/HyperVGeneration 配置为 V2,而是使用 gen2 映像 sku 以 OS 磁盘为基础,自动将 VM 生成也配置为 V2。这也无助于 MS 以多个名称调用同一事物:VM 生成、HyperV 生成、映像生成。
无论如何,解决方案是实际查找所有可以安装的可用映像,然后从中选择正确的映像。 要获取您所在地区的可用图片:
az vm image list --all --publisher 'Canonical' --sku '18_04' --output table
其中 returns 类似于:
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”,有些图像的 sku 为“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.