在 Linux VM 中新增磁碟

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

本文說明如何將持續性磁碟連結到您的 VM,以便您保留資料 - 即使您的 VM 會由於維護或調整大小而重新佈建。

將新磁碟附加至 VM

如果您想要在 VM 上新增空的新資料磁碟,請使用 az vm disk attach 命令並搭配 --new 參數。 如果您的 VM 位於可用性區域,系統會自動在與 VM 相同的區域中建立磁碟。 如需詳細資訊,請參閱可用性區域概觀。 下列範例會建立名為 myDataDisk 且大小為 50 GB 的磁碟:

az vm disk attach \
   -g myResourceGroup \
   --vm-name myVM \
   --name myDataDisk \
   --new \
   --size-gb 50

延遲較低

在選取區域中,磁碟連結延遲已減少,因此您會看到最多 15% 的改善。 無論您是否在 VM 之間已規劃或未規劃容錯移轉、調整工作負載,或執行大規模具狀態工作負載 (例如 Azure Kubernetes Service),這將會非常實用。 不過,這項改善僅限於明確的磁碟連結命令 az vm disk attach。 如果您呼叫可能會隱含執行連結的命令 (例如 az vm update),則不會看到效能改善。 您無須採取呼叫明確連結命令以外的動作,即可看到這項改進。

較低延遲目前在每個公用區域都可以使用,但下列區域除外:

  • 加拿大中部
  • 美國中部
  • 美國東部
  • 美國東部 2
  • 美國中南部
  • 美國西部 2
  • 德國北部
  • Jio 印度西部
  • 北歐
  • 西歐

連結現有的磁碟

若要連結現有磁碟,請找出磁碟識別碼,並將識別碼傳遞到 az vm disk attach 命令。 下列範例會查詢 myResourceGroup 中名為 myDataDisk 的磁碟,然後將其連結至名為 myVM 的 VM:

diskId=$(az disk show -g myResourceGroup -n myDataDisk --query 'id' -o tsv)

az vm disk attach -g myResourceGroup --vm-name myVM --name $diskId

格式化並掛接磁碟

若要分割、格式化和掛接新磁碟以供 Linux VM 使用,請使用 SSH 登入您的 VM。 如需詳細資訊,請參閱如何在 Azure 上搭配使用 SSH 與 Linux。 下列的範例連線至了一個公用 IP 位址為 10.123.123.25,使用者名稱為 azureuser 的 VM:

ssh azureuser@10.123.123.25

尋找磁碟

連線至 VM 之後,請尋找磁碟。 在此範例中,我們會使用 lsblk 來列出磁碟。

lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

輸出類似於下列範例:

sda     0:0:0:0      30G
├─sda1             29.9G /
├─sda14               4M
└─sda15             106M /boot/efi
sdb     1:0:1:0      14G
└─sdb1               14G /mnt
sdc     3:0:0:0      50G

在此處,sdc 是我們所要的磁碟,因為該磁碟具有 50G。 如果您新增多個磁碟,而且無法僅依照大小來確認各個磁碟,您可以移至入口網站中的 VM 頁面,選取 [磁碟],然後在 [資料磁碟] 下,檢查磁碟的 LUN 編號。 將入口網站中的 LUN 編號,與輸出中 HTCL 部分的最後一個號碼 (即為 LUN) 相互比較。 另一個選項是列出 /dev/disk/azure/scsi1 目錄的內容:

ls -l /dev/disk/azure/scsi1

輸出內容應會類似於下列範例:

lrwxrwxrwx 1 root root 12 Mar 28 19:41 lun0 -> ../../../sdc

將磁碟格式化

使用 parted 將磁碟格式化,如果磁碟大小為 2 TiB 或更大,您就必須使用 GPT 資料分割,如果其小於 2TiB,則可以使用 MBR 或 GPT 資料分割。

注意

建議您使用可供您的散發版本使用的最新版本 parted。 若磁碟大小為 2 TiB 或以上,您必須使用 GTP 分割。 如果磁碟大小低於 2 TiB,您就能使用 MBR 或 GPT 磁碟分割。

下列範例在 /dev/sdc 上使用了 parted,也就是第一個資料磁碟在大部分 VM 上的位置。 以磁碟的正確選項取代 sdc。 我們也會使用 XFS 檔案系統將它格式化。

sudo parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%
sudo partprobe /dev/sdc
sudo mkfs.xfs /dev/sdc1

使用 partprobe 公用程式以確保核心能夠感知新的磁碟分割和檔案系統。 如果無法使用 partprobe,可能會導致 blkid 或 lsblk 命令不會立即傳回新檔案系統的 UUID。

裝載磁碟

現在,使用 mkdir 建立用來掛接檔案系統的目錄。 下列範例會在 /datadrive 下建立目錄:

sudo mkdir /datadrive

然後,使用 mount 掛接檔案系統。 下列範例會將 /dev/sdc1 磁碟分割掛接至 /datadrive 掛接點:

sudo mount /dev/sdc1 /datadrive

保存掛接

為了確保重新開機之後自動重新掛接磁碟機,必須將磁碟機新增至 /etc/fstab 檔案。 此外,強烈建議在 /etc/fstab 中使用 UUID (通用唯一識別碼) 來參考磁碟機,而非僅使用裝置名稱 (例如 /dev/sdc1)。 如果作業系統在開機期間偵測到磁碟錯誤,使用 UUID 可避免將不正確的磁碟掛接到指定的位置。 其餘的資料磁碟則會被指派這些相同的裝置識別碼。 若要尋找新磁碟機的 UUID,請使用 blkid 公用程式:

sudo blkid

輸出會看似像以下範例:

/dev/sda1: LABEL="cloudimg-rootfs" UUID="11111111-1b1b-1c1c-1d1d-1e1e1e1e1e1e" TYPE="ext4" PARTUUID="1a1b1c1d-11aa-1234-1a1a1a1a1a1a"
/dev/sda15: LABEL="UEFI" UUID="BCD7-96A6" TYPE="vfat" PARTUUID="1e1g1cg1h-11aa-1234-1u1u1a1a1u1u"
/dev/sdb1: UUID="22222222-2b2b-2c2c-2d2d-2e2e2e2e2e2e" TYPE="ext4" TYPE="ext4" PARTUUID="1a2b3c4d-01"
/dev/sda14: PARTUUID="2e2g2cg2h-11aa-1234-1u1u1a1a1u1u"
/dev/sdc1: UUID="33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e" TYPE="xfs" PARTLABEL="xfspart" PARTUUID="c1c2c3c4-1234-cdef-asdf3456ghjk"

注意

不當編輯 /etc/fstab 檔案會導致系統無法開機。 如果不確定,請參閱散發套件的文件,以取得如何適當編輯此檔案的相關資訊。 在編輯之前,也建議先備份 /etc/fstab 檔案。

接下來,在文字編輯器中開啟 /etc/fstab 檔案。 使用先前步驟中所建立 /dev/sdc1 裝置的 UUID 值以及 /datadrive 的掛接點,在檔案結尾新增一行。 使用本文的範例,新行會如下所示:

UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,nofail   1   2

完成檔案編輯時,請儲存並關閉編輯器。

或者,您也可以執行下列命令,將磁碟新增至 /etc/fstab 檔案:

echo "UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,nofail   1   2" >> /etc/fstab

注意

稍後移除資料磁碟而不編輯 fstab,可能會造成 VM 無法開機。 大多數的發行版本會提供 nofail 和 (或) nobootwait fstab 選項。 即使磁碟在開機時無法掛接,這些選項也能讓系統開機。 請查閱散發套件的文件,以取得這些參數的相關資訊。

Nofail 選項可確保即使檔案系統已損毀或磁碟在開機時並不存在,仍然會啟動 VM。 若不使用此選項,您可能會遇到因為 FSTAB 錯誤所以無法 SSH 到 Linux VM 中所述的行為

如果修改 fstab 導致開機失敗,則您可以使用 Azure VM 序列主控台以進行 VM 的控制台存取。 如需更多詳細資料,您可以在序列主控台文件中取得。

Azure 中 Linux 的 TRIM/UNMAP 支援

有些 Linux 核心會支援 TRIM/UNMAP 作業以捨棄磁碟上未使用的區塊。 此功能主要用於通知 Azure 已刪除的頁面已不再有效且可予以捨棄。 此功能可節省根據已取用儲存體數目計費的磁碟費用,例如非受控標準磁碟和磁碟快照集。

有兩種方式可在 Linux VM 中啟用 TRIM 支援。 像往常一樣,請參閱您的散發套件以了解建議的方法︰

  • /etc/fstab 中使用 discard 掛接選項,例如:

    UUID=33333333-3b3b-3c3c-3d3d-3e3e3e3e3e3e   /datadrive   xfs   defaults,discard   1   2
    
  • 在某些情況下,discard 選項可能會影響效能。 或者,您也可以從命令列手動執行 fstrim 命令,或將它新增到 crontab 來定期執行︰

sudo apt install util-linux
sudo fstrim /datadrive

疑難排解

將資料磁碟新增到 Linux VM 時,如果 LUN 0 沒有磁碟,可能會發生錯誤。 如果您是藉由使用 az vm disk attach -new 命令並指定 LUN (--lun) 來手動新增磁碟,而不是讓 Azure 平台判斷適當的 LUN,則請注意,LUN 0 已經有磁碟或將會有磁碟。

請思考一下以下範例,此範例顯示來自 lsscsi之輸出的程式碼片段:

[5:0:0:0]    disk    Msft     Virtual Disk     1.0   /dev/sdc 
[5:0:0:1]    disk    Msft     Virtual Disk     1.0   /dev/sdd 

兩個資料磁碟存在於 LUN 0 和 LUN 1 (lsscsi 輸出中的第 1 欄輸出了詳細資料 [host:channel:target:lun])。 兩個磁碟應該都要是可從 VM 內存取的磁碟。 如果您已手動指定要在 LUN 1 新增第一個磁碟及在 LUN 2 新增第二個磁碟,則從您的 VM 內可能無法正確看見這些磁碟。

注意

在這些範例中,Azure host 值為 5,但這可能會依據您選取的儲存體類型而有所不同。

此磁碟行為不是 Azure 問題,而是 Linux 核心遵循 SCSI 規格的方式。 當 Linux 核心掃描 SCSI 匯流排是否有已連接的裝置時,必須在 LUN 0 找到裝置,系統才能繼續掃描是否有其他裝置。 如以上所述,因此︰

  • 在新增資料磁碟之後,請檢閱 lsscsi 的輸出,以確認 LUN 0 有磁碟。
  • 如果磁碟在 VM 內未正確顯示,請確認 LUN 0 有磁碟。

下一步