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

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

徵狀

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

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

原因

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

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

解決方案

若要解決此問題,請使用持續性命名。 有四種方式可以使用持續性命名:依文件系統標籤、依 UUID、依標識碼或路徑。 建議您針對 Azure Linux VM 使用檔案系統標籤或 UUID。

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

當 Azure Linux 代理程式安裝在 VM 上時,代理程式會使用 Udev 規則,在 /dev/disk/azure 路徑下建構一組符號連結。 應用程式和腳本會使用Udev規則來識別連結至VM的磁碟,以及磁碟類型和磁碟 LUN。

如果您已經以 VM 未開機且無法 SSH 連線到 VM 的方式編輯 fstab,您可以使用 VM 序列控制台 進入 單一使用者模式 並修改 fstab。

識別磁碟 LUN

應用程式會使用 LUN 來尋找所有連結的磁碟,並建構符號連結。 Azure Linux 代理程式包含 Udev 規則,可設定從 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 的所有磁碟及其相關聯裝置檔案的 UID:

$ 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 意應見反社群