调整Azure中虚拟机数据磁盘大小实践
首先,在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订阅,
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环境如下:
文件系统输出:
1
2
3
4
5
6
7
8
|
[email protected]:~ #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输出: [email protected]:~ #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
|
[email protected]:~ #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,
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
|
[email protected]:/ #umount /dev/sdc1
[email protected]:/ #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. [email protected]:/ #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. [email protected]:/ #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
[email protected]:/ #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.
[email protected]:/ #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扩充大小,搭载了分区卷管理进行磁盘配置可以更灵活而且更方便。