首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Azure中的自定义图像从一个订阅复制到另一个订阅

如何将Azure中的自定义图像从一个订阅复制到另一个订阅
EN

Stack Overflow用户
提问于 2019-04-16 12:20:09
回答 2查看 2.2K关注 0票数 0

我正在Azure上运行我的虚拟机,它由多个目录组成,每个目录中有2-3个订阅。我在默认订阅(例如“:BizSpark")下为基础设施环境创建了一个自定义映像。

我想将这个自定义映像复制到不同目录下的其他订阅中,这样这个映像就可以轻松地在我的Azure帐户中访问.

我正在跟踪这个链接:复制Michael S. Collier管理的图像,但是我被困在了这个片段中:

代码语言:javascript
复制
diskName=$(az vm show --resource-group linux -n vm --query "storageProfile.osDisk.name" -o tsv)

错误:

代码语言:javascript
复制
The Resource 'Microsoft.Compute/virtualMachines/vm' under resource group 'linux' was not found.

这方面的任何线索都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 13:37:11

对于托管磁盘或托管映像,您不能直接将其从一个订阅移动到另一个订阅,该订阅存在于中--另一个租户中。此错误可能表示您已连接到另一个租户。

如果原始托管磁盘存在,您可以将此博客转到在租户之间移动Azure托管磁盘

您可以创建托管磁盘的快照,并将其移动到源订阅中的存储帐户,然后将快照复制到目标订阅中的存储帐户,然后从快照中创建托管磁盘,然后再创建带有托管磁盘的VM。下面是PowerShell中的主要步骤。

A:将磁盘快照下载到存储帐户

代码语言:javascript
复制
$sourceSubscriptionId = ''
$sourceStorageAccountName = "SourceStorageAccount"
$sourceStorageAccountKey = "9O1...Kg=="
$sourceStorageAccountContainer = "containername"
# path of the download URL of the snapshot
$VHDDownloadUri = "https://....blob.core.windows.net/..."
$targetSnapshotName = "snapshot.vhd"
#download snapshot to StorageAccount-Source (the storage account is located in the source subscription)
Select-AzureRmSubscription -SubscriptionId $sourceSubscriptionId
$sourceStorageAccountContext = New-AzureStorageContext –StorageAccountName $sourceStorageAccountName -StorageAccountKey $sourceStorageAccountKey
Start-AzureStorageBlobCopy -AbsoluteUri $VHDDownloadUri -DestContainer $sourceStorageAccountContainer -DestContext $sourceStorageAccountContext -DestBlob $targetSnapshotName

B:将快照复制到另一个租户的目标订阅中的存储帐户:

代码语言:javascript
复制
$destSubscriptionId = ''
$destStorageAccount = "DestStorageAccount"
$destStorageAccountKey = "Pqn.../Q=="
$destStorageAccountContainer = "container"
Select-AzureRmSubscription -SubscriptionId $destSubscriptionId
$destStorageAccountContext = New-AzureStorageContext –StorageAccountName $destStorageAccount -StorageAccountKey $destStorageAccountKey
Get-AzureStorageBlobCopyState -Context $destStorageAccountContext -Blob $targetSnapshotName
$blobCopy = Start-AzureStorageBlobCopy -DestContainer $destStorageAccountContainer -DestContext $destStorageAccountContext -SrcBlob $targetSnapshotName -Context $sourceStorageAccountContext -SrcContainer $sourceStorageAccountContainer
Write-Host ($blobCopy | Get-AzureStorageBlobCopyState).CopyId
Write-Host ($blobCopy | Get-AzureStorageBlobCopyState).TotalBytes
Write-Host ($blobCopy | Get-AzureStorageBlobCopyState).BytesCopied
while(($blobCopy | Get-AzureStorageBlobCopyState).Status -eq "Pending")
{
    Start-Sleep -s 5
    #$blobCopy | Get-AzureStorageBlobCopyState
    $output = "`r" + ($blobCopy | Get-AzureStorageBlobCopyState).BytesCopied
    Write-Host $output -NoNewline
}
The copy process runs asynchronous. If you need to stop the copy process, get the CopyId and use the Stop-AzureStorageBlogCopy command: Stop-AzureStorageBlobCopy -Container $destStorageAccountContainer -Blob $targetSnapshotName -CopyId "<GUID>" -Context $destStorageAccountContext

C:创建一个新的VM并使用来自DestStorageAccount的snapshot.vhd作为托管磁盘的基本映像:

代码语言:javascript
复制
$rgName = "DestResourceGroup"
$location = "northeurope"
$storageName = "MyVMstorage"
$storageType = "Standard_LRS"
$nicname = "MyVM-nic"
$subnet1Name = "MyVM-subnet"
$vnetName = "MyVM-vnet"
$vnetAddressPrefix = "10.0.0.0/16"
$vnetSubnetAddressPrefix = "10.0.0.0/24"
$vmName = "MyVM"
$vmSize = "Standard_D2s_v3"
$osDiskName = $vmName + "osDisk"
$osDiskUri = "https://deststorageaccount.blob.core.windows.net/container/snapshot.vhd"
$storageacc = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $location
$pip = New-AzureRmPublicIpAddress -Name $nicname -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic
$subnetconfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnet1Name -AddressPrefix $vnetSubnetAddressPrefix
$vnet = New-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $location -AddressPrefix $vnetAddressPrefix -Subnet $subnetconfig
$nic = New-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $rgName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
$discStorageAcc = Get-AzureRmStorageAccount -ResourceGroupName $ResourceGroup -Name $destStorageAccount
$diskConfig = New-AzureRmDiskConfig -AccountType 'PremiumLRS' -Location $location -CreateOption Import -StorageAccountId ($discStorageAcc.Id) -SourceUri $osDiskUri
$disk = New-AzureRmDisk -Disk $diskConfig -ResourceGroupName $rgName -DiskName "managedsnapshot"
$vm = Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $disk.Id -CreateOption Attach -Windows
New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vm -Verbose
票数 1
EN

Stack Overflow用户

发布于 2019-04-16 12:23:46

第一个命令只检索磁盘名,所以如果您知道磁盘名,就不必运行它。只要做:

代码语言:javascript
复制
diskName="diskname_goes_here"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55708020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档