本文說明如何在 Linux VM 上使用永久裝置命名。
對於使用 Linux 作業系統的 VM,裝置名稱 (例如 /dev/sda) 可能會在您執行下列程序後變更:
- 啟動及停止 VM
- 卸離及重新連接磁碟
- 變更機器類型
這是因為 VM 啟動或裝置連線後,系統會從可用範圍指派裝置名稱。卸離裝置或停止 VM 即可釋出裝置名稱。當裝置重新連接或 VM 重新啟動時,系統會從可用範圍中指派新的裝置名稱。Linux 核心無法保證裝置在重新啟動後會依序啟動。
如果應用程式或指令碼依附於原始裝置名稱,變更裝置名稱可能會導致這些項目無法正常運作,或導致 VM 在重新啟動後無法開機。
建議您在參照 Linux VM 上的磁碟和磁碟分割區時,使用永久裝置名稱,以免發生這個問題。你也可以使用 符號連結。
事前準備
- 查看 Linux 作業系統的裝置管理:
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上範例的預計用途分頁:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,您不需要設定驗證機制。
gcloud
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
- 設定預設區域和可用區。
Linux VM 上的裝置命名
連接至 VM 的磁碟 Linux 裝置名稱,取決於您在建立磁碟時選擇的介面。使用 lsblk 作業系統指令查看磁碟裝置時,系統會顯示以 NVMe 介面附加的磁碟前置字元 nvme,以及以 SCSI 介面附加的磁碟前置字元 sd。
磁碟編號或 NVMe 控制器的順序無法預測,且在 VM 重新啟動後不一致。首次開機時,永久磁碟可能是 nvme0n1 (SCSI 則為 sda)。第二次啟動時,同一個永久磁碟的裝置名稱可能是 nvme2n1 或 nvme0n3 (SCSI 則為 sdc)。
存取連結磁碟時,請改用 /dev/disk/by-id/ 中建立的符號連結。這些名稱會在重新啟動後保留。
如要進一步瞭解符號連結,請參閱「連結至 VM 的磁碟符號連結」。
SCSI 裝置名稱
SCSI 連接磁碟裝置的格式為 sda,代表第一個連接的磁碟。磁碟分割區會顯示為 sda1。每個額外磁碟都會使用連續字母,例如 sdb 和 sdc。達到 sdz 後,後續新增的磁碟名稱會是 sdaa、sdab 和 sdac 等,最多可達 sddx。
NVMe 裝置名稱
在 Linux 作業系統中,NVMe 連接的磁碟裝置格式為 nvmenumbernnamespace。其中 number 代表 NVMe 磁碟控制器編號,namespace 則是 NVMe 磁碟控制器指派的 NVMe 命名空間 ID。如果是分割區,裝置名稱會附加 pn,其中 n 是從 1 開始的數字,表示第 nth 個分割區。
控制器編號從 0 開始。連接至運算執行個體的單一 NVMe 磁碟,裝置名稱為 nvme0n1。大多數機型都使用單一 NVMe 磁碟控制器。NVMe 裝置名稱隨後會是 nvme0n1、nvme0n2、nvme0n3 等。
連接至第三代機器系列或更新版本執行個體的本機 SSD 磁碟,每個磁碟都有專屬的 NVMe 控制器。在這些 VM 上,本機 SSD NVMe 連接的裝置名稱看起來會像 nvme0n1、nvme1n1 和 nvme2n1。連接的本機 SSD 數量取決於 VM 的機器類型。
第三代以上機器系列採用的運算執行個體,會將 NVMe 用於永久磁碟、Google Cloud Hyperdisk 和本機 SSD 磁碟。每個 VM 都有 1 個 NVMe 控制器,用於永久磁碟和 Hyperdisk,以及 1 個 NVMe 控制器,用於每個本機 SSD 磁碟。Persistent Disk 和 Hyperdisk NVMe 控制器具有單一 NVMe 命名空間,適用於所有連接的磁碟。因此,如果第 3 代機器系列執行個體有一個永久磁碟和一個 Hyperdisk (各含 2 個分割區),以及 2 個未格式化的本機 SSD 磁碟,則會使用下列裝置名稱:
nvme0n1- Persistent Disknvme0n1p1nvme0n1p2nvme0n2- Hyperdisknvme0n2p1nvme0n2p2nvme1n1- first Local SSDnvme2n1- 第二個本機 SSD
使用永久裝置命名
如要設定永久裝置名稱,請在 fstab 檔案中為磁碟裝置指派掛接點名稱。設定永久裝置名稱的方法有三種。
- 使用標籤。這個選項需要檔案系統支援標籤,且您必須在磁碟分割區中新增標籤。
- 使用分區或磁碟 UUID。 使用分區資料表建立磁碟時,系統會產生 UUID,且每個分區的 UUID 都不會重複。
- 使用 Persistent Disk 或 Google Cloud Hyperdisk 的永久磁碟 ID (
/dev/disk/by-id),或是以磁碟資源名稱為依據的符號連結。
建議您使用分割區 UUID 或 Linux VM 的符號連結。
分區 UUID
如要找出磁碟的 UUID,請按照下列步驟操作:
- 連線至 VM。
如果不知道磁碟的裝置名稱,可以使用符號連結找出磁碟裝置名稱。
ls -l /dev/disk/by-id/google-*
輸出結果會與下列內容相似:
lrwxrwxrwx 1 root root 9 Oct 23 15:58 /dev/disk/by-id/google-my-vm -> ../../sda lrwxrwxrwx 1 root root 10 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part1 -> ../../sda1 lrwxrwxrwx 1 root root 11 Oct 23 15:58 /dev/disk/by-id/google-my-vm-part15 -> ../../sda15 lrwxrwxrwx 1 root root 9 Oct 23 15:58 /dev/disk/by-id/google-my-vm-app-data -> ../../nvme0n1
執行下列任一指令,擷取磁碟的分割區 UUID:
blkidsudo blkid -s UUID
輸出結果會與下列內容相似:
/dev/sda1: UUID="4f570f2d-fffe-4c7d-8d8f-af347af7612a" /dev/sda15: UUID="E0B2-DFAF" /dev/nvme0n1: UUID="9e617251-6a92-45ff-ba40-700a9bdeb03e"
ls -lsudo ls -l /dev/disk/by-uuid/
輸出結果會與下列內容相似:
lrwxrwxrwx 1 root root 10 Sep 22 18:12 4f570f2d-fffe-4c7d-8d8f-af347af7612a -> ../../sda1 lrwxrwxrwx 1 root root 13 Sep 22 18:15 9e617251-6a92-45ff-ba40-700a9bdeb03e -> ../../nvme0n1 lrwxrwxrwx 1 root root 11 Sep 22 18:12 E0B2-DFAF -> ../../sda15
在
/etc/fstab檔案中新增裝置 UUID 的項目。UUID=9e617251-6a92-45ff-ba40-700a9bdeb03e /data ext4 defaults 0 0
在本例中,
/data是掛接點,ext4則是檔案系統類型。執行
mount -av,確認裝置已正確掛載。sudo mount -av
如果裝置掛接成功,輸出內容會與下列內容相似:
/ : ignored /boot/efi : already mounted mount: /data does not contain SELinux labels. You just mounted a file system that supports labels which does not contain labels, onto an SELinux box. It is likely that confine applications will generate AVC messages and not be allowed access to this filesystem. For more details see restorecon(8) and mount(8). /data : successfully mounted
永久磁碟 ID
如要使用永久磁碟 ID 或符號連結找出磁碟裝置名稱,請完成下列步驟:
- 連線至 VM。
執行下列指令,擷取磁碟上的 ID:
sudo ls -lh /dev/disk/by-id/google-*
輸出結果會與下列內容相似:
lrwxrwxrwx. 1 root root 9 May 16 17:34 google-disk-2 -> ../../sdb lrwxrwxrwx. 1 root root 9 May 16 09:09 google-persistent-disk-0 -> ../../sda lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part1 -> ../../sda1 lrwxrwxrwx. 1 root root 10 May 16 09:09 google-persistent-disk-0-part2 -> ../../sda2
如果是
NVME磁碟,輸出內容大致如下:lrwxrwxrwx 1 root root 13 Jun 1 10:27 google-disk-3 -> ../../nvme0n2 lrwxrwxrwx 1 root root 13 Jun 1 10:25 google-t2a -> ../../nvme0n1 lrwxrwxrwx 1 root root 15 Jun 1 10:25 google-t2a-part1 -> ../../nvme0n1p1 lrwxrwxrwx 1 root root 16 Jun 1 10:25 google-t2a-part15 -> ../../nvme0n1p15
將符號連結新增至
/etc/fstab檔案。/dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
執行
mount -av,確認裝置已正確掛載。sudo mount -av
如果裝置掛接成功,輸出內容會與下列內容相似:
/ : ignored /boot/efi : already mounted mount: /data does not contain SELinux labels. You just mounted a file system that supports labels which does not contain labels, onto an SELinux box. It is likely that confine applications will generate AVC messages and not be allowed access to this file system. For more details see restorecon(8) and mount(8). /data : successfully mounted