首先,在,只要你使用的不是提供的I/O密集型的高吞吐低延迟的服务,那么得益于Azure存储设计中采用的稀疏文件方式存储,存储虚拟机VHD的存储只会按照实际的写入数据的使用量进行付费,因此最佳实践就是建立VHD磁盘文件的时候就最好设置为1023GB,也就是 1TB大小。当然这里讨论的是使用单个磁盘的问题,不包括出于性能或者容量限制等问题采用多个VHD数据磁盘到Azure虚拟机中,并在上面构建软RAID解决方案的情况。
好的,如果最初创建虚拟机或之后挂载的数据磁盘没有根据最佳实践设置大小,后面发现要进行VHD扩展,那么你可能发现在Azure中做类似的操作并不容易,期初我们需要通过一个实现这个目的:
关闭虚拟机
下载VHD到本地
通过Hyper-V/PowerShell或者第三方工具调整VHD大小
删除或上传时将新的调整大小后的VHD传输到BLOB存储中
重新启动虚拟机
通过diskpart或作者fdisk或者磁盘管理工具调整分区大小
这是个工作量不小的工作,尤其是上传下载部分,即便是通过支持传输实际文件大小的工具如AZCOPY或者PowerShell Add-Vhd CMDLET;所以调整磁盘曾经是难以和用户说明白的一个问题。
现在,调整Azure虚拟机磁盘大小不再是个难题了,因为中现在提供了新的cmdlet支持调整磁盘大小,Update-AzureDisk,而唯一的限制仅仅是需要确保调整磁盘大小的虚拟机处于关闭和取消分配的状态。
另外,这里脑补一下,有可能在我们环境里面使用的虚拟机有多个虚拟机磁盘对应不同的分区,我们只需要对其中某个特定分区磁盘进行扩充,如果是这种情况究竟哪个VHD磁盘是我们需要调整的呢,一个偷懒的办法就是把所有的数据磁盘统统扩容上去,毕竟不是只按照实际使用收费吗,当然这样无不可;只是我觉得一个好的习惯就是在每次挂接Azure的数据磁盘时,都遵守一个好的命名规范,并且 给磁盘设置一个合理的能够说明用途的标签(Label),这样在调整的时候就能起到事半功倍的效果。
好的,现在为两个测试虚拟机创建数据磁盘,
首先确认连接了当前的Azure订阅,
Select-AzureSubscription -SubscriptionId { MySubscriptionId }Add-AzureAccount -Environment AzureChinaCloud
创建演示虚拟机对象,我们分别演示已经创建的Windows Server 2012 R2服务器和Linux Ubuntu 14.04 LTS虚拟机;
$winvm = Get-AzureVM -ServiceName shawnzhaidemocloud -name shzhaiwindemo$linuxvm = Get-AzureVM -ServiceName shawnzhaidemocloud -Name shzhailinuxdemo
设置数据磁盘信息并获取当前虚拟机存储账号信息并通过该信息创建数据磁盘,
function create-datadiskbaseuri { Param ( [Parameter(Mandatory=$true)] [string] $prefix, [Parameter(Mandatory=$true)] [Microsoft.WindowsAzure.Commands.ServiceManagement.Model.ServiceOperationContext] $VM ) $datadiskname= "$prefix"+"$(get-random)" $osdisk= Get-AzureOSDisk–$VM $VM $baseuri= $osdisk.MediaLink.AbsoluteUri.Substring(0,($osdisk.MediaLink.AbsoluteUri.LastIndexOf('/')+1)) $datadiskuri= $baseuri+$datadiskname+".vhd" $datadiskuri } function get-newdatadisklun { Param ( [Parameter(Mandatory=$true)] [Microsoft.WindowsAzure.Commands.ServiceManagement.Model.ServiceOperationContext] $VM ) $currentdatadisk= $VM | Get-AzureDataDisk-ErrorAction SilentlyContinue if($currentdatadisk.Lun-eq $null){$LUNNUM ='0';$LUNNUM;return} [int]$LUNNUM = $currentdatadisk.Lun+1 $LUNNUM }
$windatadisklabel = “Sqlserver Database disk”# Init the Disk Size to 100GB$Disksize = 100$windatadiskname = “Windatadisk-1-”$windatadiskuri = create-datadiskbaseuri –prefix $Windatadiskname –VM $winvm$linuxdatadisklabel = “Mysql Database disk”$linuxdatadiskname = “Linuxdatadisk-1-”$linuxdatadiskuri = create-datadiskbaseuri –prefix $linuxdatadiskname –VM $linuxvm$LatestwinVMLUN = get-newdatadisklun -$VM $winvm$LatestlinuxVMLUN = get-newdatadisklun -$VM $linuxvm
创建新的虚拟磁盘并挂载到相应的虚拟机,
Add-AzureDataDisk -CreateNew -DiskSizeInGB $Disksize -DiskLabel $windatadisklabel -LUN $LatestwinVMLUN-MediaLocation $windatadiskuri -HostCaching ReadOnly -VM $winvm |Update-AzureVMAdd-AzureDataDisk-CreateNew -DiskSizeInGB $Disksize -DiskLabel $linuxdatadisklabel -LUN $LatestlinuxVMLUN-MediaLocation $linuxdatadiskuri -HostCaching ReadOnly -VM $linuxvm |Update-AzureVM
接下来我们连接虚拟机创建磁盘分区和文件系统,对于Linux虚拟机还需要修改FSTAB加载文件挂载点,这部分内容相对容易,进行设置本文不做讨论。
现在我们需要对虚拟机磁盘进行扩充了,首先查看当前Windows环境和Linux环境如下:
文件系统输出:
root@shzhailinuxdemo:~#blkid/dev/sr0:LABEL="rd_rdfe_stable.150807-1029" TYPE="udf"/dev/sda1:LABEL="cloudimg-rootfs"UUID="3156d3f3-c771-498f-89f3-c204d36c46d6" TYPE="ext4"/dev/sdb1:UUID="552a5a0f-cf4d-4286-a466-14c3af803611" TYPE="ext4"/dev/sdc1:UUID="527b77e2-b004-46e2-a41c-47fc2067f798" TYPE="ext4"FSTAB输出:root@shzhailinuxdemo:~#tail -1 /etc/fstab/dev/sdc1 /mnt/test auto defaults,noatime 0 0
查看当前大小:
root@shzhailinuxdemo:~#df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 30G 1012M 28G 4% /none 4.0K 0 4.0K 0% /sys/fs/cgroupudev 1.7G 12K 1.7G 1% /devtmpfs 345M 400K 344M 1% /runnone 5.0M 0 5.0M 0% /run/locknone 1.7G 0 1.7G 0% /run/shmnone 100M 0 100M 0% /run/usernone 64K 0 64K 0%/etc/network/interfaces.dynamic.d/dev/sdb1 50G 52M 47G 1% /mnt/dev/sdc1 99G 60M 94G 1% /mnt/test
现在我们按照要求关闭虚拟机,选择需要扩展的磁盘,扩充最后再启动虚拟机扩充磁盘。
第一步,关闭虚拟机;
$winvm = Get-AzureVM -ServiceName shawnzhaidemocloud -name shzhaiwindemo$linuxvm = Get-AzureVM -ServiceName shawnzhaidemocloud -Name shzhailinuxdemo$vms = ($winvm,$linuxvm)for ($i=0;$i -lt $vms.count;$i++) {Stop-AzureVM -VM $vms[$i] -ServiceName $vm s[$i].ServiceName -Force}
第二步,选择磁盘进行扩展,扩展到1000GB; 注意如果是不确定需要通过磁盘卷标Label进行扩充,
$disks = $vms ` | Get-AzureDataDisk ` | Out-GridView ` -Title "Select a data disk you want to resize"` -PassThru for($i=0;$i -lt $disks.count;$i++){Update-AzureDisk -diskname $disks[$i].DiskName-Label $disks[$i].DiskLabel -ResizedSizeInGB 1000}
第三步,启动虚拟机;
for($i=0;$i -lt $vms.count;$i++) {Start-AzureVM -VM $vms[$i] -ServiceName $vms[$i].ServiceName}
最后一步,扩充磁盘 WindowsServer 2012 R2,
LinuxUbuntu 14.04 LTS,我们将卸载文件系统,删除当前分区;重新创建分区,检查扫描文件系统,重新修改文件系统大小;最后重新挂载分区;
root@shzhailinuxdemo:/#umount /dev/sdc1root@shzhailinuxdemo:/#fdisk /dev/sdc Command(m for help): p Disk/dev/sdc: 1073.7 GB, 1073741824000 bytes43heads, 44 sectors/track, 1108431 cylinders, total 2097152000 sectorsUnits= sectors of 1 * 512 = 512 bytesSectorsize (logical/physical): 512 bytes / 512 bytesI/Osize (minimum/optimal): 512 bytes / 512 bytesDiskidentifier: 0x5cf6b1a8 Device Boot Start End Blocks Id System/dev/sdc1 2048 209715199 104856576 83 Linux Command(m for help): dSelectedpartition 1Command(m for help): pDisk/dev/sdc: 1073.7 GB, 1073741824000 bytes43heads, 44 sectors/track, 1108431 cylinders, total 2097152000 sectorsUnits= sectors of 1 * 512 = 512 bytesSectorsize (logical/physical): 512 bytes / 512 bytesI/Osize (minimum/optimal): 512 bytes / 512 bytesDiskidentifier: 0x5cf6b1a8 Device Boot Start End Blocks Id SystemCommand(m for help): wThepartition table has been altered! Callingioctl() to re-read partition table.Syncingdisks. root@shzhailinuxdemo:/#fdisk /dev/sdcCommand(m for help): nPartitiontype: p primary (0 primary, 0 extended, 4 free) e extendedSelect(default p): pPartitionnumber (1-4, default 1):Usingdefault value 1Firstsector (2048-2097151999, default 2048):Usingdefault value 2048Lastsector, +sectors or +size{K,M,G} (2048-2097151999, default 2097151999):Usingdefault value 2097151999Command(m for help): pDisk/dev/sdc: 1073.7 GB, 1073741824000 bytes255heads, 63 sectors/track, 130541 cylinders, total 2097152000 sectorsUnits= sectors of 1 * 512 = 512 bytesSectorsize (logical/physical): 512 bytes / 512 bytesI/Osize (minimum/optimal): 512 bytes / 512 bytesDiskidentifier: 0x5cf6b1a8 Device Boot Start End Blocks Id System/dev/sdc1 2048 2097151999 1048574976 83 LinuxCommand(m for help): wThepartition table has been altered! Callingioctl() to re-read partition table.Syncingdisks. root@shzhailinuxdemo:/#e2fsck -f /dev/sdc1e2fsck1.42.9 (4-Feb-2014)Pass1: Checking inodes, blocks, and sizesPass2: Checking directory structurePass3: Checking directory connectivityPass4: Checking reference countsPass5: Checking group summary information/dev/sdc1:12/3203072 files (0.0% non-contiguous), 247073/12800000 blocks root@shzhailinuxdemo:/#resize2fs /dev/sdc1resize2fs1.42.9 (4-Feb-2014)Resizingthe filesystem on /dev/sdc1 to 262143744 (4k) blocks.Thefilesystem on /dev/sdc1 is now 262143744 blocks long. root@shzhailinuxdemo:/#df -hFilesystem Size Used Avail Use% Mounted on/dev/sda1 30G 1012M 28G 4% /none 4.0K 0 4.0K 0% /sys/fs/cgroupudev 1.7G 8.0K 1.7G 1% /devtmpfs 345M 392K 344M 1% /runnone 5.0M 0 5.0M 0% /run/locknone 1.7G 0 1.7G 0% /run/shmnone 100M 0 100M 0% /run/usernone 64K 0 64K 0%/etc/network/interfaces.dynamic.d/dev/sdb1 50G 97M 50G 1% /mnt/dev/sdc1 985G 72M 935G 1% /mnt/test
总结一下,现在已经调整完毕;大致看完这个流程,希望对使用不同操作系统的大家调整磁盘大小有所帮助;当然根据最佳实践可以考虑最初创建磁盘就按照最大大小设置数据磁盘;此外还可以通过多个磁盘设置软RAID扩充大小,搭载了分区卷管理进行磁盘配置可以更灵活而且更方便。