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


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

如果 VM 使用 Linux 作業系統,執行下列程序後,裝置名稱 (例如 /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 連接的磁碟裝置格式為 nvmenumbernnamespace。其中 number 代表 NVMe 磁碟控制器編號,而 namespace 是由 NVMe 磁碟控制器指派的 NVMe 命名空間 ID。如果是分區,裝置名稱會附加 pn,其中 n 是從 1 開始的數字,表示第 n 個分區。

控制器編號從 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 磁碟。永久磁碟和 Hyperdisk NVMe 控制器會為所有附加的磁碟提供單一 NVMe 命名空間。因此,第 3 代機器系列執行個體 (含一個永久磁碟和一個 Hyperdisk,各含 2 個磁碟分區) 和 2 個未格式化的本機 SSD 磁碟,會使用下列裝置名稱:

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

使用永久裝置命名

如要設定永久裝置名稱,請在 fstab 檔案中為磁碟裝置指派掛接點名稱。您可以透過三種方式設定永久裝置名稱。

  • 使用標籤。 如要使用這個選項,檔案系統必須支援標籤,且您已在磁碟分區中加入標籤。
  • 使用分區或磁碟 UUID。 使用分區表建立磁碟時,系統會產生 UUID,且每個分區的 UUID 都不相同。
  • 使用 Persistent Disk 或 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