从 Url 将 .vhd 作为 Page-Blob 上传到 azure-blob-storage

Posted

技术标签:

【中文标题】从 Url 将 .vhd 作为 Page-Blob 上传到 azure-blob-storage【英文标题】:Upload .vhd as Page-Blob to azure-blob-storage from Url 【发布时间】:2021-06-16 04:46:27 【问题描述】:

我有一堆 VHD 文件存储在私人服务器上,可以通过 url 访问。

我正在尝试使用 azure javascript npm 库将这些 vhd 文件直接上传到我的 azure 存储帐户。 vhd 必须作为页面 blob 上传。我尝试使用 pageblobClient 的方法 uploadPagesFromURL() 但没有成功。我的代码大致是这样的:

 async function uploadVHD(accessToken, srcUrl) 
 
     try 
         // Get credentials from accessToken
         const creds = new StorageSharedKeyCredential(storageAccount.name, storageAccount.key);
         // Get blobServiceClient
         const blobServiceClient = new BlobServiceClient(`https://$storageAccount.name.blob.core.windows.net`, creds);
    
         // Create Container
         const containerClient = blobServiceClient.getContainerClient("vhd-images");
         await containerClient.createIfNotExists();
    
         const src = srcUrl.replace('https://', 'https://username:password@');
           
         // Upload to blob storage
         const pageBlobClient = containerClient.getPageBlobClient("Test.vhd");
         // Get fileSize of vhd
         const fileSize = (await axiosRequest(src,  method: "HEAD" )).headers["content-length"];
         const uploadResponse = await pageBlobClient.uploadPagesFromURL(src, 0, 0, fileSize);
    
         return uploadResponse;
      catch (error) 
           
         return error;
     
 );

【问题讨论】:

uploadPagesFromURL 中的 url 是源 blob 的特定 URL。这意味着如果它是公开的,则 url 看起来像 https://myaccount.blob.core.windows.net/mycontainer/myblob,如果它不是公开的,则 url 看起来像 https://myaccount.blob.core.windows.net/mycontainer/myblob?sas-token。是否要上传与存储无关的url,例如i.stack.imgur.com/sc74e.png? 嘿@Pamela Peng 你附上的图片,当我查看它时是空白的,但我猜我理解你正确。是的,我要使用的 url 独立于存储,并使用用户名和密码的基本身份验证。 【参考方案1】:

不可能使用您的 URL 直接上传 Page Blob。您需要从 url 读取数据。然后使用uploadPages方法上传。

axios.get(URL, 
    responseType: 'arraybuffer'
  )
    .then((response) => 
        console.log(response.data)
        console.log(response.data.length)
        // upload page blob...
    ).catch((error) => 
      //handle error
    );

// uploadPages method
const uploadResponse = pageBlobClient.uploadPages(data, 0, dataLength);

【讨论】:

这适用于大文件吗?我正在下载的 vhd 可能非常大。 (>16GB) 恐怕时间会比较长,可能会返回异常。我们通常把大Blob用API,你可以参考sample。 我想我只需要尝试一下,时间“应该”不是太大的问题,我现在只是将超时设置得非常高,看看会发生什么。谢谢!

以上是关于从 Url 将 .vhd 作为 Page-Blob 上传到 azure-blob-storage的主要内容,如果未能解决你的问题,请参考以下文章

Bochs加载VHD文件作为主引导设备

Bochs加载VHD文件作为主引导设备

Bochs加载VHD文件作为主引导设备

虚拟磁盘VHD文件压缩方法

PVS架构之VHD虚拟磁盘

如何上传自定义的VHD镜像系统并创建虚拟机?