Azure - 托管磁盘,如何创建快照

时间:2017-02-18 19:48:43

标签: azure azure-storage

我有使用存储帐户和磁盘部署VM的应用程序,我想将其转换为使用托管磁盘 - 因为这是Azure存储的未来。我正在寻找REST API - 我错过了两件事: 1.如何从现有托管磁盘创建快照,有一个API可以创建快照,但它是空的或者是旧的非托管的 2.我可以选择创建磁盘的lun吗?

2 个答案:

答案 0 :(得分:3)

  
    
        
  1. 如何从现有托管磁盘创建快照,有一个用于创建快照的API,但它是空的,或者来自旧的非托管
  2.        

根据您的描述,我创建了一个测试演示来创建现有托管磁盘(操作系统磁盘)的快照,它运行良好。 我创建一个Windows VM并使用托管磁盘作为操作系统磁盘,然后创建另一个托管磁盘并将其添加到VM。

结果如下: enter image description here 如果您想创建现有托管磁盘的快照(它有数据),我建议您可以将请求发送到以下网址。

SELECT COUNT(*) FROM Contact c 
GROUP BY c.ContactId, c.FirstName, c.LastName
HAVING COUNT(*) >1

更多细节,您可以参考以下C#代码:

json.txt:

Url: https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/snapshots/{snapshotName}?api-version={api-version}

Method: PUT

Parameter:
subscriptionId  The identifier of your subscription where the snapshot is being created.
resourceGroup   The name of the resource group that will contain the snapshot.
snapshotName    The name of the snapshot that is being created. The name can’t be changed after the snapshot is created. Supported characters for the name are a-z, A-Z, 0-9 and _. The max name length is 80 characters.
api-version The version of the API to use. The current version is 2016-04-30-preview.

Request content:
{
  "properties": {
    "creationData": {
      "createOption": "Copy",
      "sourceUri": "/subscriptions/{subscriptionId}/resourceGroups/{YourResourceGroup}/providers/Microsoft.Compute/disks/{YourManagedDiskName}"
    }
  },
  "location": "eastasia"
}

代码:

{
  "properties": {
    "creationData": {
      "createOption": "Copy",
      "sourceUri": "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/BrandoSecondTest/providers/Microsoft.Compute/disks/BrandoTestVM"
    }
  },
  "location": "eastasia"
}

结果: enter image description here

  
    
        
  1. 我可以选择创建磁盘的lun吗?
  2.        

您是否想要使用azuredeploy选择磁盘的LUN?

如果您的意见如此,我建议您参考json示例,了解如何构建VM的部署内容并选择其LUN。

更多细节,您可以参考下面的deploymentTemplate Json(部分):

static void Main(string[] args)
        {
            string body = File.ReadAllText(@"D:\json.txt");
            // Display the file contents to the console. Variable text is a string.
            string tenantId = "xxxxxxxxxxxxxxxxxxxxxxxx";
            string clientId = "xxxxxxxxxxxxxxxxxxxxxxxx";
            string clientSecret = "xxxxxxxxxxxxxxxxxxxx";
            string authContextURL = "https://login.windows.net/" + tenantId;
            var authenticationContext = new AuthenticationContext(authContextURL);
            var credential = new ClientCredential(clientId, clientSecret);
            var result = authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/", clientCredential: credential).Result;
            if (result == null)
            {
               throw new InvalidOperationException("Failed to obtain the JWT token");
            }
            string token = result.AccessToken;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://management.azure.com/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/xxxxxxxxxxxxxxxx/providers/Microsoft.Compute/snapshots/BrandoTestVM_snapshot2?api-version=2016-04-30-preview");
            request.Method = "PUT";
            request.Headers["Authorization"] = "Bearer " + token;
            request.ContentType = "application/json";

            try
            {
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(body);
                    streamWriter.Flush();
                    streamWriter.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            //Get the response
           var httpResponse = (HttpWebResponse)request.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                Console.WriteLine(streamReader.ReadToEnd());
            }

            Console.ReadLine();
        }

更多详细信息,您可以参考以下链接: 201-vm-dynamic-data-disks-selection/azuredeploy.json

答案 1 :(得分:0)

  1. 可以使用快照在同一资源组或不同资源组中创建新VM。
  2. 如果要创建VM位于不同的RG中,请确保位置相同。 Azure仅支持在同一位置。
  3. 快速拍摄操作系统磁盘 disks->点击os盘 - >创建快照   输入名称  选择必须在其中创建快照的资源组。  (如果RG不同,请确保位置相同)
  4. 创建快照后,根据需要更新以下命令并从终端运行(Azure cli - ref:[link] [1])。
  5. 提供订阅subscriptionId = 88888-8888-888888-8888-8888888

    的订阅ID

    提供资源组的名称

    resourceGroupName = RG_name

    提供将用于创建托管磁盘的快照的名称(这是在上一步中创建的)

    snapshotName = OSDISK_snapshot

    提供将要创建的托管磁盘的名称

    osDiskName = MY_OSDISK

    以GB为单位提供磁盘大小。它应该大于VHD文件大小。

    diskSize = 30

    提供托管磁盘的存储类型。 Premium_LRS或Standard_LRS。 storageType = Premium_LRS

    将上下文设置为将在其中创建托管磁盘的订阅ID

    az帐户集--subscription $ subscriptionId

    获取快照标识

    snapshotId = $(az snapshot show --name $ snapshotName --resource-group $ resourceGroupName --query [id] -o tsv)

    az disk create -n $ osDiskName -g $ resourceGroupName --size-gb $ diskSize --sku $ storageType --source $ snapshotId

    • 上述命令将在RG中创建托管磁盘。
    • 从RG下的列表中选择已创建的磁盘,然后单击“创建VM”。
    • 输入名称,选择RG,选择尺寸....然后单击“创建”。
    • 确保NSG具有所有可用的inboud端口 Http - 80,ssh -22
    • 创建虚拟机后,从RG的资源列表中选择虚拟机。
    • 向下滚动到“运行命令”并运行以下命令,以防SSH和HTTP无法访问。     sudo服务apace2重启     sudo service ssh restart
    • 这应解决从浏览器和终端访问的问题。
    • incase ssh仍无效,请在命令下运行     rm / run / nologin 现在通过ssh从终端访问vm。