擴充 Linux VM 上的虛擬硬碟

警告

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

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

本文說明如何擴充 Linux 虛擬機器 (VM) 的受控磁碟。 您可以新增資料磁碟來提供更多儲存空間,而您也可以擴充既有的資料磁碟。 在 Azure 中,Linux VM 上作業系統 (OS) 的預設虛擬硬碟大小通常是 30 GB。 本文說明如何擴充 OS 磁碟或資料磁碟。 您無法擴充等量磁碟區的大小。

OS 磁碟的最大容量為 4,095 GiB。 不過,根據預設,許多作業系統會分割 主開機記錄 (MBR)。 MBR 會將可用大小限制為 2 TiB。 如果需要超過 2 TiB,請建立和連結資料磁碟,並作為資料儲存體。 如果需要將資料儲存在 OS 磁碟上,而且需要更多空間,請轉換為 GUID 磁碟分割表格 (GPT)。

警告

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

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

在擴充資料磁碟的情況下,當虛擬機器上存在多個資料磁碟時,可能很難將 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。 也請記下「類型」資料行,指出文件系統的格式。 這在稍後很重要。

現在,藉由檢查 /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 中存有一個虛擬機器,且該虛擬機器至少掛載一個已備妥使用的資料磁碟。 如果您還沒有可使用的虛擬機器,請參閱建立並準備掛載有資料磁碟的虛擬機器

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

重要

如果您的磁碟符合不停機擴充中的需求,您可以跳過步驟 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 create 啟動 VM。 下列範例會啟動名為 myResourceGroup 資源群組中名為 myVM 的 VM:

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

擴充磁碟分割與檔案系統

注意

雖然有許多工具可用來執行分割區調整大小,但本文件其餘部分詳述的工具與某些自動化流程所使用的工具相同,例如 cloud-init。 如這裡所述,具有 gdisk 套件的 growpart 工具提供與 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 指導都應該視為一般,而且可能會套用在任何發行版上,但通常符合具名市集發行者的慣例。 參考 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
       }
   }
}