共用方式為


針對 Linux VM 裝置名稱變更進行疑難排解

適用於:✔️ Linux VM

本文說明重新啟動 Linux VM 或重新連結數據磁碟之後,裝置名稱為何變更。 本文也提供此問題的解決方案。

徵兆

在 Microsoft azure 中執行 Linux VM 時,可能會遇到下列問題:

  • VM 在重新啟動后無法開機。
  • 當數據磁碟斷連結並重新連結時,磁碟裝置名稱會變更。
  • 使用裝置名稱參考磁碟的應用程式或腳本失敗,因為裝置名稱已變更。

原因

Linux 中的裝置路徑不保證會在重新啟動時保持一致。 裝置名稱是由主要數位(字母)和次要數位所組成。 當 Linux 儲存裝置驅動程式偵測到新的裝置時,驅動程式會將主要和次要數位從可用的範圍指派給裝置。 拿掉裝置時,會釋出裝置號碼以供重複使用。

發生此問題的原因是 SCSI 子系統會排程在 Linux 中的裝置掃描,以異步方式發生。 因此,裝置路徑名稱可能會因重新啟動而有所不同。

解決方案

若要解決此問題,請使用在重新啟動時持續存在的裝置名稱。 有數種方式可以使用永續性命名:依文件系統標籤、UUID 或衍生裝置路徑。 針對不使用邏輯磁碟區管理員 (LVM) 的 Linux VM,建議使用文件系統的 UUID 或使用 udev 規則建立的連結。 對於以 LVM 為基礎的文件系統,使用磁碟區群組和邏輯磁碟區名稱進行掛接也是有效的方法,因為無論實體磁碟區如何排序,LVM 對象都會保持一致。

大部分的散發都會提供 fstab nofailnobootwait 參數。 當磁碟在啟動時無法掛接時,這些參數可讓系統開機。 如需這些參數的詳細資訊,請參閱散發檔。 如需如何在新增數據磁碟時將 Linux VM 設定為使用 UUID 的資訊,請參閱 連線到 Linux VM 以掛接新的磁碟

如果您已經以您的 VM 未開機且無法透過 SSH 連線到 VM 的方式編輯 fstab,您可以使用 VM 序列主控台 進入 單一使用者模式 並修改 fstab,或使用 Azure Linux 自動修復 將修復程式自動化。

識別磁碟 LUN

在 VM 上安裝 Azure Linux 代理程式時,代理程式會使用 udev 規則,在 /dev/disk/azure 路徑下建構一組符號連結,將 Azure 定義的 LUN 附件與傳統磁碟裝置相互關聯:

$ tree /dev/disk/azure

/dev/disk/azure
├── resource -> ../../sdb
├── resource-part1 -> ../../sdb1
├── root -> ../../sda
├── root-part1 -> ../../sda1
└── scsi1
    ├── lun0 -> ../../../sdc
    ├── lun0-part1 -> ../../../sdc1
    ├── lun1 -> ../../../sdd
    ├── lun1-part1 -> ../../../sdd1
    ├── lun1-part2 -> ../../../sdd2
    └── lun1-part3 -> ../../../sdd3

Linux 客體帳戶中的 LUN 資訊是使用 lsscsi 或類似的工具擷取:

$ sudo lsscsi

[1:0:0:0] cd/dvd Msft Virtual CD/ROM 1.0 /dev/sr0

[2:0:0:0] disk Msft Virtual Disk 1.0 /dev/sda

[3:0:1:0] disk Msft Virtual Disk 1.0 /dev/sdb

[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 資訊會與 Azure 訂用帳戶元數據搭配使用,以在包含數據分割數據的 Azure 儲存體 中找到 VHD。 例如,您可以使用 az CLI:

$ az vm show --resource-group testVM --name testVM | jq -r .storageProfile.dataDisks
[
{
"caching": "None",
  "createOption": "empty",
"diskSizeGb": 1023,
  "image": null,
"lun": 0,
"managedDisk": null,
"name": "testVM-20170619-114353",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-114353.vhd"
}
},
{
"caching": "None",
"createOption": "empty",
"diskSizeGb": 512,
"image": null,
"lun": 1,
"managedDisk": null,
"name": "testVM-20170619-121516",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-121516.vhd"
  }
  }
]

使用blkid探索文件系統 UUID

應用程式和文稿會讀取 、或類似的資訊來源輸出 blkid,以在 /dev 路徑中建構符號連結。 輸出會顯示連結至 VM 及其相關聯裝置檔案之所有磁碟的 UUID:

$ sudo blkid -s UUID

/dev/sr0: UUID="120B021372645f72"
/dev/sda1: UUID="52c6959b-79b0-4bdd-8ed6-71e0ba782fb4"
/dev/sdb1: UUID="176250df-9c7c-436f-94e4-d13f9bdea744"
/dev/sdc1: UUID="b0048738-4ecc-4837-9793-49ce296d2692"

Azure Linux 代理程式 Udev 規則會建構 /dev/disk/azure 路徑下的一組符號連結:

$ ls -l /dev/disk/azure

total 0
lrwxrwxrwx 1 root root  9 Jun  2 23:17 resource -> ../../sdb
lrwxrwxrwx 1 root root 10 Jun  2 23:17 resource-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 Jun  2 23:17 root -> ../../sda
lrwxrwxrwx 1 root root 10 Jun  2 23:17 root-part1 -> ../../sda1

應用程式會使用連結來識別開機磁碟裝置和資源 (暫時) 磁碟。 在 Azure 中,應用程式應該查看 /dev/disk/azure/root-part1 或 /dev/disk/azure-resource-part1 路徑來探索這些分割區。

清單中的任何其他分割 blkid 區都位於數據磁碟上。 應用程式會維護這些分割區的 UUID,並使用路徑在運行時間探索裝置名稱:

$ ls -l /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692

lrwxrwxrwx 1 root root 10 Jun 19 15:57 /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692 -> ../../sdc1

取得最新的 Azure 儲存體 規則

若要取得最新的 Azure 儲存體 規則,請執行下列命令:

# sudo curl -o /etc/udev/rules.d/66-azure-storage.rules https://raw.githubusercontent.com/Azure/WALinuxAgent/master/config/66-azure-storage.rules
# sudo udevadm trigger --subsystem-match=block

另請參閱

如需詳細資訊,請參閱下列文章:

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。