调整Azure中虚拟机数据磁盘大小实践

首先,在Azure中关于数据存储的付费规则中规定,只要你使用的不是Azure的XIO高级存储提供的I/O密集型的高吞吐低延迟的服务,那么得益于Azure存储设计中采用的稀疏文件方式存储,存储虚拟机VHD的存储只会按照实际的写入数据的使用量进行付费,因此最佳实践就是建立VHD磁盘文件的时候就最好设置为1023GB,也就是Azure订阅所支持的最大值 1TB大小。当然这里讨论的是使用单个磁盘的问题,不包括出于性能或者容量限制等问题采用多个VHD数据磁盘到Azure虚拟机中,并在上面构建软RAID解决方案的情况。

好的,如果最初创建虚拟机或之后挂载的数据磁盘没有根据最佳实践设置大小,后面发现要进行VHD扩展,那么你可能发现在Azure中做类似的操作并不容易,期初我们需要通过一个较为复杂的流程实现这个目的:

  1. 关闭虚拟机

  2. 下载VHD到本地

  3. 通过Hyper-V/PowerShell或者第三方工具调整VHD大小

  4. 删除或上传时将新的调整大小后的VHD传输到BLOB存储中

  5. 重新启动虚拟机

  6. 通过diskpart或作者fdisk或者磁盘管理工具调整分区大小

这是个工作量不小的工作,尤其是上传下载部分,即便是通过支持传输实际文件大小的工具如AZCOPY或者PowerShell Add-Vhd CMDLET;所以调整磁盘曾经是难以和用户说明白的一个问题。

现在,调整Azure虚拟机磁盘大小不再是个难题了,因为Azure PowerShell模块中现在提供了新的cmdlet支持调整磁盘大小,Update-AzureDisk,而唯一的限制仅仅是需要确保调整磁盘大小的虚拟机处于关闭和取消分配的状态。

另外,这里脑补一下,有可能在我们环境里面使用的虚拟机有多个虚拟机磁盘对应不同的分区,我们只需要对其中某个特定分区磁盘进行扩充,如果是这种情况究竟哪个VHD磁盘是我们需要调整的呢,一个偷懒的办法就是把所有的数据磁盘统统扩容上去,毕竟不是只按照实际使用收费吗,当然这样无不可;只是我觉得一个好的习惯就是在每次挂接Azure的数据磁盘时,都遵守一个好的命名规范,并且 给磁盘设置一个合理的能够说明用途的标签(Label),这样在调整的时候就能起到事半功倍的效果。

好的,现在为两个测试虚拟机创建数据磁盘,

首先确认连接了当前的Azure订阅,

1 2 Select-AzureSubscription  -SubscriptionId { MySubscriptionId } Add-AzureAccount  -Environment AzureChinaCloud

创建演示虚拟机对象,我们分别演示已经创建的Windows Server 2012 R2服务器和Linux Ubuntu 14.04 LTS虚拟机;

1 2 $winvm  Get-AzureVM  -ServiceName shawnzhaidemocloud -name shzhaiwindemo $linuxvm  Get-AzureVM  -ServiceName shawnzhaidemocloud -Name shzhailinuxdemo

设置数据磁盘信息并获取当前虚拟机存储账号信息并通过该信息创建数据磁盘,

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30           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                         }
1 2 3 4 5 6 7 8 9 10 $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

创建新的虚拟磁盘并挂载到相应的虚拟机,

1 2 3 4 5 6 7 Add-AzureDataDisk  -CreateNew -DiskSizeInGB  $Disksize  -DiskLabel  $windatadisklabel  -LUN  $LatestwinVMLUN -MediaLocation  $windatadiskuri  -HostCaching ReadOnly -VM  $winvm  | Update-AzureVM Add-AzureDataDisk -CreateNew  -DiskSizeInGB  $Disksize  -DiskLabel  $linuxdatadisklabel  -LUN  $LatestlinuxVMLUN -MediaLocation  $linuxdatadiskuri  -HostCaching ReadOnly -VM  $linuxvm  | Update-AzureVM

接下来我们连接虚拟机创建磁盘分区和文件系统,对于Linux虚拟机还需要修改FSTAB加载文件挂载点,这部分内容相对容易,可以参考Azure相关文档进行设置本文不做讨论。

 现在我们需要对虚拟机磁盘进行扩充了,首先查看当前Windows环境和Linux环境如下:

wKiom1XxWXGALxjIAAM-yQRFmxM745.jpg

文件系统输出:

1 2 3 4 5 6 7 8 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

查看当前大小:

1 2 3 4 5 6 7 8 9 10 11 12 root@shzhailinuxdemo:~ #df -h Filesystem      Size Used Avail Use% Mounted on /dev/sda1         30G 1012M   28G  4% / none            4.0K     0 4.0K   0%  /sys/fs/cgroup udev            1.7G   12K 1.7G   1%  /dev tmpfs           345M 400K  344M   1%  /run none            5.0M     0 5.0M   0%  /run/lock none            1.7G     0 1.7G   0%  /run/shm none            100M     0 100M   0%  /run/user none             64K     0  64K   0% /etc/network/interfaces .dynamic.d /dev/sdb1         50G  52M   47G   1%  /mnt /dev/sdc1         99G  60M   94G   1%  /mnt/test

现在我们按照要求关闭虚拟机,选择需要扩展的磁盘,扩充最后再启动虚拟机扩充磁盘。

第一步,关闭虚拟机;

1 2 3 4 $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进行扩充,

1 2 3 4 5 6 7 $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}

第三步,启动虚拟机;

1 for ( $i =0; $i  -lt  $vms .count; $i ++) { Start-AzureVM  -VM  $vms [ $i ] -ServiceName  $vms [ $i ].ServiceName}

最后一步,扩充磁盘 WindowsServer 2012 R2,

wKioL1XxXw2TOZJnAAQgLuoiCvY821.jpg

wKiom1XxXOCy_bCiAAVZT2Ob57M628.jpg

LinuxUbuntu 14.04 LTS,我们将卸载文件系统,删除当前分区;重新创建分区,检查扫描文件系统,重新修改文件系统大小;最后重新挂载分区;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 root@shzhailinuxdemo:/ #umount /dev/sdc1 root@shzhailinuxdemo:/ #fdisk /dev/sdc    Command(m  for  help): p    Disk /dev/sdc : 1073.7 GB, 1073741824000 bytes 43heads, 44 sectors /track , 1108431 cylinders, total 2097152000 sectors Units= sectors of 1 * 512 = 512 bytes Sectorsize (logical /physical ): 512 bytes / 512 bytes I /Osize  (minimum /optimal ): 512 bytes / 512 bytes Diskidentifier: 0x5cf6b1a8        Device Boot      Start         End      Blocks  Id  System /dev/sdc1             2048   209715199  104856576   83  Linux    Command(m  for  help): d Selectedpartition 1 Command(m  for  help): p Disk /dev/sdc : 1073.7 GB, 1073741824000 bytes 43heads, 44 sectors /track , 1108431 cylinders, total 2097152000 sectors Units= sectors of 1 * 512 = 512 bytes Sectorsize (logical /physical ): 512 bytes / 512 bytes I /Osize  (minimum /optimal ): 512 bytes / 512 bytes Diskidentifier: 0x5cf6b1a8     Device Boot      Start         End      Blocks  Id  System Command(m  for  help): w Thepartition table has been altered!    Callingioctl() to re- read  partition table. Syncingdisks.    root@shzhailinuxdemo:/ #fdisk /dev/sdc Command(m  for  help): n Partitiontype:     p  primary (0 primary, 0 extended, 4  free )     e   extended Select(default p): p Partitionnumber (1-4, default 1): Usingdefault value 1 Firstsector (2048-2097151999, default 2048): Usingdefault value 2048 Lastsector, +sectors or +size{K,M,G} (2048-2097151999, default 2097151999): Usingdefault value 2097151999 Command(m  for  help): p Disk /dev/sdc : 1073.7 GB, 1073741824000 bytes 255heads, 63 sectors /track , 130541 cylinders, total 2097152000 sectors Units= sectors of 1 * 512 = 512 bytes Sectorsize (logical /physical ): 512 bytes / 512 bytes I /Osize  (minimum /optimal ): 512 bytes / 512 bytes Diskidentifier: 0x5cf6b1a8     Device Boot      Start         End      Blocks  Id  System /dev/sdc1             2048  2097151999 1048574976   83  Linux Command(m  for  help): w Thepartition table has been altered!    Callingioctl() to re- read  partition table. Syncingdisks.    root@shzhailinuxdemo:/ #e2fsck -f /dev/sdc1 e2fsck1.42.9 (4-Feb-2014) Pass1: Checking inodes, blocks, and sizes Pass2: Checking directory structure Pass3: Checking directory connectivity Pass4: Checking reference counts Pass5: Checking group summary information /dev/sdc1 :12 /3203072  files (0.0% non-contiguous), 247073 /12800000  blocks    root@shzhailinuxdemo:/ #resize2fs /dev/sdc1 resize2fs1.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 -h Filesystem      Size Used Avail Use% Mounted on /dev/sda1         30G 1012M   28G  4% / none            4.0K     0 4.0K   0%  /sys/fs/cgroup udev            1.7G  8.0K 1.7G   1%  /dev tmpfs           345M 392K  344M   1%  /run none            5.0M     0 5.0M   0%  /run/lock none            1.7G     0 1.7G   0%  /run/shm none            100M     0 100M   0%  /run/user none             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扩充大小,搭载了分区卷管理进行磁盘配置可以更灵活而且更方便。











本文转自 翟老猫 51CTO博客,原文链接:http://blog.51cto.com/3387405/1693525,如需转载请自行联系原作者


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部