擴充Linux VM上的虛擬硬碟

警告

這篇文章參考 CentOS,這是接近生命週期結束 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

適用於:✔️ Linux VM ✔️ 彈性擴展集

本文說明如何擴充Linux虛擬機的受控磁碟(VM)。 您可以 新增數據磁碟 以提供額外的儲存空間,也可以擴充現有的數據磁碟。 操作系統的預設虛擬硬碟大小在 Azure 中的 Linux VM 上通常是 30 GB。 本文涵蓋擴充 OS 磁碟或數據磁碟。 您無法擴充等量磁碟區的大小。

OS 磁碟的容量上限為 4,095 GiB。 不過,根據預設,許多操作系統會以 主要開機記錄 (MBR) 進行分割。 MBR 會將可用大小限制為 2 TiB。 如果您需要的大小超過 2 TiB,建立和連結資料磁碟,並將其用於資料儲存。 如果您需要將資料儲存在 OS 磁碟上,而且需要額外的空間,請將它轉換成 GUID 磁碟分區數據表 (GPT)。

警告

請務必確定檔系統處於狀況良好的狀態,磁碟分區數據表類型 (GPT 或 MBR) 將支援新的大小,並確定您的數據在執行磁碟擴充作業之前已備份。 如需詳細資訊,請參閱 Azure 備份 快速入門

識別作業系統內的 Azure 資料磁碟物件

當 VM 上有數個數據磁碟時,擴充數據磁碟時,可能會很難將 Azure LUN 與 Linux 裝置產生關聯。 如果OS磁碟需要擴充,則會在 Azure 入口網站 中清楚標示為OS磁碟。

首先,使用 df 命令識別磁碟使用率、裝入點和裝置之間的關聯性。

df -Th
Filesystem                Type      Size  Used Avail Use% Mounted on
/dev/sda1                 xfs        97G  1.8G   95G   2% /
<truncated>
/dev/sdd1                 ext4       32G   30G  727M  98% /opt/db/data
/dev/sde1                 ext4       32G   49M   30G   1% /opt/db/log

在這裡,我們可以看到 /opt/db/data 文件系統幾乎已滿,而且位於分割區上 /dev/sdd1 。 的 df 輸出會顯示裝置路徑,不論磁碟是由裝置路徑掛接,還是 fstab 中的 (慣用) UUID。 也請記下 Type 資料行,指出文件系統的格式。 這在稍後很重要。

現在,藉由檢查 的內容/dev/disk/azure/scsi1,找出與 相互關聯的 /dev/sdd LUN。 下列ls命令的輸出會顯示在查看 Azure 入口網站 時,Linux OS 中稱為 /dev/sdd 的裝置位於 LUN1。

sudo ls -alF /dev/disk/azure/scsi1/
total 0
drwxr-xr-x. 2 root root 140 Sep  9 21:54 ./
drwxr-xr-x. 4 root root  80 Sep  9 21:48 ../
lrwxrwxrwx. 1 root root  12 Sep  9 21:48 lun0 -> ../../../sdc
lrwxrwxrwx. 1 root root  12 Sep  9 21:48 lun1 -> ../../../sdd
lrwxrwxrwx. 1 root root  13 Sep  9 21:48 lun1-part1 -> ../../../sdd1
lrwxrwxrwx. 1 root root  12 Sep  9 21:54 lun2 -> ../../../sde
lrwxrwxrwx. 1 root root  13 Sep  9 21:54 lun2-part1 -> ../../../sde1

展開 Azure 受控磁碟

在不停機的情況下展開

您可以擴充受控磁碟,而不需解除分配 VM。 您的磁碟主機快取設定不會變更您是否可以擴充數據磁碟,而不需要解除分配 VM。

這項功能有下列限制:

  • 僅支援數據磁碟。
  • 如果磁碟是 4 TiB 或更小,您應該先解除配置 VM 並中斷連結磁碟,再將其擴充至 4 TiB 以上。 如果磁碟已大於 4 TiB,則無須解除配置 VM 及中斷連結磁碟即可擴充。
  • 不支援 Ultra 磁碟或 進階版 SSD v2 磁碟。
  • 共用磁碟不支援。
  • 安裝並使用下列其中一項:
  • 在某些傳統 VM 上無法使用。 使用此 腳本 來取得支援在不停機的情況下擴充的傳統 VM SKU 清單。

展開 Azure 受控磁碟

請確定您已安裝最新的 Azure CLI,並使用 az login 登入 Azure 帳戶

本文需要 Azure 中至少有一個連結和備妥的數據磁碟的現有 VM。 如果您還沒有可以使用的 VM,請參閱 使用數據磁碟建立和準備 VM。

在下列範例中,以您自己的值取代範例參數名稱,例如 myResourceGroupmyVM

重要

如果您的磁碟符合 Expand 中 不需要停機的需求,您可以略過步驟 1 和 3。

  1. 虛擬硬碟上的作業無法在執行中的 VM 上執行。 使用 az vm deallocate 解除配置您的 VM。 下列範例會在名為 myResourceGroup 的資源群組中解除分配名為 myVM 的 VM:

    az vm deallocate --resource-group myResourceGroup --name myVM
    

    注意

    VM 必須解除分配,才能擴充虛擬硬碟。 停止具有 az vm stop 的 VM 不會釋放計算資源。 若要釋放計算資源,請使用 az vm deallocate

  2. 使用 az disk list 檢視資源群組中的受控磁碟清單。 下列範例會顯示名為 myResourceGroup 的資源群組中的受控磁碟清單:

    az disk list \
        --resource-group myResourceGroup \
        --query '[*].{Name:name,Gb:diskSizeGb,Tier:accountType}' \
        --output table
    

    使用 az disk update 展開所需的磁碟。 下列範例會將名為 myDataDisk 的受控磁碟展開為 200 GB:

    az disk update \
        --resource-group myResourceGroup \
        --name myDataDisk \
        --size-gb 200
    

    注意

    當您擴充受控磁碟時,更新的大小會四捨五入為最接近的受控磁碟大小。 如需可用受控磁碟大小和層級的數據表,請參閱 Azure 受控磁碟 概觀 - 定價和計費

  3. 使用 az vm start 啟動 VM。 下列範例會在名為 myResourceGroup 的資源群組中啟動名為 myVM 的 VM:

    az vm start --resource-group myResourceGroup --name myVM
    

展開磁碟分區和文件系統

注意

雖然有許多工具可用來執行分割區重設大小,但本檔其餘部分詳述的工具與某些自動化程式所使用的工具相同,例如 cloud-init。 如這裡所述, growpart 套件的工具 gdisk 提供與 GUID 分割區數據表 (GPT) 磁碟的通用相容性,因為舊版的工具,例如 fdisk 不支援 GPT。

偵測變更的磁碟大小

如果使用先前所述的程式來擴充數據磁碟,則在重新掃描裝置之前,磁碟大小不會變更,這通常只會在開機過程中發生。 您可以使用下列程式視需要呼叫此重新掃描。 在此範例中,我們偵測到使用本檔中的方法,指出數據磁碟目前 /dev/sda 已從 256 GiB 調整為 512 GiB。

  1. 識別輸出第一行上目前辨識的大小 fdisk -l /dev/sda

    sudo fdisk -l /dev/sda
    
    Disk /dev/sda: 256 GiB, 274877906944 bytes, 536870912 sectors
    Disk model: Virtual Disk
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: dos
    Disk identifier: 0x43d10aad
    
    Device     Boot Start       End   Sectors  Size Id Type
    /dev/sda1        2048 536870878 536868831  256G 83 Linux
    
  2. 1將字元插入此裝置的重新掃描檔案中。 請注意 sda 的參考,如果不同磁碟裝置已重設大小,這會變更。

    echo 1 | sudo tee /sys/class/block/sda/device/rescan
    
  3. 確認已辨識新的磁碟大小

    sudo fdisk -l /dev/sda
    
    Disk /dev/sda: 512 GiB, 549755813888 bytes, 1073741824 sectors
    Disk model: Virtual Disk
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 4096 bytes
    I/O size (minimum/optimal): 4096 bytes / 4096 bytes
    Disklabel type: dos
    Disk identifier: 0x43d10aad
    
    Device     Boot Start       End   Sectors  Size Id Type
    /dev/sda1        2048 536870878 536868831  256G 83 Linux
    

本文的其餘部分會使用 OS 磁碟作為程式範例,以增加 OS 層級的磁碟區大小。 如果展開的磁碟是數據磁碟,請使用 先前的指引來識別數據磁碟裝置,並遵循這些指示作為指導方針,並視需要取代數據磁碟裝置(例如 /dev/sda),分割區編號、磁碟區名稱、裝入點和文件系統格式。

所有 Linux OS 指引都應該視為一般,而且可能會套用在任何發行版上,但通常符合具名 Marketplace 發行者的慣例。 參考 Red Hat 檔,以瞭解任何宣告 Red Hat 相容性的散發套件需求,例如 CentOS 和 Oracle。

增加 OS 磁碟的大小

下列指示適用於背書的Linux發行版。

注意

繼續進行之前,請先製作 VM 的完整備份複本,或至少擷取 OS 磁碟的快照集。

在 Ubuntu 16.x 與較新的版本上,OS 磁碟和檔案系統的根分割區會自動擴充,以藉由 cloud-init 來利用根磁碟上所有可用的連續空間,前提是調整大小作業有一些可用空間。 在此情況下,順序只是

  1. 如先前所述增加 OS 磁碟的大小
  2. 重新啟動 VM,然後使用根用戶帳戶存取 VM
  3. 確認 OS 磁碟現在顯示增加的檔案系統大小。

如下列範例所示,OS 磁碟已從入口網站重設大小為 100 GB。 / 上掛接的 /dev/sda1 檔案系統現在顯示 97 GB。

df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  314M     0  314M   0% /dev
tmpfs          tmpfs      65M  2.3M   63M   4% /run
/dev/sda1      ext4       97G  1.8G   95G   2% /
tmpfs          tmpfs     324M     0  324M   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     324M     0  324M   0% /sys/fs/cgroup
/dev/sda15     vfat      105M  3.6M  101M   4% /boot/efi
/dev/sdb1      ext4       20G   44M   19G   1% /mnt
tmpfs          tmpfs      65M     0   65M   0% /run/user/1000
user@ubuntu:~#

在不停機的情況下擴充傳統 VM SKU 支援

如果您使用傳統 VM SKU,它可能不支援在不停機的情況下擴充磁碟。

使用下列 PowerShell 腳本來判斷可用的 VM SKU:

Connect-AzAccount
$subscriptionId="yourSubID"
$location="desiredRegion"
Set-AzContext -Subscription $subscriptionId
$vmSizes=Get-AzComputeResourceSku -Location $location | where{$_.ResourceType -eq 'virtualMachines'}

foreach($vmSize in $vmSizes){
    foreach($capability in $vmSize.Capabilities)
    {
       if(($capability.Name -eq "EphemeralOSDiskSupported" -and $capability.Value -eq "True") -or ($capability.Name -eq "PremiumIO" -and $capability.Value -eq "True") -or ($capability.Name -eq "HyperVGenerations" -and $capability.Value -match "V2"))
        {
            $vmSize.Name
       }
   }
}