You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python在Azure中获取磁盘VHD文件并创建VM

如何在Azure中找到并通过Python下载VHD文件

一、在Azure门户中查找VHD文件的位置

要找到VHD,得先区分你的磁盘是托管磁盘还是非托管磁盘,两者的存储逻辑和查找路径完全不同:

1. 非托管磁盘的VHD查找

非托管磁盘的VHD直接存在你自己创建的存储账户里,步骤如下:

  • 登录Azure门户,找到目标虚拟机,进入后切换到「磁盘」选项卡
  • 选中你要找的磁盘,进入磁盘详情页,在「概述」区域找到VHD URI字段(格式类似https://xxxstorage.blob.core.windows.net/your-container/mydisk.vhd)
  • 复制URI里的存储账户名和容器名,回到「存储账户」服务找到对应账户,进入后点击「容器」,找到URI里指定的容器(不一定是默认的vhds,可能是你自定义的名称),进去就能看到对应的VHD blob文件

2. 托管磁盘的VHD查找

托管磁盘的VHD由Azure后台托管的存储账户保存,你无法直接访问这个后台存储。如果需要获取VHD文件,必须先把托管磁盘导出到你自己的存储账户:

  • 进入托管磁盘的详情页,切换到「导出」选项卡
  • 选择你有权限的目标存储账户、填写容器名称,设置SAS令牌的过期时间
  • 点击「导出」,Azure会自动把托管磁盘的VHD复制到你指定的容器中,完成后就能在该容器里找到VHD文件

二、用Python下载VHD文件的正确方法

你之前用的blob_service.get_blob_to_path是旧版Azure存储SDK(azure-storage)的方法,现在官方已经停止维护旧版,推荐使用新版的azure-storage-blob SDK,下面是具体实现:

1. 先安装依赖包

确保安装最新版的SDK和身份认证包:

pip install azure-storage-blob azure-identity

2. 下载VHD的代码示例

提供两种常用的认证方式,按需选择:

方式1:使用存储账户连接字符串(快速测试用)

from azure.storage.blob import BlobServiceClient

# 替换为你的存储账户连接字符串
connection_string = "DefaultEndpointsProtocol=https;AccountName=你的存储账户名;AccountKey=你的存储账户密钥;EndpointSuffix=core.windows.net"
# 替换为容器名称和VHD文件名
container_name = "你的容器名"
vhd_blob_name = "目标VHD文件名.vhd"
# 替换为本地保存路径
local_save_path = "./本地保存的VHD文件.vhd"

# 初始化Blob服务客户端
blob_service_client = BlobServiceClient.from_connection_string(connection_string)
# 获取对应Blob的客户端
blob_client = blob_service_client.get_blob_client(container=container_name, blob=vhd_blob_name)

# 下载VHD到本地
with open(local_save_path, "wb") as local_file:
    local_file.write(blob_client.download_blob().readall())

print(f"VHD文件已成功下载到:{local_save_path}")

方式2:使用Azure AD身份认证(生产环境推荐)

无需暴露存储账户密钥,通过Azure AD身份权限访问:

from azure.storage.blob import BlobServiceClient
from azure.identity import DefaultAzureCredential

# 替换为你的存储账户URL
account_url = "https://你的存储账户名.blob.core.windows.net"
container_name = "你的容器名"
vhd_blob_name = "目标VHD文件名.vhd"
local_save_path = "./本地保存的VHD文件.vhd"

# 使用DefaultAzureCredential自动识别本地认证(比如Azure CLI登录、环境变量、托管身份等)
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(account_url, credential=credential)

blob_client = blob_service_client.get_blob_client(container=container_name, blob=vhd_blob_name)

# 分块下载(适合大体积VHD,避免内存占用过高)
with open(local_save_path, "wb") as local_file:
    download_stream = blob_client.download_blob(chunk_size=1024*1024*10)  # 10MB分块
    for chunk in download_stream.chunks():
        local_file.write(chunk)

print(f"VHD文件已成功下载到:{local_save_path}")

3. 解决你遇到的get_blob_to_path无效问题

如果一定要用旧版SDK,需要先安装对应版本:

pip install azure-storage==0.36.0

然后使用旧版代码:

from azure.storage.blob import BlockBlobService

block_blob_service = BlockBlobService(account_name='你的存储账户名', account_key='你的存储账户密钥')
block_blob_service.get_blob_to_path('你的容器名', '目标VHD文件名.vhd', './本地保存路径.vhd')

但还是强烈建议升级到新版SDK,旧版已经不再接收安全更新和功能迭代。

三、常见问题排查

  • 容器里找不到VHD:先确认磁盘类型,托管磁盘必须先导出;非托管磁盘要核对VHD URI里的存储账户和容器名是否正确
  • 下载提示权限不足:检查存储账户的访问控制,确保你的认证方式(连接字符串/AD身份)拥有该Blob的读取权限
  • 大VHD下载慢/内存溢出:使用新版SDK的分块下载功能,设置合适的chunk_size参数分块写入本地文件

内容的提问来源于stack exchange,提问作者Piyush Doke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:48:55