磁碟和檔案系統總覽

本頁面將概略說明 Container-Optimized OS 檔案系統,並說明如何掛接及格式化磁碟。

檔案系統

Container-Optimized OS 節點映像檔檔案系統版面配置經過最佳化,以強化節點安全性。開機磁碟的空間分成三種類型的分區:

  • 根分區,以唯讀模式掛接
  • 有狀態分區,可寫入且為有狀態。
  • 無狀態分區,可寫入,但內容在重新開機後會遺失。

使用 Container-Optimized OS 時,如果您執行自己的服務,且該服務對於容器外部的檔案系統版面配置有特定需求,那麼請留意分區問題。

根檔案系統會以唯讀模式掛接,以保護系統完整性。不過,主目錄和 /mnt/stateful_partition 是永久性且可寫入的。

使用 Container-Optimized OS 檔案系統

以下是 Container-Optimized OS 節點映像檔檔案系統中的路徑清單,以及其屬性和建議用法:

路徑 屬性 用途
/
  • 唯讀
  • 可執行
根檔案系統會以唯讀模式掛接,以維護完整性。核心會在啟動期間驗證根檔案系統的完整性,並在發現錯誤時拒絕啟動。
/home
/var
  • 可寫入
  • 不可執行
  • 有狀態
這些路徑是用來儲存會在開機磁碟的生命週期內持續存在的資料。這些路徑均掛接自 /mnt/stateful_partition
/var/lib/google
/var/lib/docker
/var/lib/toolbox
  • 可寫入
  • 可執行
  • 有狀態
這些路徑分別是 Compute Engine 套件 (例如帳戶管理工具服務)、Docker 和工具箱的工作目錄。
/var/lib/cloud
  • 可寫入
  • 可執行
  • 無狀態
  • tmpfs
這個路徑是 cloud-init 套件的工作目錄。
/etc
  • 可寫入
  • 可執行
  • 無狀態
  • tmpfs
通常會保存您的設定 (例如透過 cloud-init 定義的 systemd 服務)。建議您將想要的執行個體狀態擷取到 cloud-init 中,因為執行個體在剛建立及剛重新啟動時會套用 cloud-init
/tmp
  • 可寫入
  • 不可執行
  • 無狀態
  • tmpfs
通常是做為臨時儲存空間,因此請勿用來存放永久性的資料。
/mnt/disks
  • 可寫入
  • 可執行
  • 無狀態
  • tmpfs
您可以在 /mnt/disks 底下的目錄中掛接永久磁碟。

掛接並格式化磁碟

使用容器最佳化 OS 時,您可以連接永久磁碟,或建立具有本機 SSD 的執行個體。請參閱格式化及掛接永久磁碟格式化並掛接本機 SSD 裝置的指示說明,依照合適的使用案例進行操作。

您可以建立 /mnt/disks 目錄下的子目錄,掛接磁碟。由於 /etc/ 在 Container-Optimized OS 上是無狀態的,因此您無法使用 /etc/fstab 自動執行 fsck (檔案系統一致性檢查),並在開機時掛載磁碟。不過,您也可以在 cloud-configbootcmd 部分執行這些作業,達到相同的效果。

以下範例會在 /mnt/disks 目錄下掛接磁碟 DEVICE_ID

  1. 使用下列內容建立指令碼檔案:

    #cloud-config
    
    bootcmd:
    - fsck.ext4 -tvy /dev/DEVICE_ID
    - mkdir -p /mnt/disks/MNT_DIR
    - mount -t ext4 -o ... /dev/DEVICE_ID /mnt/disks/MNT_DIR
    

    更改下列內容:

    • DEVICE_ID:要格式化及掛接的磁碟裝置 ID。
    • MNT_DIR:掛接磁碟的目錄。

    如要瞭解 fsck.ext4mount 指令支援的完整選項,請參閱 Linux 說明文件。

  2. 使用 --metadata-from-file 旗標更新 VM 中繼資料,以便納入指令碼檔案。

    如要建立 VM,請使用下列指令:

    gcloud compute instances create INSTANCE_NAME \
        --metadata-from-file user-data=SCRIPT_FILE_NAME
    

    如要更新現有執行個體,請使用下列指令:

    gcloud compute instances add-metadata INSTANCE_NAME \
        --metadata-from-file user-data=SCRIPT_FILE_NAME
    

    更改下列內容:

    • INSTANCE_NAME:VM 執行個體的名稱。
    • SCRIPT_FILE_NAME:中繼資料指令碼檔案的名稱。