調整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訂閱,

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環境如下:

wKiom1XxWXGALxjIAAM-yQRFmxM745.jpg

文件系統輸出:

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,

wKioL1XxXw2TOZJnAAQgLuoiCvY821.jpg

wKiom1XxXOCy_bCiAAVZT2Ob57M628.jpg

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章