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),仅供参考

相关新闻

基于I型NPC三电平逆变器的PQ恒功率控制仿真建模与参数整定

基于I型NPC三电平逆变器的PQ恒功率控制仿真建模与参数整定

这些年做新能源并网方向,我前前后后调过不少逆变器拓扑,从最常规的两电平到各种多电平方案,但要说上手最频繁、工程价值最直接的,还是基于I型NPC的三电平并网逆变器。尤其是配合恒功率PQ闭环控制做仿真验证,几乎每做一…

2026/10/10 5:53:43 阅读更多 →
手艺人数字化:被算法遗忘的街边小店如何破圈?

手艺人数字化:被算法遗忘的街边小店如何破圈?

我家小区东门原来有一排底商,铁皮棚子搭的那种,最里面是一个修鞋摊。摊主姓刘,江苏人,在这儿干了十二年。去年年底他走了,棚子拆了,原地开了一家连锁奶茶店,开业头三天买一送一,队伍…

2026/10/10 5:53:43 阅读更多 →
Apache Zeppelin 数据源授权(Data Source Authorization):个人凭据管理与 JDBC 连接池实践

Apache Zeppelin 数据源授权(Data Source Authorization):个人凭据管理与 JDBC 连接池实践

数据分析数据可视化大数据后端 【免费下载链接】zeppelin Web-based notebook that enables data-driven, interactive data analytics and collaborative documents with SQL, Scala and more. 项目地址: https://gitcode.com/gh_mirrors/zeppelin1/zeppelin 点击查…

2026/10/10 5:52:43 阅读更多 →

最新新闻

Spring Boot+微信小程序高校共享图书借阅系统实战解析

Spring Boot+微信小程序高校共享图书借阅系统实战解析

去年帮某高校的一位学弟做毕设,对方只丢过来一句话:“想做一个高校共享图书借阅的小程序,后端用Spring Boot。”这句话听起来不难,但真正动手才发现,共享借阅这事儿背后藏着一整条业务链:用户身份认证、图书…

2026/10/10 6:33:57 阅读更多 →
基于Spring Boot+Vue的酒店管理系统毕业设计实现与避坑指南

基于Spring Boot+Vue的酒店管理系统毕业设计实现与避坑指南

做计算机毕业设计,选什么题目和选什么技术栈,往往比后面吭哧吭哧写代码更让人头疼。酒店管理系统这个题目,几乎是每年都会出现的经典款,但正因为它经典,所以踩坑记录、实现思路、避坑经验其实都可以被完整复刻。今天我…

2026/10/10 6:33:57 阅读更多 →
丝绸之路9.0数据管道实战:四层架构、增量同步与避坑指南

丝绸之路9.0数据管道实战:四层架构、增量同步与避坑指南

简介:丝绸之路9.0是一款面向服装行业从业者与打版技术人员的计算机辅助设计(CAD)系统,集设计、打版、放码与排料功能于一体,旨在提升服装企业的设计精度与生产效率。该软件需配合加密锁授权使用,以保障合法…

2026/10/10 6:33:57 阅读更多 →
Linux系统引导与systemd服务控制:从开机到排障的完整指南

Linux系统引导与systemd服务控制:从开机到排障的完整指南

1. 开机到登录:系统引导的完整接力流程记得刚入行那年,某天早上的第一条报警,竟然是一台数据库服务器“失联”了。登录管理平台一看,主机在线,可数据库服务就是没起来。当时我对Linux的理解还停留在“敲命令能出结果”…

2026/10/10 6:33:57 阅读更多 →
丝绸之路9.0:多源异构数据管道从采集到落库的工程实践

丝绸之路9.0:多源异构数据管道从采集到落库的工程实践

简介:这份资源是面向服装行业从业者与CAD学习者的「丝绸之路9.0」服装CAD系统安装包,集设计、打版、放码与排料功能于一体,需配合加密锁授权使用,适合服装企业技术人员及院校相关专业学生搭建实操环境。压缩包为rar格式&#xff0…

2026/10/10 6:33:56 阅读更多 →
用Codex调度DeepSeek:从自动填词到PV合成的工作流实战

用Codex调度DeepSeek:从自动填词到PV合成的工作流实战

这次我们来看一个相当有意思的 AI 应用项目:Codex/Deepseek harness 驱动的填词 PV 工作流。标题全称是“【Codex/Deepseek harness】来起舞吧 李文亚教授特供版填词PV”,本质上它不是在讲某个新模型,而是在讲一套“如何把大模型 API 包装成一…

2026/10/10 6:32:56 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →