首先,在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擴充大小,搭載了分區卷管理進行磁盤配置可以更靈活而且更方便。