您的位置:首页 > 运维架构 > Linux

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

2015-09-10 18:10 591 查看
首先,在Azure中关于数据存储的付费规则中规定,只要你使用的不是Azure的XIO高级存储提供的I/O密集型的高吞吐低延迟的服务,那么得益于Azure存储设计中采用的稀疏文件方式存储,存储虚拟机VHD的存储只会按照实际的写入数据的使用量进行付费,因此最佳实践就是建立VHD磁盘文件的时候就最好设置为1023GB,也就是Azure订阅所支持的最大值 1TB大小。当然这里讨论的是使用单个磁盘的问题,不包括出于性能或者容量限制等问题采用多个VHD数据磁盘到Azure虚拟机中,并在上面构建软RAID解决方案的情况。
好的,如果最初创建虚拟机或之后挂载的数据磁盘没有根据最佳实践设置大小,后面发现要进行VHD扩展,那么你可能发现在Azure中做类似的操作并不容易,期初我们需要通过一个较为复杂的流程实现这个目的:
关闭虚拟机

下载VHD到本地

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

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

重新启动虚拟机

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

这是个工作量不小的工作,尤其是上传下载部分,即便是通过支持传输实际文件大小的工具如AZCOPY或者PowerShell Add-Vhd CMDLET;所以调整磁盘曾经是难以和用户说明白的一个问题。
现在,调整Azure虚拟机磁盘大小不再是个难题了,因为Azure PowerShell模块中现在提供了新的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-AzureVM
Add-AzureDataDisk
-CreateNew -DiskSizeInGB $Disksize -DiskLabel $linuxdatadisklabel -LUN $LatestlinuxVMLUN
-MediaLocation $linuxdatadiskuri -HostCaching ReadOnly -VM $linuxvm |
Update-AzureVM
接下来我们连接虚拟机创建磁盘分区和文件系统,对于Linux虚拟机还需要修改FSTAB加载文件挂载点,这部分内容相对容易,可以参考Azure相关文档进行设置本文不做讨论。 现在我们需要对虚拟机磁盘进行扩充了,首先查看当前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 -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
现在我们按照要求关闭虚拟机,选择需要扩展的磁盘,扩充最后再启动虚拟机扩充磁盘。第一步,关闭虚拟机;
$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/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扩充大小,搭载了分区卷管理进行磁盘配置可以更灵活而且更方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息