最佳做法:在 Linux VM 上使用永久裝置名稱


本文件說明如何在 Linux VM 上使用永久裝置命名。

針對使用 Linux 作業系統的 VM,在執行下列程序後,裝置名稱 (例如 /dev/sda) 可能會變更:

  • 啟動及停止 VM
  • 卸離及重新連接磁碟
  • 變更機器類型

這種裝置名稱變更會發生,是因為在 VM 啟動或裝置連接時,裝置名稱會從可用範圍中指派。分離裝置或停止 VM 會釋放裝置名稱。當裝置重新連結或 VM 重新啟動時,系統會從可用範圍中指派新的裝置名稱。Linux 核心無法保證裝置在重新啟動後的順序。

變更裝置名稱可能會導致任何依賴原始裝置名稱的應用程式或指令碼無法正常運作,或導致 VM 在重新啟動後無法啟動。

建議您在參照 Linux VM 上的磁碟和分割區時,使用永久裝置命名方式,以免發生這個問題。您也可以使用符號連結

事前準備

  • 查看 Linux 作業系統的裝置管理功能:
  • 如果尚未設定,請先設定驗證機制。驗證是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要在本機開發環境中執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

在 Linux VM 上命名裝置

連接至 VM 的磁碟 Linux 裝置名稱,取決於您在建立磁碟時選擇的介面。使用 lsblk 作業系統指令查看磁碟裝置時,系統會針對透過 NVMe 介面連接的磁碟顯示前置字串 nvme,針對透過 SCSI 介面連接的磁碟顯示前置字串 sd

磁碟編號或 NVMe 控制器的順序無法預測,且在重新啟動 VM 時可能會不一致。首次開機時,永久磁碟可能會是 nvme0n1 (或 SCSI 的 sda)。在第二次啟動時,相同的永久磁碟裝置名稱可能會是 nvme2n1nvme0n3 (或 SCSI 的 sdc)。

存取已附加的磁碟時,請改用在 /dev/disk/by-id/ 中建立的符號連結。這些名稱會在重新啟動後保留。如要進一步瞭解符號連結,請參閱「連接至 VM 的磁碟符號連結」。

SCSI 裝置名稱

第一個連接的磁碟的 SCSI 連接磁碟裝置格式為 sda。磁碟分割區會顯示為 sda1。每個額外磁碟都會使用連續字母,例如 sdbsdc。當 sdz 達到上限時,新增的下一個磁碟名稱會是 sdaasdabsdac,以此類推,直到 sddx 為止。

NVMe 裝置名稱

在 Linux 作業系統中,NVMe 連接磁碟裝置的格式為 nvmenumbernnamespacenumber 代表 NVMe 磁碟控制器編號,namespace 則是 NVMe 磁碟控制器指派的 NVMe 命名空間 ID。對於分區,系統會在裝置名稱後方加上 pn,其中 n 是從 1 開始的數字,代表nth 分區。

控制器編號從 0 開始。附加至運算執行個體的單一 NVMe 磁碟,其裝置名稱為 nvme0n1。大多數機器類型都會使用單一 NVMe 磁碟控制器。接著,NVMe 裝置名稱會是 nvme0n1nvme0n2nvme0n3 等等。

連接至 第三代機器系列或後續執行個體的本機 SSD 磁碟,每個磁碟都有一個獨立的 NVMe 控制器。在這些 VM 上,本機 SSD NVMe 連接裝置的名稱會類似 nvme0n1nvme1n1nvme2n1。連接的本機 SSD 磁碟數量取決於 VM 的機器類型。

以第三代機器系列或更新版本為基礎的運算執行個體,會將 NVMe 用於永久磁碟、Google Cloud Hyperdisk 和本機 SSD 磁碟。每個 VM 都有 1 個 NVMe 控制器,用於永久磁碟和 Hyperdisk,以及 1 個 NVMe 控制器,用於每個本機 SSD 磁碟。永久磁碟和超磁碟 NVMe 控制器會為所有已連接的磁碟提供單一 NVMe 命名空間。因此,第 3 代機器系列執行個體會使用以下裝置名稱,其中包含一個永久磁碟和一個 Hyperdisk (各有 2 個分區),以及 2 個未格式化的本機 SSD 磁碟:

  • nvme0n1 - Persistent Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 - Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 - 第一個本機 SSD
  • nvme2n1 - 第二個本機 SSD

使用持續性裝置命名

如要設定持續性裝置名稱,請在 fstab 檔案中為磁碟裝置指派掛載點名稱。設定持續性裝置名稱的方法有三種。

  • 使用標籤。使用這個選項時,檔案系統必須支援標籤,且您必須在磁碟分區中新增標籤。
  • 使用分區或磁碟 UUID。使用分區表建立磁碟時,系統會產生 UUID,且每個分區的 UUID 皆不重複。
  • 使用永久磁碟或 Google Cloud Hyperdisk 的永久磁碟 ID (/dev/disk/by-id),或是根據磁碟資源名稱建立的符號連結

建議您為 Linux VM 使用分割區 UUID 或符號連結。

分區 UUID

如要找出磁碟的 UUID,請執行下列步驟:

  1. 連線至 VM。
  2. 如果不知道磁碟的裝置名稱,可以使用符號連結找出磁碟裝置名稱。

    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
      

  3. 執行下列其中一個指令,擷取磁碟分區的 UUID:

    • blkid

      sudo  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 -l

      sudo 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
      
  4. /etc/fstab 檔案中新增裝置的 UUID 項目。

    UUID=9e617251-6a92-45ff-ba40-700a9bdeb03e /data ext4 defaults 0 0
    

    在這個範例中,/data 是掛接點,ext4 是檔案系統類型。

  5. 執行 mount -av 來驗證裝置是否已正確掛載。

    sudo mount -av

    如果裝置已成功掛載,輸出內容會類似以下內容:

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an 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 或符號連結找出磁碟裝置名稱,請完成下列步驟:

  1. 連線至 VM。
  2. 執行下列指令,擷取磁碟上的 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
    
  3. 將符號連結新增至 /etc/fstab 檔案。

    /dev/disk/by-id/google-disk-2 /data ext4 defaults 0 0
    
  4. 執行 mount -av 來驗證裝置是否已正確掛載。

    sudo mount -av

    如果裝置已成功掛載,輸出內容會類似以下內容:

    /                           : ignored
    /boot/efi                : already mounted
    mount: /data does not contain SELinux labels.
    You just mounted an 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