{"id":4214,"date":"2017-01-12T00:00:00","date_gmt":"2017-01-12T00:00:00","guid":{"rendered":""},"modified":"2025-07-03T12:25:45","modified_gmt":"2025-07-03T19:25:45","slug":"azure-virtual-machine-internals-part-2","status":"publish","type":"post","link":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/","title":{"rendered":"Azure Virtual Machine Internals \u2013 Part 2"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"continuation-from-part-1\">Continuation from Part 1<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In <a href=\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-1\/\">Azure Virtual Machine Internals Part 1<\/a> we created a vanilla Windows VM and spent some time poking under the covers and following the leads. In this part we will modify the VM that was created earlier.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"add-disk\">Add Disk<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm disk attach-new -g BlogRG -n BlogWindowsVM -z 60 -d newdatadisk -c ReadWrite -o blogrgdisks562 -r newdatadiskc\n\ninfo:    Executing command vm disk attach-new\n\n+ Looking up the VM \"BlogWindowsVM\"\n\n+ Looking up the storage account blogrgdisks562\n\ninfo:    New data disk location: https:\/\/blogrgdisks562.blob.core.windows.net\/newdatadiskc\/newdatadisk.vhd\n\n+ Updating VM \"BlogWindowsVM\"\n\ninfo:    vm disk attach-new command OK\n\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm show -g BlogRG -n BlogWindowsVM -d full --json\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Snippet below:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n{\n\n        \"lun\": 1,\n\n        \"name\": \"newdatadisk\",\n\n        \"vhd\": {\n\n          \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/newdatadiskc\/newdatadisk.vhd\"\n\n        },\n\n        \"caching\": \"ReadWrite\",\n\n        \"createOption\": \"Empty\",\n\n        \"diskSizeGB\": 60\n\n      }\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Note that the caching is by default set to readwrite \u2013 this means that in addition to read transactions, write transactions are cached and lazily flushed to durable storage. So if the VM fails for whatever reason before the data is flushed, data will be lost. The topic of data disks including&nbsp;<a href=\"https:\/\/blogs.msdn.microsoft.com\/windowsazurestorage\/2012\/06\/27\/exploring-windows-azure-drives-disks-and-images\/\">caching is discussed<\/a>. Set this option to a value that is appropriate for your application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At this stage you would have to RDP into the VM and initialize, partition and format the disk. This can be tedious for large number of VMs or disks. There is an example where you can use&nbsp;<a href=\"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2013\/05\/29\/use-powershell-to-initialize-raw-disks-and-to-partition-and-format-volumes\/\">automation<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"capture\">Capture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">RDP to the VM and sysprep, generalize, shutdown.<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp\" alt=\"graphical user interface, application\" class=\"wp-image-10180 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The VM shows as stopped in the Portal, as expected.<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/97988ee2-2d91-4198-afd7-5008077f5ede.webp\" alt=\"graphical user interface, text, application, email\" class=\"wp-image-10182 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/97988ee2-2d91-4198-afd7-5008077f5ede.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The warning about continuing to incur the compute charges is important. Azure charges customers for the usages VM incurs. Sticking to the core resources, VMs can independently incur Compute, Storage and Networking charges.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compute charge is incurred if a VM is provisioned. The charge is incurred even if VM is in \u2018stopped\u2019 state (as shown by the warning above) because Azure has still provisioned that VM slot for the customer. The only way to avoid incurring the compute charge is to stop-dellocate or to deprovision the VM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stop-deallocating a VM deallocates the VM slot so it could be allocated to another customer. However, the definition of the VM along with its state in disks is maintained so that the VM can be re-provisioned at customer\u2019s choice. While a Stop-deallocated VM will not accrue Compute charges, it will continue to accrue the Storage charges as the disks are not deleted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At this stage we have a generalized VM which means that the OS disk does not have the OS customizations were made when the VM was initially created including settings like locale, timezone, admin credentials, etc. Let\u2019s see what happens if we try to \u2018start\u2019 the stopped VM from portal. The \u2018start\u2019 operation does a simple power-start and does not take the VM thru its specialize sequence as part of provisioning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clicking \u2018Start\u2019 in Portal and after a few seconds the VM shows a \u2018Running\u2019. Try to RDP into it \u2013 RDP times out. Boot Diagnostics to rescue.<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/ee9b7115-de62-4700-b61a-f8c3de2322c7.webp\" alt=\"graphical user interface, application\" class=\"wp-image-10184 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/ee9b7115-de62-4700-b61a-f8c3de2322c7.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As expected, this VM has detected that its disk is generalized and is in the \u2018specialization\u2019 sequence waiting for customer input. This VM cannot be started successfully.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When we sysprep a VM and have generalized its disk, we have to follow thru with following management operations to realize a generalized image that can be used to create one or more new VMs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stop VM&nbsp;\u2013 powers down the VM<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm stop -g BlogRG -n BlogWindowsVM\n\ninfo:    Executing command vm stop\n\n+ Looking up the VM \"BlogWindowsVM\"\n\nwarn:    VM shutdown will not release the compute resources so you will be billed for the compute resources that this Virtual Machine uses.\n\ninfo:    To release the compute resources use \"azure vm deallocate\".\n\n+ Stopping the virtual machine \"BlogWindowsVM\"\n\ninfo:    vm stop command OK\n\nGeneralize \u2013 meta data change on the VM to mark it generalized\n\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm generalize -g BlogRG -n BlogWindowsVM\n\ninfo:    Executing command vm generalize\n\n+ Looking up the VM \"BlogWindowsVM\"\n\n+ Generalizing the virtual machine \"BlogWindowsVM\"\n\ninfo:    vm generalize command OK\n\nCapture \u2013\n\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm capture -g BlogRG -n BlogWindowsVM -p CaptureBlogWVM -R capturecontainer -t C:tempCaptureVMTemplate.json\n\ninfo:    Executing command vm capture\n\n+ Looking up the VM \"BlogWindowsVM\"\n\n+ Capturing the virtual machine \"BlogWindowsVM\"\n\ninfo:    Saved template to file \"C:tempCaptureVMTemplate.json\"\n\ninfo:    vm capture command OK\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The template generated can be used to create new VMs based on the generalized image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Looking at the storage profile of CaptureVMTemplate.json<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n\"storageProfile\": {\n\n          \"osDisk\": {\n\n            \"osType\": \"Windows\",\n\n            \"name\": \"CaptureBlogWVM-osDisk.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\",\n\n            \"createOption\": \"FromImage\",\n\n            \"image\": {\n\n              \"uri\": https:\/\/blogrgdisks562.blob.core.windows.net\/system\/Microsoft.Compute\/Images\/capturecontainer\/CaptureBlogWVM-osDisk.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Above is the URL of the generalized image that the capture operation has generated. You will notice that the image is a page blob VHD just like any other disk VHD. From the Visual Studio Cloud Explorer we can see the three captured VHDs for the OS data and two data disks. In storage terms they are blob snapshots of the disk page blobs. You will notice that the blob snapshots are in the same storage account as the original disks \u2013 blogrgdisks562<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/3c6c5b9f-27cf-4105-81cf-4a00d0037365.webp\" alt=\"graphical user interface, text, application, email\" class=\"wp-image-10186 webp-format\" data-orig-src=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/3c6c5b9f-27cf-4105-81cf-4a00d0037365.webp\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Looking at the detail of the generalized OS disk blob (using the command, node azure storage blob list -vv ) we will notice a few things:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n{\n\n    \"name\": \"Microsoft.Compute\/Images\/capturecontainer\/CaptureBlogWVM-osDisk.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\",\n\n    \"lastModified\": \"Sun, 21 Aug 2016 19:14:25 GMT\",\n\n    \"etag\": \"0x8D3C9F75DB60C73\",\n\n    \"contentLength\": \"136367309312\",\n\n    \"contentSettings\": {\n\n      \"contentType\": \"application\/octet-stream\",\n\n      \"contentEncoding\": \"\",\n\n      \"contentLanguage\": \"\",\n\n      \"contentMD5\": \"en7n+5uiKTbMlrhW59lEGg==\",\n\n      \"cacheControl\": \"\",\n\n      \"contentDisposition\": \"\"\n\n    },\n\n    \"sequenceNumber\": \"8\",\n\n    \"blobType\": \"PageBlob\",\n\n    \"lease\": {\n\n      \"status\": \"unlocked\",\nThis is a generalized image and as such unlocked with no outstanding lease\n\n      \"state\": \"available\"\n\n    },\n\n    \"copy\": {\n\n      \"id\": \"b069a713-599d-44ad-85d0-e7e255f9a92c\",\n\n      \"progress\": \"136367309312\/136367309312\",\n\n      \"bytesCopied\": 136367309312,\n\n      \"totalBytes\": 136367309312,\n\n      \"source\": https:\/\/blogrgdisks562.blob.core.windows.net\/vhds\/BlogWindowsVM20167132\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">This is the source blob which is still the OS disk on the stopped VM, BlogWindowsVM. By following the copy trail, you can trace how the blobs are getting copied. BTW, the source blob still has an infinite lease (not shown here) against it since it is attached as a disk to a VM.<br><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n\"status\": \"success\",\n\n      \"completionTime\": \"Sun, 21 Aug 2016 19:14:25 GMT\"\n\n    },\n\n    \"metadata\": {\n\n      \"microsoftazurecompute_capturedvmkey\": \"\/Subscriptions\/f028f547-f912-42b0-8892-89ea6eda4c5e\/ResourceGroups\/BLOGRG\/VMs\/BLOGWINDOWSVM\",\n\n      \"microsoftazurecompute_imagetype\": \"OSDisk\",\n\n      \"microsoftazurecompute_osstate\": \"Generalized\",\n\n      \"microsoftazurecompute_ostype\": \"Windows\"\n\n    }\n\n  }\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Continuation of the capture template json-<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n },\n\n            \"vhd\": {\n\n              \"uri\": https:\/\/blogrgdisks562.blob.core.windows.net\/vmcontainerb05604df-5f0f-4ef2-ab18-76ab7b644cfd\/osDisk.b05604df-5f0f-4ef2-ab18-76ab7b644cfd.vhd\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The Vhd URI as mentioned above does not exist yet. It will be created when this template is deployed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you intend to create multiple VMs using this template then the VHD uri will have to be changed to be unique from the second VM onwards.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\n},\n\n            \"caching\": \"ReadWrite\"\n\n          },\n\n          \"dataDisks\": [\n\n            {\n\n              \"lun\": 0,\n\n              \"name\": \"CaptureBlogWVM-dataDisk-0.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\",\n\n              \"createOption\": \"FromImage\",\n\n              \"image\": {\n\n                \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/system\/Microsoft.Compute\/Images\/capturecontainer\/CaptureBlogWVM-dataDisk-0.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\"\n\n              },\n\n              \"vhd\": {\n\n                \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/vmcontainerb05604df-5f0f-4ef2-ab18-76ab7b644cfd\/dataDisk-0.b05604df-5f0f-4ef2-ab18-76ab7b644cfd.vhd\"\n\n              },\n\n              \"caching\": \"ReadWrite\"\n\n            },\n\n            {\n\n              \"lun\": 1,\n\n              \"name\": \"CaptureBlogWVM-dataDisk-1.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\",\n\n              \"createOption\": \"FromImage\",\n\n              \"image\": {\n\n                \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/system\/Microsoft.Compute\/Images\/capturecontainer\/CaptureBlogWVM-dataDisk-1.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\"\n\n              },\n\n              \"vhd\": {\n\n                \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/vmcontainerb05604df-5f0f-4ef2-ab18-76ab7b644cfd\/dataDisk-1.b05604df-5f0f-4ef2-ab18-76ab7b644cfd.vhd\"\n\n              },\n\n              \"caching\": \"ReadWrite\"\n\n            }\n\n          ]\n\n        },\nAt this point of time, the original VM is stopped but still accumulating usage charges for Compute and Storage. If we intend to leave the VM stopped for a length of time, we can save on the Compute charges by stop deallocating the VM \u2013 it will deallocate the VM on the Hyper-V host but retains the VM meta-data and the disk blobs in Storage.\n\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm deallocate -g BlogRG -n BlogWindowsVM\n\ninfo:    Executing command vm deallocate\n\n+ Looking up the VM \"BlogWindowsVM\"\n\n+ Deallocating the virtual machine \"BlogWindowsVM\"\n\ninfo:    vm deallocate command OK\n\nget-instance-view command will show the VM status as deallocated (snippets of result below)\n\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure vm get-instance-view -g blogrg -n blogwindowsvm \u2013json\n\n    \"osDisk\": {\n\n      \"osType\": \"Windows\",\n\n      \"name\": \"BlogWindowsVM\",\n\n      \"vhd\": {\n\n        \"uri\": https:\/\/blogrgdisks562.blob.core.windows.net\/vhds\/BlogWindowsVM2016713231120.vhd\nEven when the VM is stop-deallocated, the OS and data disks are retained\n\n      },\n\n      \"caching\": \"ReadWrite\",\n\n      \"createOption\": \"FromImage\"\n\n    },\n\n    \"dataDisks\": [\n\n      {\n\n        \"lun\": 0,\n\n        \"name\": \"BlogWindowsVM-20160814-191501427\",\n\n        \"vhd\": {\n\n          \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/vhds\/BlogWindowsVM-20160814-191501427.vhd\"\n\n        },\n\n        \"caching\": \"ReadWrite\",\n\n        \"createOption\": \"Empty\",\n\n        \"diskSizeGB\": 50\n\n      },\n\n      {\n\n        \"lun\": 1,\n\n        \"name\": \"newdatadisk\",\n\n        \"vhd\": {\n\n          \"uri\": \"https:\/\/blogrgdisks562.blob.core.windows.net\/newdatadiskc\/newdatadisk.vhd\"\n\n         },\n\n        \"caching\": \"ReadWrite\",\n\n        \"createOption\": \"Empty\",\n\n        \"diskSizeGB\": 60\n\n      }\n\n    ]\n\n\n---\n\n---\n\n    \"statuses\": [\n\n      {\n\n        \"code\": \"ProvisioningState\/succeeded\",\n\n        \"level\": \"Info\",\n\n        \"displayStatus\": \"Provisioning succeeded\",\n\n        \"time\": \"2016-08-22T02:58:42.797Z\"\n\n      },\n\n      {\n\n        \"code\": \"OSState\/generalized\",\n\n        \"level\": \"Info\",\n\n        \"displayStatus\": \"VM generalized\"\nOS is generalized, so this VM can be recreated by specializing it\n\n      },\n\n      {\n\n        \"code\": \"PowerState\/deallocated\",\n\n        \"level\": \"Info\",\n\n        \"displayStatus\": \"VM deallocated\"\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Compute VM resources are deallocated<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even when a VM is deallocated, its disk storage blobs are still locked like when the VM was running. This is to prevent them from being accidentally deleted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Looking at the blob properties of the disk blob you will notice that Azure continues to maintain an infinite lease on the blob.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure storage blob list -vv\n\nname: 'BlogWindowsVM-20160814-191501427.vhd',\n\nlastModified: 'Sun, 21 Aug 2016 19:10:50 GMT',\n\netag: '0x8D3C9F6DD886DB5',\n\ncontentLength: '53687091712',\n\ncontentSettings: {\n\n    contentType: 'application\/octet-stream',\n\n    contentEncoding: '',\n\n    contentLanguage: '',\n\n    contentMD5: '',\n\n    cacheControl: '',\n\n    contentDisposition: ''\n\n},\n\nsequenceNumber: '1',\n\nblobType: 'PageBlob',\n\nlease: {\n\n    status: 'locked',\n\n    state: 'leased',\n\n    duration: 'infinite'\n\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"cloning-vms\">Cloning VMs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At this point of time we can clone VMs from the generalized image that we captured. We can either use the capture template json or create a new image using the FromImage option with the generalized image as the parameter value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I grabbed a template from Azure Quickstart templates and modified it just enough and deployed it to create a new VM of name CopyBlogVM.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nC:Program Files (x86)Microsoft SDKsAzureCLIbin>node azure group deployment create -g BlogRG -n CopyVMDeployment -f \"C:tempcopyvmtemplatetemplate.json\" -e \"C:tempcopyvmtemplateparameters.json\"\n\ninfo:    Executing command group deployment create\n\n+ Initializing template configurations and parameters\n\n+ Creating a deployment\n\ninfo:    Created template deployment \"CopyVMDeployment\"\n\n+ Waiting for deployment to complete\n\n+\n\nThe relevant snippet from the VM template is the storage profile:\n\n\"storageProfile\": {\n\n\"osDisk\": {\n\n\"name\": \"[concat(parameters('virtualMachineName'),'-osDisk')]\",\n\n\"osType\": \"[parameters('osType')]\",\n\n\"caching\": \"ReadWrite\",\n\n\"createOption\": \"fromImage\",\n\nimage\": {\n\n\"uri\": \"[parameters('osDiskVhdUri')]\"\n\n},\n\n\"vhd\": {\n\n\"uri\": \"[concat(concat(reference(resourceId('blogrg', 'Microsoft.Storage\/storageAccounts', parameters('storageAccountName')), '2015-06-15').primaryEndpoints['blob'], 'vhds\/'), parameters('virtualMachineName'), '20161228010921.vhd')]\"\n\n}\n\n},\n\n\"dataDisks\": []\n\n},\nThe OsDiskvhdUri is set in the parameters file to the generalized image file\n\n\"osDiskVhdUri\": {\n\n\"value\": https:\/\/blogrgdisks562.blob.core.windows.net\/system\/Microsoft.Compute\/Images\/capturecontainer\/CaptureBlogWVM-osDisk.694733ec-46a0-4e0b-a73b-ee0863a0f12c.vhd\n\n},\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">The CopyBlogVM creates successfully with an OS disk that starts out as a copy of the generalized OS disk referred to by OsDiskvhdUri. Using the generalized OD disk as a template, any number of new VMs can be stamped out. A common scenario would be to capture a generalized VM with new updates\/patches and then create new VMs based on the updated image.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"in-conclusion\">In Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the two posts we have covered some of the details on how an Azure VM works under the covers. There are other capabilities that we have not covered including backup, encryption, licensing, planned maintenance and networking details. Time permitting,&nbsp;we will visit these topics in future posts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Peek under the covers of how an Azure VM works and get to know some of the internal details.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","footnotes":"","msx_community_cta_settings":[]},"categories":[1467],"tags":[],"audience":[3055,3053,3056],"content-type":[1511],"product":[],"tech-community":[],"topic":[],"coauthors":[1171],"class_list":["post-4214","post","type-post","status-publish","format-standard","hentry","category-compute","audience-developers","audience-it-decision-makers","audience-it-implementors","content-type-best-practices","review-flag-1680286581-295","review-flag-1680286581-364","review-flag-1-1680286581-825","review-flag-8-1680286581-263","review-flag-new-1680286579-546","review-flag-vm-1680286585-143"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog<\/title>\n<meta name=\"description\" content=\"Learn more about the Azure Virtual Machine internal elements when you modify a VM.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog\" \/>\n<meta property=\"og:description\" content=\"Learn more about the Azure Virtual Machine internal elements when you modify a VM.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Azure Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/microsoftazure\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-12T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-03T19:25:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png\" \/>\n<meta name=\"author\" content=\"Yunus Mohammed\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@azure\" \/>\n<meta name=\"twitter:site\" content=\"@azure\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yunus Mohammed\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\"},\"author\":[{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/yunus-mohammed\/\",\"@type\":\"Person\",\"@name\":\"Yunus Mohammed\"}],\"headline\":\"Azure Virtual Machine Internals \u2013 Part 2\",\"datePublished\":\"2017-01-12T00:00:00+00:00\",\"dateModified\":\"2025-07-03T19:25:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\"},\"wordCount\":964,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png\",\"articleSection\":[\"Compute\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\",\"name\":\"Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog\",\"isPartOf\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png\",\"datePublished\":\"2017-01-12T00:00:00+00:00\",\"dateModified\":\"2025-07-03T19:25:45+00:00\",\"description\":\"Learn more about the Azure Virtual Machine internal elements when you modify a VM.\",\"breadcrumb\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp\",\"contentUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp\",\"width\":513,\"height\":378,\"caption\":\"graphical user interface, application\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog home\",\"item\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Compute\",\"item\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/category\/compute\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Azure Virtual Machine Internals \u2013 Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#website\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\",\"name\":\"Microsoft Azure Blog\",\"description\":\"Get the latest Azure news, updates, and announcements from the Azure blog. From product updates to hot topics, hear from the Azure experts.\",\"publisher\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization\",\"name\":\"Microsoft Azure Blog\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp\",\"contentUrl\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp\",\"width\":512,\"height\":512,\"caption\":\"Microsoft Azure Blog\"},\"image\":{\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/microsoftazure\",\"https:\/\/x.com\/azure\",\"https:\/\/www.instagram.com\/microsoftdeveloper\/\",\"https:\/\/www.linkedin.com\/company\/16188386\",\"https:\/\/www.youtube.com\/user\/windowsazure\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/person\/c702e5edd662b328b49b7e1180cab117\",\"name\":\"shakir\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g7664e653ea371ce16eaf75e9fa8952c4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g\",\"caption\":\"shakir\"},\"sameAs\":[\"https:\/\/azure.microsoft.com\"],\"url\":\"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/shakir\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog","description":"Learn more about the Azure Virtual Machine internal elements when you modify a VM.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/","og_locale":"en_US","og_type":"article","og_title":"Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog","og_description":"Learn more about the Azure Virtual Machine internal elements when you modify a VM.","og_url":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/","og_site_name":"Microsoft Azure Blog","article_publisher":"https:\/\/www.facebook.com\/microsoftazure","article_published_time":"2017-01-12T00:00:00+00:00","article_modified_time":"2025-07-03T19:25:45+00:00","og_image":[{"url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png","type":"","width":"","height":""}],"author":"Yunus Mohammed","twitter_card":"summary_large_image","twitter_creator":"@azure","twitter_site":"@azure","twitter_misc":{"Written by":"Yunus Mohammed","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#article","isPartOf":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/"},"author":[{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/yunus-mohammed\/","@type":"Person","@name":"Yunus Mohammed"}],"headline":"Azure Virtual Machine Internals \u2013 Part 2","datePublished":"2017-01-12T00:00:00+00:00","dateModified":"2025-07-03T19:25:45+00:00","mainEntityOfPage":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/"},"wordCount":964,"commentCount":0,"publisher":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png","articleSection":["Compute"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/","name":"Azure Virtual Machine Internals \u2013 Part 2 | Microsoft Azure Blog","isPartOf":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.png","datePublished":"2017-01-12T00:00:00+00:00","dateModified":"2025-07-03T19:25:45+00:00","description":"Learn more about the Azure Virtual Machine internal elements when you modify a VM.","breadcrumb":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#primaryimage","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp","contentUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2017\/01\/141ddd5b-c3bd-4e96-aa52-6865eee5386a.webp","width":513,"height":378,"caption":"graphical user interface, application"},{"@type":"BreadcrumbList","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/azure-virtual-machine-internals-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog home","item":"https:\/\/azure.microsoft.com\/en-us\/blog\/"},{"@type":"ListItem","position":2,"name":"Compute","item":"https:\/\/azure.microsoft.com\/en-us\/blog\/category\/compute\/"},{"@type":"ListItem","position":3,"name":"Azure Virtual Machine Internals \u2013 Part 2"}]},{"@type":"WebSite","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#website","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/","name":"Microsoft Azure Blog","description":"Get the latest Azure news, updates, and announcements from the Azure blog. From product updates to hot topics, hear from the Azure experts.","publisher":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/azure.microsoft.com\/en-us\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#organization","name":"Microsoft Azure Blog","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp","contentUrl":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-content\/uploads\/2024\/06\/microsoft_logo.webp","width":512,"height":512,"caption":"Microsoft Azure Blog"},"image":{"@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/microsoftazure","https:\/\/x.com\/azure","https:\/\/www.instagram.com\/microsoftdeveloper\/","https:\/\/www.linkedin.com\/company\/16188386","https:\/\/www.youtube.com\/user\/windowsazure"]},{"@type":"Person","@id":"https:\/\/azure.microsoft.com\/en-us\/blog\/#\/schema\/person\/c702e5edd662b328b49b7e1180cab117","name":"shakir","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g7664e653ea371ce16eaf75e9fa8952c4","url":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9342c7c05bb16548741bc5cd3a3e3b7ee0c8e746844ad2cc582db5beb5514c6f?s=96&d=mm&r=g","caption":"shakir"},"sameAs":["https:\/\/azure.microsoft.com"],"url":"https:\/\/azure.microsoft.com\/en-us\/blog\/author\/shakir\/"}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Azure Blog","distributor_original_site_url":"https:\/\/azure.microsoft.com\/en-us\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/4214","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/comments?post=4214"}],"version-history":[{"count":3,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/4214\/revisions"}],"predecessor-version":[{"id":44923,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/posts\/4214\/revisions\/44923"}],"wp:attachment":[{"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/media?parent=4214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/categories?post=4214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/tags?post=4214"},{"taxonomy":"audience","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/audience?post=4214"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/content-type?post=4214"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/product?post=4214"},{"taxonomy":"tech-community","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/tech-community?post=4214"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/topic?post=4214"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/azure.microsoft.com\/en-us\/blog\/wp-json\/wp\/v2\/coauthors?post=4214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}