將永久磁碟新增至 VM

按照本頁的說明,建立非開機磁碟並連結至虛擬機器 (VM)。

事前準備

如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。Distributed Cloud 的所有指令都使用 gdcloudkubectl CLI,且需要作業系統 (OS) 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  2. 使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER

要求權限和存取權

如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。按照步驟驗證您在 VM 所在專案的命名空間中,是否具備專案 VirtualMachine 管理員 (project-vm-admin) 角色。

如要使用 GDC 控制台或 gdcloud CLI 執行 VM 作業,請要求專案 IAM 管理員同時指派專案 VirtualMachine 管理員角色和專案檢視者 (project-viewer) 角色。

將磁碟連接至 VM

建立非開機磁碟並附加至 VM。每個額外磁碟都可以指定自訂映像檔或空白磁碟。您可以一次將多個磁碟新增至 VM。

主控台

  1. 在導覽選單中,依序點選「Virtual Machines」>「Instances」

  2. 在 VM 清單中,按一下 VM 名稱即可查看詳細資料。

  3. 點選「新增磁碟」

  4. 在確認對話方塊中,按一下「停止」停止 VM。

  5. 請稍待幾分鐘,讓 VM 停止運作。

  6. 按一下 [更新]

  7. VM 處於停止狀態時,再次點選「新增磁碟」

  8. 在「新增磁碟」對話方塊中,選擇新磁碟或現有磁碟。

    • 如要佈建新磁碟,請按一下「New disk」(新磁碟) 分頁。

      1. 在「磁碟名稱」欄位中,輸入專案專屬的新磁碟名稱。
      2. 在「Size」(大小) 欄位中,輸入介於 10 至 65536 GiB 之間的磁碟大小。例如 10 GiB
      3. 在「刪除規則」部分,按一下「保留磁碟」或「刪除磁碟」
    • 如要選擇現有磁碟,請按一下「現有磁碟」分頁標籤。

      1. 在「Disk」清單中選取磁碟。
      2. 在「刪除規則」部分,按一下「保留磁碟」或「刪除磁碟」
  9. 按一下 [儲存]。磁碟會顯示在 VM 的磁碟清單中。

  10. 重新啟動 VM

API

  1. 建立 VirtualMachineDisk

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -n PROJECT -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: NON_BOOT_BLANK_DISK
    spec:
      size: NON_BOOT_BLANK_DISK_SIZE
    EOF
    
  2. 停止 VM

  3. VirtualMachineDisk 新增至現有 VirtualMachine spec.disks

    kubectl --kubeconfig MANAGEMENT_API_SERVER edit virtualmachines.virtualmachine.gdc.goog -n PROJECT VM_NAME
    

    在文字編輯器中編輯下列項目:

    ...
    disks:
    - virtualMachineDiskRef:
        name: VM_BOOT_DISK_NAME
        boot: true
    - virtualMachineDiskRef:
        name: NON_BOOT_BLANK_DISK
        autoDelete: false
    ...
    

    使用下列定義替換變數。

    變數定義
    MANAGEMENT_API_SERVER 管理 API 伺服器 kubeconfig 檔案。
    PROJECT 要在其中建立 VM 的 Google Distributed Cloud 實體隔離 (GDC) 專案。
    VM_NAME新 VM 的名稱。
    VM_BOOT_DISK_NAME新 VM 開機磁碟的名稱。
    NON_BOOT_BLANK_DISK額外磁碟的名稱。
    NON_BOOT_BLANK_DISK_SIZE額外磁碟的大小,例如 20G
  4. 啟動 VM

格式化及掛接非開機磁碟

將磁碟連接至 VM 後,請執行下列必要步驟,確保 VM 可以存取磁碟。

連線至 VM

透過 SSH 連線至 VM

格式化磁碟

  1. 依序號列出附加至執行個體的磁碟,並找出要格式化和掛接的磁碟。

    ls -l /dev/disk/by-id/
    

    這個範例輸出內容會以序號顯示磁碟名稱:

       total 0
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 ata-QEMU_HARDDISK_agentSADisk -> ../../sdc
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-0ATA_QEMU_HARDDISK_agentSADisk -> ../../sdc
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot -> ../../sda
       lrwxrwxrwx 1 root root 10 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part1 -> ../../sda1
       lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part14 -> ../../sda14
       lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part15 -> ../../sda15
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-1ATA_QEMU_HARDDISK_agentSADisk -> ../../sdc
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-SATA_QEMU_HARDDISK_agentSADisk -> ../../sdc
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot -> ../../sda
       lrwxrwxrwx 1 root root 10 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part1 -> ../../sda1
       lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part14 -> ../../sda14
       lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part15 -> ../../sda15
       lrwxrwxrwx 1 root root  9 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb
    

    每行箭頭 -> 後方的資訊,代表磁碟裝置名稱。舉例來說,在 scsi-SQEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb 中,序號為 scsi-SQEMU_QEMU_HARDDISK_vm-disk-data裝置名稱為 sdb

  2. 從這份清單找出磁碟序號。

    可能影響序號清單的重要情境功能行為:

    • 如果 virtualMachineDiskRef.name 值超過 20 個字元,系統只會使用前 20 個字元做為序號。
    • 如果兩個磁碟的前 20 個字元相同,只有第一個磁碟有序號。
  3. 格式化磁碟:

   sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/DISK_ID
  • DISK_ID 替換為要格式化的磁碟序號。
  • 本範例指定 scsi-SQEMU_QEMU_HARDDISK_vm-disk-data,以格式化沒有磁區分割表的整個磁碟。

為獲得最高的磁碟效能,請在 -E 旗標中,使用建議的格式化選項。由於不需要在次要磁碟上保留根磁碟區空間,請指定 -m 0 以使用全部的可用磁碟空間。

掛接磁碟

  1. 建立做為新磁碟掛接點的目錄。您可以使用任何目錄。下列範例會在 /mnt/disks/ 中建立目錄:

    sudo mkdir -p /mnt/disks/MOUNT_DIR
    

    MOUNT_DIR 替換為要掛接磁碟的目錄。

  2. 將磁碟掛接至執行個體,並啟用捨棄選項:

    sudo mount -o discard,defaults /dev/disk/by-id/DISK_ID /mnt/disks/MOUNT_DIR
    

    更改下列內容:

    • DISK_ID,其中包含要掛接磁碟的序號。
    • MOUNT_DIR 替換為要掛接磁碟的目錄。
  3. 選用:設定磁碟的讀取與寫入權限。下列指令會授予所有使用者磁碟的寫入 (a+w) 存取權。

    sudo chmod a+w /mnt/disks/MOUNT_DIR
    
  4. 選用:設定在 VM 重新啟動時自動掛接 - 使用通用唯一識別碼 (UUID)開機指令碼

設定在 VM 重新啟動時自動掛接 - 磁碟 UUID

將磁碟新增至 /etc/fstab 檔案,這樣 VM 重新啟動時,磁碟就會自動再次掛接。在作業系統 (OS) 中,裝置名稱會在每次重新啟動時變更,但裝置 UUID 一律會指向相同磁碟區,即使您在系統之間移動磁碟也是如此。因此,請務必使用裝置 UUID,在 VM 重新啟動時設定自動掛接。

  1. 建立目前 /etc/fstab 檔案的備份:

      sudo cp /etc/fstab /etc/fstab.backup
    
  2. 列出磁碟的 UUID

      sudo blkid /dev/DEVICE_NAME
    

    範例輸出內容會顯示磁碟的 UUID accc19c5-d0d6-4157-9672-37d4e1d48eb5

      /dev/sdb: UUID="accc19c5-d0d6-4157-9672-37d4e1d48eb5" TYPE="ext4"
    

    DEVICE_NAME 是您要自動掛接的磁碟裝置名稱。如果您在磁碟上建立了磁區分割表,請在裝置名稱後方加上後置字元,指定要掛接的分區。舉例來說,如果 sdb 是磁碟裝置名稱,且您要掛接分區 1,則 DEVICE_NAME 會變成 sdb1

  3. 以文字編輯器開啟 /etc/fstab 檔案,並建立包含 UUID 的項目:

      UUID=UUID_VALUE /mnt/disks/MOUNT_DIR ext4 discard,defaults,MOUNT_OPTION 0 2
    

    更改下列內容:

    • UUID_VALUE,其中 UUID 是磁碟,列為「列出 UUID」指令的輸出內容。
    • MOUNT_DIR 替換為您掛接磁碟的目錄。
    • MOUNT_OPTION,並為作業系統指定 MOUNT_OPTION 值,說明作業系統在開機時無法掛接磁碟時應執行的動作。
  4. 確認 /etc/fstab 項目是否正確:

      cat /etc/fstab
    

    以下是輸出內容範例:

      LABEL=cloudimg-rootfs /    ext4   defaults    0 1
      LABEL=UEFI    /boot/efi   vfat    umask=0077  0 1
      UUID=UUID_VALUE /mnt/disks/MOUNT_DIR ext4 discard,defaults,MOUNT_OPTION 0 2
    

如果您卸離此磁碟,或從這個 VM 的開機磁碟建立快照,請編輯 /etc/fstab 檔案,並移除此磁碟的項目。即使您已將 MOUNT_OPTION 設為 nofailnobootwait,也請將 /etc/fstab 檔案與連結至 VM 的裝置保持同步處理。請在建立開機磁碟快照或卸離磁碟前,移除這些項目。

設定在 VM 重新啟動時自動掛接 - VM 開機指令碼

您也可以使用開機指令碼,在每次重新開機時掛接磁碟,方法是將「掛接磁碟」中的指令新增至開機指令碼。在新增指令碼來掛接磁碟之前,請先使用「格式化磁碟」中的指令格式化磁碟。

  1. 建立開機指令碼密鑰。

    cat <<EOF >>mount-disk-script
    #!/bin/bash
    mkdir -p /mnt/disks/MOUNT_DIR
    mount -o discard,defaults /dev/disk/by-id/DISK_ID /mnt/disks/MOUNT_DIR
    EOF
    
    kubectl create secret -n PROJECT generic VM_NAME-mount-script --from-file=script=mount-disk-script
    
    rm mount-disk-script
    
  2. 將開機指令碼新增至 VM。

    kubectl --kubeconfig MANAGEMENT_API_SERVER edit virtualmachines.virtualmachine.gdc.goog -n PROJECT VM_NAME
    

    編輯 spec.startupScripts 以加入密鑰名稱。

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
    name: VM_NAME
    namespace: PROJECT
    spec:
    …
    startupScripts:
    - name: mount-script
      scriptSecretRef:
        name: VM_NAME-mount-script
    

如要進一步瞭解如何設定啟動指令碼,請參閱這篇文章