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

本文說明如何在 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

    1. 安裝 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 Disk
  • nvme0n1p1
  • nvme0n1p2
  • nvme0n2 - Hyperdisk
  • nvme0n2p1
  • nvme0n2p2
  • nvme1n1 - first Local SSD
  • nvme2n1 - 第二個本機 SSD

使用永久裝置命名

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

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

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

分區 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 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 或符號連結找出磁碟裝置名稱,請完成下列步驟:

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