Incus CephFS 存储驱动详解:基于 Ceph 分布式文件系统的自定义卷存储

发布时间:2026/10/10 5:53:33
Incus CephFS 存储驱动详解:基于 Ceph 分布式文件系统的自定义卷存储 后端虚拟化容器运行时【免费下载链接】incusPowerful system container and virtual machine manager项目地址https://gitcode.com/gh_mirrors/inc/incus点击查看免费下载本篇技术指南围绕 Incus 的cephfs存储驱动展开讲解如何利用 Ceph 的分布式文件系统组件 CephFS 为 Incus 提供远程、可共享的文件系统存储涵盖驱动适用场景、Ceph 术语、存储池与存储卷的全部配置项以及源码层面的创建、挂载与校验机制。读完本文你将掌握在 Incus 中创建并管理 CephFS 存储池的完整配置方法理解source、cephfs.create_missing、cephfs.data_pool、cephfs.meta_pool等核心参数的作用与底层实现并能在多节点集群中正确规划此类存储的用途。CephFS 与 Incus 存储体系cephfs是 Incus 提供的众多存储驱动之一对应 doc/reference/storage_cephfs.md 中定义的驱动名称。CephFSCeph File System是 Ceph 的文件系统组件提供了一个健壮、功能完整且符合 POSIX 规范的分布式文件系统。在内部实现上CephFS 将文件映射到 Ceph 对象object上存储并将文件元数据例如文件属主、目录路径、访问权限存放在一个独立的数据池中。Ceph 本身是一个开源存储平台数据保存在基于 RADOSReliable Autonomic Distributed Object Store可靠自主分布式对象存储的存储集群中。它具有很高的可扩展性并且由于是无单点故障的分布式系统可靠性也非常出色。Ceph 为块存储和文件系统提供了不同的组件Ceph RBDRADOS Block DeviceCeph 的块存储组件将数据和工作负载分布到整个 Ceph 集群支持精简配置thin provisioning因此允许资源超配。在 Incus 中对应ceph驱动。CephFSCeph 的文件系统组件即本文介绍的cephfs驱动所使用的底层存储。需要特别注意的是Incus 中名为ceph的驱动只使用 Ceph RBD块存储功能而非完整的 Ceph 功能若需要基于 Ceph 提供文件系统类型的存储卷则应选用cephfs驱动。Ceph 基础术语在深入配置之前先厘清 Ceph 的常用术语源自 doc/reference/storage_ceph.md 中共享的 Ceph 术语说明对象ObjectCeph 存储数据的基本单位。OSDObject Storage Daemon对象存储守护进程负责存储和管理数据的守护进程。池PoolCeph 存储的逻辑分区用于存放对象也被称为数据池data pool、存储池storage pool或 OSD 池OSD pool。一个CephFS 文件系统由两个 OSD 存储池组成一个存放实际的数据另一个存放文件的元数据。这种数据与元数据分离的设计是 CephFS 高性能与可扩展性的基础。cephfs驱动在 Incus 中的定位Incus 的cephfs驱动并不是一个通用的块存储驱动它有着明确的适用范围。原文档明确指出cephfs驱动只能用于内容类型content type为filesystem的自定义存储卷。对于其他类型的存储卷应使用ceph驱动。ceph驱动同样可以为内容类型为filesystem的自定义存储卷提供服务但它的实现方式是在 Ceph RBD 镜像之上叠加一个文件系统由block.filesystem配置项控制详见 doc/reference/storage_ceph.md。这种模拟方式带来一个关键限制由于文件系统叠加在单个 RBD 镜像之上内容类型为filesystem的自定义存储卷同一时刻只能被分配给一个实例如果需要多个实例甚至是不同集群成员上的实例同时共享一个filesystem类型的自定义卷就必须使用cephfs驱动。这一约束在驱动源码中有直接体现。driver_cephfs.go 中Info()方法返回的驱动信息显示VolumeTypes: []VolumeType{VolumeTypeCustom}, // 仅支持自定义存储卷 VolumeMultiNode: d.isRemote(), // 支持多节点共享 BlockBacking: false, // 非块设备后端 MountedRoot: true, // 以挂载根路径方式使用而CreateVolume的实现driver_cephfs_volumes.go则对卷类型做了硬性校验非自定义卷VolumeTypeCustom或非文件系统内容类型ContentTypeFS都会直接返回ErrNotSupported。这从源码层面印证了仅用于 filesystem 内容类型的自定义存储卷这一限制。与本地存储驱动的差异与大多数存储驱动不同cephfs驱动不会主动搭建存储系统而是假定你已经安装并运行了一个可访问的 Ceph 集群这与ceph驱动共享同一前提。此外cephfs提供的是远程存储受内部网络影响存储访问可能比本地存储稍慢但在集群环境中远程存储具有巨大优势——所有集群成员都能访问完全相同的存储池与内容无需在成员之间同步存储池数据。从源码看driver_cephfs.go 中的isRemote()方法直接返回trueInfo()中的Remote与VolumeMultiNode字段均以此为据确认了该驱动属于远程、多节点可共享的存储类型。池的完全控制权Incus 假定自己拥有对 OSD 存储池的完全控制权。因此不应在 Incus 使用的 OSD 存储池中维护任何非 Incus 拥有的文件系统实体因为 Incus 可能会将其删除。这一原则同样适用于ceph驱动属于两个 Ceph 相关驱动共享的行为约定。创建 CephFS 存储池的两种方式cephfs驱动提供了两种接入 CephFS 文件系统的方式二者通过配置项组合决定使用已有文件系统预先在 Ceph 集群中创建好 CephFS 文件系统然后通过存储池的source配置项指定要使用的文件系统或文件系统路径。自动创建设置cephfs.create_missing为trueIncus 会自动创建文件系统以及配置项cephfs.data_pool和cephfs.meta_pool所指定的数据与元数据 OSD 池。从 driver_cephfs.go 的Create()实现可以完整还原这套流程的底层逻辑首先检查source配置缺失时直接报错Missing required source name/path将cephfs.path与source进行一致性校验cephfs.path必须与source匹配并解析出文件系统名fsName与路径fsPath调用fsExists()判断目标 CephFS 是否已存在。若已存在则拒绝设置cephfs.create_missing、cephfs.osd_pg_num、cephfs.meta_pool、cephfs.data_pool等与创建文件系统相关的键若文件系统不存在则必须设置cephfs.create_missingtrue否则报错The requested CephFS doesnt exist。创建时cephfs.osd_pg_num若未指定源码中会默认设为32注释说明 Ceph 会在必要时自动调整该值依次检查并创建元数据池与数据池缺失时执行ceph osd pool create最后通过ceph fs new fsName meta_pool data_pool创建文件系统完成创建后Incus 会临时挂载该文件系统创建source指定的目录路径并要求该路径必须为空源码中Only empty CephFS paths can be used as a storage pool。整个流程由revert机制兜底任何一步失败都会回滚已创建的 OSD 池与文件系统。fsExists()与osdPoolExists()的具体实现位于 driver_cephfs_utils.go两者都通过调用ceph命令查询并依据退出码判断错误状态码为2时确认目标不存在其他非零状态码则视为无法确定可能为网络问题或 Ceph 内部问题直接返回错误。挂载的底层实现cephfs驱动通过内核 Ceph 文件系统挂载 CephFS。在 utils_ceph.go 的CephBuildMount()中Incus 会从 Ceph 集群收集三样关键信息来构造挂载参数FSIDCephFsid()Ceph 集群的唯一标识MonitorsCephMonitors()monitor 节点地址列表优先使用 v2 协议地址ms_modeprefer-crc否则回退到 v1 协议ms_modelegacyKeyringCephKeyring()客户端密钥。若密钥为空则认为禁用了 cephx 认证。最终构造出的挂载源形如userfsid.fsName/path挂载选项包含mon_addr、name、secret等随后通过TryMount()挂载到GetPoolMountPath(d.name)driver_cephfs.go。Mount()方法会先检查挂载点是否已是 Ceph 挂载点避免重复挂载。存储池配置选项下表整理了cephfs驱动的存储池配置项源自 doc/config_options.txt 中storage_cephfs-common配置组同时对应 driver_cephfs.go 中Validate()的校验规则配置项类型默认值作用域说明sourcestring-必填本地local要使用的现有 CephFS 文件系统或文件系统路径创建存储池时必填cephfs.cluster_namestringceph全局global包含 CephFS 文件系统的 Ceph 集群名称对应常量CephDefaultCluster见 driver_ceph_utils.gocephfs.user.namestringadmin全局global使用的 Ceph 用户默认admin对应常量CephDefaultUsercephfs.create_missingboolfalse全局global是否自动创建文件系统以及缺失的数据、元数据 OSD 池cephfs.data_poolstring-全局global创建文件系统时使用的数据 OSD 池名称cephfs.meta_poolstring-全局global创建文件系统时使用的元数据 OSD 池名称cephfs.osd_pg_numstring-创建时实际默认32全局global创建缺失 OSD 池时使用的pg_num值cephfs.pathstring/全局globalCephFS 挂载的基础路径cephfs.fscacheboolfalse全局global是否启用内核fscache与cachefilesd缓存volatile.pool.pristinestringtrue全局global记录 CephFS 文件系统在创建时是否为空的内部状态其中几个关键配置项的源码行为值得展开cephfs.cluster_name与cephfs.user.name在 driver_cephfs.go 的FillConfig()中若二者为空会自动填充默认值ceph与admin。所有底层ceph命令都会以--name client.user和--cluster cluster的方式携带这两个参数。source的必填性Create()中若source为空会直接报错它是连接具体 CephFS 文件系统的唯一入口。cephfs.path与source的关系cephfs.path可以理解为存储池在 CephFS 文件系统中的子路径创建时若两者不一致会报错cephfs.path must match the source。cephfs.fscache使用validate.Optional(validate.IsBool)校验开启后允许内核通过fscache/cachefilesd对 CephFS 数据做本地缓存可提升热点数据访问性能但需宿主机内核与用户态支持。创建存储池示例使用已有 CephFS 文件系统创建存储池incus storage create mypool cephfs sourcemyfs/data cephfs.cluster_nameceph cephfs.user.nameadmin自动创建文件系统及 OSD 池incus storage create mypool cephfs \ cephfs.create_missingtrue \ cephfs.meta_poolmyfs_meta \ cephfs.data_poolmyfs_data \ cephfs.osd_pg_num64 \ cephfs.path/data需要注意cephfs.path指定的路径在文件系统创建时必须为空否则创建会被拒绝。存储卷配置选项cephfs驱动存储池中的存储卷同样支持一组配置项源自 doc/config_options.txt 中storage_volume_cephfs-common配置组。由于该驱动仅支持filesystem内容类型的自定义卷多数选项与文件权限、ID 映射和快照管理相关配置项类型默认值生效条件说明sizestring同volume.size适用驱动存储卷的大小/配额initial.uidint同volume.initial.uid或0filesystem自定义卷卷在实例中的属主 UIDinitial.gidint同volume.initial.gid或0filesystem自定义卷卷在实例中的属主 GIDinitial.modeint同volume.initial.mode或711filesystem自定义卷卷在实例中的权限模式security.sharedbool同volume.security.shared或false自定义块卷允许卷被多个实例共享对cephfs而言天然多实例可共享security.shiftedbool同volume.security.shifted或false自定义卷启用 ID 移位ID shifting使卷在实例内以隔离的 ID 范围呈现security.unmappedbool同volume.security.unmapped或false自定义卷禁用卷的 ID 映射snapshots.expirystring同volume.snapshot.expiry自定义卷快照自动过期时间snapshots.expiry.manualstring同volume.snapshot.expiry.manual自定义卷手动快照的过期时间snapshots.patternstring同volume.snapshot.pattern或snap%d自定义卷自动快照的命名模式其中%d会被替换为时间戳等参数snapshots.schedulestring同volume.snapshot.schedule自定义卷自动快照的调度计划cron 格式这些选项与cephfs驱动能力的对应关系如下共享能力cephfs驱动天然支持多实例共享filesystem自定义卷VolumeMultiNode为true这是它相对于ceph驱动的核心优势之一。ID 映射security.shifted与security.unmapped控制卷在实例内的 ID 映射行为与 Incus 通用的 ID 映射机制一致。初始属主与权限initial.uid/initial.gid/initial.mode决定卷挂载进实例时的属主与权限位默认分别为0/0/711。快照支持与迁移行为原文档明确指出如果服务器端启用了快照功能cephfs驱动支持快照。结合 driver_cephfs.go 的MigrationTypes()实现可以看出该驱动的数据迁移包括卷复制、迁移、备份恢复走的是rsync通道if contentType ! ContentTypeFS { return nil } // Do not support xattr transfer on cephfs return []localMigration.Type{ { FSType: migration.MigrationFSType_RSYNC, Features: rsyncFeatures, // delete compress(可选) bidirectional }, }值得注意的细节是cephfs驱动不支持 xattr扩展属性传输即通过 rsync 迁移卷时不会保留扩展属性。rsyncFeatures会根据rsync.compression配置决定是否携带compress特性。此外Info()中OptimizedImages与PreservesInodes均为false说明该驱动既没有针对镜像的优化路径也不保留 inode 编号——这与 CephFS 的元数据存储模型一致。卷的复制CreateVolumeFromCopy与备份恢复CreateVolumeFromBackup也均基于 rsync/归档解包实现见 driver_cephfs_volumes.go。运行环境要求与注意事项综合源码与文档使用cephfs驱动前需要确认以下前提Ceph 集群可用驱动不负责搭建存储系统必须预先准备一个可访问的 Ceph 集群并提供 monitor、FSID 与客户端密钥信息。宿主机工具driver_cephfs.go 的load()会校验宿主机上是否存在ceph与rbd两个命令缺失任一都会报Required tool xxx is missing同时会记录rbd --version输出版本作为驱动版本。IncusOS 场景若运行在 IncusOS 环境load()还会检查ceph服务是否已启用。内核挂载支持驱动通过内核 Ceph 文件系统挂载TryMount(..., ceph, ...)宿主机内核需包含 Ceph 文件系统支持。路径必须为空用作存储池的 CephFS 路径在创建时必须为空目录。存储池专属性不要在与 Incus 共用的 OSD 池中放置非 Incus 管理的实体Incus 可能将其删除。与其他驱动的选型小结在 Incus 的存储规划中cephfs与ceph两个驱动均基于 Ceph 但定位不同原文档给出的选型要点如下需要块存储实例镜像、块设备卷→ 使用ceph驱动RBD。需要可多实例共享的filesystem自定义卷→ 使用cephfs驱动。ceph驱动也可承载filesystem内容类型的自定义卷但同一时刻只能绑定一个实例cephfs驱动则可跨实例、跨集群成员共享。综上cephfs驱动是 Incus 中面向分布式共享文件系统卷场景的专用方案。若你的部署需要多个容器/虚拟机同时读写同一份自定义卷数据例如共享代码目录、共享配置、横向扩展的工作节点并且底层已有 Ceph 集群cephfs就是原文档推荐的实现路径。更进一步地可结合 doc/howto/storage_pools.md 了解存储池的通用管理命令或阅读 doc/reference/storage_ceph.md 对比 Ceph RBD 驱动的完整能力与限制从而在 doc/reference/storage_drivers.md 所述的各驱动之间做出合理选择。赞分享后端虚拟化容器运行时【免费下载链接】incusPowerful system container and virtual machine manager项目地址https://gitcode.com/gh_mirrors/inc/incus点击查看免费下载相关推荐my2sql高级功能全解析DML统计、大事务分析与数据库监控my2sql高级功能全解析DML统计、大事务分析与数据库监控 my2sql是一款强大的MySQL binlog解析工具能够生成原始SQL、回滚SQL、去除主数据库数据同步CLIConsoleControl与NuGet集成快速部署与版本管理的完整流程ConsoleControl与NuGet集成快速部署与版本管理的完整流程 ConsoleControl是一个强大的C 类库能够帮助开发者在WinForms或UI库/组件开发工具Incus存储管理完全攻略ZFS、Btrfs、Ceph等存储驱动深度对比Incus存储管理完全攻略ZFS、Btrfs、Ceph等存储驱动深度对比 Incus是一个强大的系统容器和虚拟机管理器其存储管理功能提供了多种存储驱动程序来后端虚拟化容器运行时上一篇终极Adobe破解指南GenP 3.0免费解锁完整教程下一篇虚拟摇杆驱动vJoyWindows游戏开发的终极输入模拟解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询