針對 Linux VM 裝置名稱變更進行疑難解答
本文說明為什麼在您重新啟動 Linux VM 或重新連接數據磁碟之後,裝置名稱會變更。 本文也提供此問題的解決方案。
徵狀
在 Microsoft Azure 中執行 Linux VM 時,您可能會遇到下列問題:
- VM 在重新啟動后無法開機。
- 卸離並重新鏈接數據磁碟時,磁碟裝置名稱會變更。
- 使用裝置名稱參考磁碟的應用程式或腳本會失敗,因為裝置名稱已變更。
原因
Linux 中的裝置路徑不保證會在重新啟動時保持一致。 裝置名稱包含主要數位 (字母) 和次要號碼。 當 Linux 儲存裝置驅動器偵測到新的裝置時,驅動程式會將可用範圍的主要和次要號碼指派給裝置。 拿掉裝置時,會釋放裝置編號以供重複使用。
之所以發生此問題,是因為 SCSI 子系統已將 Linux 中的裝置掃描排程為以異步方式進行。 因此,裝置路徑名稱可能會因重新啟動而有所不同。
解決方案
若要解決此問題,請使用持續性命名。 有四種方式可以使用持續性命名:依文件系統標籤、依 UUID、依標識碼或路徑。 建議您針對 Azure Linux VM 使用檔案系統標籤或 UUID。
大部分的散發會提供 fstab
nofail 或 nobootwait 參數。 這些參數可讓系統在磁碟無法在啟動時掛接時開機。 如需這些參數的詳細資訊,請參閱散發套件檔。 如需如何在新增數據磁碟時將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 意應見反社群。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應