如何用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
相关产品推荐
相关产品推荐

