磁盘和文件系统概览

本页面简要介绍了 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 下的目录中。

磁盘装载和格式设置

使用 Container-Optimized OS 时,您可以附加永久性磁盘,也可创建使用本地 SSD 的实例。根据适当的用例,按照格式化并装载永久性磁盘格式化并装载本地 SSD 设备中的说明操作。

您可以通过在 /mnt/disks 目录下创建子目录来装载磁盘。由于 /etc/ 在 Container-Optimized OS 上是无状态的,因此您无法使用 /etc/fstab 自动执行 fsck(文件系统一致性检查)并在启动时装载磁盘。但是您可以通过 cloud-configbootcmd 部分执行这些操作,从而实现相同的目标。

以下示例会将磁盘 DEVICE_ID 装载到 /mnt/disks 目录下。

  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 标志更新虚拟机元数据,使其包含脚本文件。

    如需创建虚拟机,请使用以下命令:

    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:虚拟机实例的名称。
    • SCRIPT_FILE_NAME:元数据脚本文件的名称。