VCF许可证统一监控实战:从PowerCLI采集到Prometheus告警
监控告警大屏上突然飘红了一条消息某 VCF 集群 vSAN 容量许可使用率已到 95%。由于环境前几天刚从 10 个节点扩到 14 个节点我第一反应是容量余量不够了于是赶紧去查许可证台账。结果翻遍运维文档也没找到一份完整的清单——vCenter 里能看到一部分NSX Manager 上有一部分独立部署环境里还有一部分而且口径完全对不上。折腾了快两个小时才确认是虚惊一场但监控场景下的许可证管理这个事从那之后就彻底成了我的一块心病。VCF 运维集群和独立部署环境在监控场景下许可证管理一直是个很容易被忽略的环节。大家通常会把注意力放在 CPU、内存、存储这类资源指标上却忘了许可证本身就是一种资源——它同样有总量、有消耗、有剩余容量、有到期时间甚至比硬件资源更容易出问题。而 VCF 这类多组件、多管理域的架构恰好把许可证信息打散在各个角落如果不能把散落的数据统一采集、加工、接入监控闭环那监控系统再完善在许可证这个维度上也等于瞎了。这篇文章就聊聊我实际落地的一套方法如何把分散的许可证数据归一成统一视图再把使用率、剩余天数、合规状态这些指标真正塞进监控平台。1. 许可证管理乱在哪VCF多管理面带来的三个监控盲区1.1 许可证散落在多个管理面监控无从下手VCF 环境通常不会只有一个 vCenter。我的经验是稍微规范一点的部署至少会拆出管理域、运维域这样的边界再加上一部分独立部署的老环境很可能同时存在三四个管理面。每个管理面都有自己的一整套许可证信息vCenter 的 License Service 里有授权密钥清单每一台 ESXi 主机带有自己的许可标签NSX 的许可证又存放在 NSX Manager 的独立配置里vSAN 的容量许可还要通过 vCenter 的 vSAN 健康模块去查。单独看任何一个管理面数据都是自洽的放到一起去比对就会出现问题不同组件由不同的工具管理获取数据的方式也完全不同有的走 PowerCLI有的走 API。这意味着每一份数据都依赖自己的采集脚本和登录凭证散的厉害。1.2 许可维度不统一按CPU、按实例、按容量怎么对比更头疼的是每个组件对许可证的计数粒度完全不同。ESXi 裸机层按物理 CPU 总数授权比如说一台双路服务器配了两个物理 CPU那就要占用两份许可vCenter 按实例授权一个 vCenter 就是一份跟你下面纳管了多少台主机没关系vSAN 按可用容量TB计算额度NSX 又分按 CPU 或按 VM 规模两种模式。一旦要把这些数据放进同一个监控视图里就会面临单位换算的问题。早期我试过直接在表格里堆原始字段结果每个组件一行卡片式布局看着挺整齐实际完全没有可比性。一个数量是 CPU 核心数一个数量是实例数一个数量是 TB 数监控人员很难快速判断到底哪个才是当前的短板。1.3 动态环境让静态台账彻底失效VCF 环境的显著特点就是动态变化。今天某个集群扩容多了两片 vSAN 磁盘一组 ESXi 节点明天下一个新的独立部署环境上线后天某个业务系统迁移导致主机重新分配。每一次操作都会直接作用于许可证的占用情况而静态台账根本没有能力跟踪这种变化。我曾经在一个项目里维护过一份漂亮的 Excel 台账环境变化少的时候确实够用。但后来集群扩容频率上来了扩容部署完成那一刻台账上的数字就已经过时了。许可证管理这个事本质上和监控是一回事它要求的是随时反映当前状态的实时数据而不是一份手工维护的历史快照。静态台账失效的那一刻就是许可证风险真正成为故障隐患的开始。2. 先拉数据基于PowerCLI和API的统一采集脚本设计2.1 采集范围和凭证规划在动手写采集脚本之前必须先明确两个问题要采哪些组件用谁的身份去采。组件清单要按环境实际情况列。我这里的标准做法是把 VCF 运维集群、独立部署 vCenter、NSX-T Manager 全部列进一张采集清单哪怕某个环境暂时没有 NSX 也先占位方便脚本稍后做空值处理。采集清单至少包含三列组件类型、管理地址、关联的主 vCenter。这样后面脚本执行时就可以按清单循环处理而不是手动一个个指向。凭证规划方面我建议单独建一个服务账号只授予 License 管理和只读权限不要在采集脚本里复用管理员账号。这样有两个好处第一是避免脚本出问题时造成高权限暴露第二是方便在权限审计时把采集行为和其他运维操作区分开。2.2 vCenter与ESXi许可证采集vCenter 层面的许可证采集通过 PowerCLI 来做是最省事的路径。连接 vCenter 之后核心命令是 Get-LicenseDataManager 和 Get-LicenseInfo可以拉出完整的许可密钥、关联产品、容量、使用量这些关键字段。我的脚本大致是这样设计的Connect-VIServer $vcenterAddress -User $serviceAccount -Password $secPassword $licenseDataManager Get-LicenseDataManager $licenseInfos Get-LicenseInfo -LicenseDataManager $licenseDataManager $licenseRecords foreach ($licenseInfo in $licenseInfos) { [PSCustomObject]{ LicenseKey $licenseInfo.LicenseKey ProductName $licenseInfo.Name TotalCapacity $licenseInfo.TotalCapacity UsedCapacity $licenseInfo.UsedCapacity CapacityUnit $licenseInfo.CapacityUnit ExpirationDate $licenseInfo.ExpirationDate SupportLevel $licenseInfo.Labels SourceVCenter $vcenterAddress } } $licenseRecords | Export-Clixml $env:TEMP\vc_$vcenterAddress.xml主机的许可证状态不要漏掉。Get-VMHost 可以拿到每一台 ESXi 主机的 LicenseKey再和 vCenter 的全局许可证列表做交叉比对能发现不少分配了但没匹配上的问题——比如主机带的是评估许可或者某个主机从旧环境迁移过来后带着原本的序列号这些场景都是常规台账发现不了的。2.3 NSX与vSAN的接口补充vCenter 之外的两个组件需要单独的采集通道。NSX-T 有自己的 API 路径通过 /policy/api/v1/infra/licenses 能拿到许可证的密钥、类型和发布日期。vSAN 则继续走 vCenter通过 Get-VsanClusterConfiguration 或 vSAN 健康模块的容量数据取得已用容量和许可容量。这两块的采集脚本不需要很复杂关键是要把数据导成和其他组件一致的格式。我习惯在导出的字段里增加一个 source_type 字段标明数据来源是 vCenter、NSX 还是 vSAN这样后续做归一化时就可以准确知道每条记录的原始语义。采集策略建议用两条线索并行一条是定时任务在凌晨低峰期执行全量采集另外在每次环境变更后手动补跑一次增量采集。变更后的补跑尤其重要因为扩容不影响业务告警但会直接影响许可占用不及时采集的话监控数据就失真了。我遇到过最典型的例子是某次集群加了两台新主机后没有重新采集监控平台显示许可证还剩 30%实际上剩余量已经不足 10%。等下一次半夜采集任务跑完告警才出现中间隔了整整一个白天这就是典型的数据盲区。3. 数据归一化把多源许可证加工成监控指标3.1 统一字段模型与命名规范采集脚本拿到的是不同结构的原始数据要把它们做成统一视图第一步是定义一套统一字段模型。我最终沉淀下来的核心字段包括license_key、product_name、edition、capacity_unit、capacity_total、capacity_used、capacity_remaining、expiry_date、source_domain、source_type、collected_time。字段设计有几个要考虑的点。license_key 是全局唯一标识不管数据来自哪个组件都以它为去重依据。capacity_unit 必须允许记录cpuinstancetb这三类单位否则没法区分后面的数值到底代表什么。source_domain 用来标记这个是 VCF 运维集群还是独立部署环境不同环境的监控视图和告警策略会有所区别。命名规范上建议统一用小写下划线风格并且指标名称带上一个环境标签。比如 vcf_license_usage_ratio{domainops} 和 vcf_license_usage_ratio{domainstandalone}这样在监控平台做筛选时就可以直接按 domain 维度拉出两组数据不用靠人工去猜。3.2 覆盖率、剩余天数与合规状态的算法设计归一化的核心不只是把字段对齐还要算出真正对监控有意义的派生指标。我实际会计算三个第一个是使用率。使用率 已用容量 / 总容量。这里需要注意不同组件的容量来源不一样比如 ESXi 是按已关联主机的 CPU 数累加而 vSAN 是直接读取容量许可的已用数值。脚本里要根据 capacity_unit 分别处理不能拿 TB 去比 CPU。第二个是剩余天数。剩余天数 过期日期 - 当前采集时间。对于没有过期日期的永久许可直接标记为永久不参与剩余天数告警。对于订阅式许可这个指标非常关键因为订阅到期不续费后果比容量卡脖子来得更突然。第三个是合规状态。这里包含两层一是是否存在未分配的有效许可或分配了但无效的许可二是全局使用率是否超过安全阈值。合规状态应该输出成枚举值比如 ok/warning/error方便监控平台直接按状态值做告警匹配。计算逻辑在 Python 里实现大致长这样def process_license_record(record): product record[product_name] unit record[capacity_unit] used float(record[capacity_used]) total float(record[capacity_total]) expiry parse_date(record[expiry_date]) remaining_days (expiry - utcnow()).days if expiry else None usage_ratio (used / total) * 100 if total 0 else 0 if remaining_days is not None and remaining_days 0: status error elif remaining_days is not None and remaining_days 30: status warning elif usage_ratio 95: status error elif usage_ratio 80: status warning else: status ok return { product_name: product, usage_ratio: round(usage_ratio, 2), remaining_days: remaining_days, status: status, }这个 status 计算逻辑要放在采集入库阶段做而不是放到监控平台的查询阶段做。原因是查询阶段做一次聚合就会增加一次计算压力而且迁移监控平台时还要重新实现一遍成本不划算。3.3 采集结果验证怎么确认数据没采错这样统一结构和包装的指标要确认它可信不能靠眼睛看。我通常用两个办法来校验。第一个是自动交叉验证。拿 ESXi 许可证来说从 vCenter 拿到的许可证已用量应该等于该 vCenter 下所有主机的 CPU 数汇总。如果两者不一致可能是许可证关联关系没更新或者有主机处于未纳管状态。我脚本里有专门一段干这个核对的把不一致的记录单独输出到一个 diff 文件里供人工排查。第二个是趋势对比。连续两次采集之间如果某个许可证的 used 值出现了大跳变又没有对应的环境变更记录那大概率是采集逻辑出了问题。这种校验在初期很有用因为采集脚本常常会因为某个组件返回的数据结构异常而静默失败只有趋势图才能暴露出来。归一化做完之后数据就已经具备接入监控平台的条件了。但这里有一个常见的反面案例有的团队直接让告警系统查数据库做聚合每个面板都重新算一次使用率和剩余天数结果监控平台负载上去数据反而常常卡住。正确做法是在采集侧把衍生指标计算好监控平台只做展示和阈值判断。4. 接入监控平台从采集到告警的落地实践4.1 指标暴露与存储方案选型接入监控平台首先要决定指标怎么暴露。我以前用的是最简单的方案Python 采集脚本把归一化后的字段写入一个本地文件目录再用 Prometheus 的 node_exporter textfile collector 做文件暴露。这么做的好处是零额外依赖基本是照着 node_exporter 的约定写文件就能跑。后来环境多了我改成了直接推送到 Pushgateway这样多个采集点可以各自推送最后在 Prometheus 端统一聚合。实际接入时还踩过一个坑Pushgateway 的指标带了 instance 标签而 instance 默认是推送地址如果同时存在多条记录指标会被覆盖。解决办法是在推送时显式传入 instance/job 标签把每个环境地址作为标签值让指标在同一个 job 下保留多套时间序列。存储选型上我建议直接用监控平台自己在用的时序数据库比如 Prometheus Thanos 或者 VictoriaMetrics。许可证数据本身量很小一天可能只产生几十条记录不需要额外的数据库。重要的是保证历史数据留存时间长一点因为做容量趋势预测需要至少半年以上的数据。4.2 分级告警规则与阈值设计许可证的告警规则跟资源告警最大的不同在于它不是瞬时指标而是慢变量。CPU 飙高几分钟可能就恢复了但许可证使用率一旦到 95%除非扩容或回收否则不会自己回落到安全线。如果按照资源告警的思维去设计很容易被同一类告警反复轰炸。我的建议是把许可证告警分成三个级别。level1 是合规状态告警只要出现 statuserror 就立即通知比如许可已过期、许可已耗尽level2 是容量预警使用率突破 85% 就通知给运维留出采购或回收的时间窗口level3 是到期预警剩余天数小于 90 天就通知针对订阅制许可尤其有用。Prometheus 告警规则我写成了这样groups: - name: vcf-license-alerts rules: - alert: VCFLicenseCapacityError expr: vcf_license_usage_ratio{jobvcf-license} 95 for: 15m annotations: summary: {{ $labels.product }} 许可证使用率已达 {{ $value }}% - alert: VCFLicenseCapacityWarn expr: vcf_license_usage_ratio{jobvcf-license} 85 for: 15m annotations: summary: {{ $labels.product }} 许可证使用率超过阈值 - alert: VCFLicenseExpirySoon expr: vcf_license_days_remaining{jobvcf-license, productnsx} 90 annotations: summary: {{ $labels.product }} 许可证将于 {{ $value }} 天后到期告警频率要克制。这类问题不是立刻需要手忙脚乱处理的如果用默认的每 1 分钟评估一次一天下来就是几十条相同的告警运维人员容易视觉疲劳最后反而会漏掉真正严重的。我的做法是 for 参数里加一个时间段比如容量告警持续 15 分钟才触发到期告警一天评估一次就够。4.3 一张看板看清所有环境的风险点数据接入后仪表盘设计我坚持一张屏看全局的原则。用 Prometheus 数据源配 Grafana 的话我先铺一个表格面板按产品列出所有许可证记录每一行显示许可证名称、所属环境、使用率、剩余天数、合规状态。使用率加一个色阶90% 以上标红85% 到 90% 标黄剩余天数小于 90 天标红合规状态直接显示成 ok/warning/error。第二块用状态灯面板展示各许可证的告警等级第三块用趋势图展示每个许可证的使用率变化。画面不要做太多花哨的图表许可证数据本身量级不大重要的是信息密度和可读性。我自己调整过很多版最后发现最有用的其实是那个表格面板因为监控人员扫一眼就能回答到底哪个环境哪个产品现在最危险这个信息价值比一堆折线图高得多。工具栏上我额外加了一个环境选择变量默认是全选。这样 VCF 运维集群和独立部署环境可以分开看也可以并在一起看。独立部署环境往往没有专门的运维团队盯着把它的许可证指标纳入集中监控本身就能降低很多隐性风险。监控面板做好之后最好再配一个每周的定时巡检报告把本周新增的告警和许可证变化量自动汇总出来。这个报告不要只发到邮箱建议落到一个共享目录或者企业微信群里这样变更审批人员和采购同事都能看到数据后续申请新许可时有据可依。5. 一些采集脚本之外的落地心得最后补几点我在实际落地过程中总结的经验希望能帮你少走点弯路。第一许可证管理这件事能自动化解决的一定要自动化。在我做过许可证统一采集之前每次环境扩容完都要人工去各管理面确认许可证够不够这个动作虽然只有几分钟但架不住回复繁琐、容易遗忘。现在采集任务在变更后自动补跑数据直接进监控闭环根本不需要人工介入。自动化带来的收益不只是省时间更重要的是杜绝了以为没事的盲区。第二许可证的告警要和变更流程绑定。不要只在监控面板上看到告警了再去处理而要在每次集群变更后主动做一次许可复检。比如 vSAN 容量扩容后检查许可证是否有足够余量有就要同步更新采集数据。这样监控就不会出现改完环境后告警蔓延的情况因为在变更时就把问题拦在了外面。这个动作我们可以加进标准变更检查单里形成约束。第三数据保留周期要长。许可证数据一天只有几条我一开始设置了 Prometheus 默认的 15 天保留期结果是做容量预测时拿不出足够长的历史曲线。后来我把保留期拉长到 180 天趋势预测的准确度明显提升。许可证领域不会经常变化但一旦变化趋势图能告诉我们的信息量非常大。第四不要忽略老环境的回收。有时候我们盯着新扩容的许可申请却忘了线上可能还有一批长期闲置的授权可以复用。我见过不止一次某套独立部署环境已经不再用了但许可证还占用着全局容量真正的生产环境反而差几个许可。每周巡检报告里单独加一列闲置许可能帮团队省不少真实成本。这篇文章的经验基本都来自我在日常环境维护中的实操。许可证管理听起来不如性能调优或故障排查那样有技术感但它是一个典型的不显眼但掉链子代价很高的环节。如果你也负责 VCF 运维集群或独立部署环境的监控强烈建议把许可证数据纳入监控体系。等某一天监控面板上那行剩余天数变成红色的时候你会发现提前把这一步做了才是运维中真正能保命的事。

相关新闻

手写数字串识别:端到端序列建模实战指南

手写数字串识别:端到端序列建模实战指南

简介:本资源是一套面向本科毕业设计与深度学习课程实践的完整手写数字识别系统,聚焦连续多位数字的端到端检测与识别任务,适用于计算机视觉初学者及毕设选题学生。压缩包共1758个文件,含531张标注图像(jpg)…

2026/10/14 9:54:36 阅读更多 →
Windows环境部署TDengine企业版:安装配置与数据建模实战

Windows环境部署TDengine企业版:安装配置与数据建模实战

时序数据库这个词在工业监控、车联网、能源计量这些场景里基本天天见,而 TDengine 则是目前讨论度很高的一个开源时序数据平台。这次我在 Windows 环境里装了一套企业版 TDengine,正好把整个安装过程、关键配置文件、建库建模到基础读写测试都完整走了一…

2026/10/14 9:54:36 阅读更多 →
需求分析实战:从模糊诉求到可执行需求原子的七步闭环

需求分析实战:从模糊诉求到可执行需求原子的七步闭环

1. 这不是教科书里的“需求分析”,而是项目现场每天在发生的实战博弈“软件需求分析概述”这七个字,听起来像大学课堂PPT第一页的标题,干巴巴、没温度、带着点让人想划走的学术倦怠感。但如果你真在一线带过三个以上中型项目,就会…

2026/10/14 9:54:36 阅读更多 →

最新新闻

KNN图像识别入门:从PCA降维到手写数字分类实战

KNN图像识别入门:从PCA降维到手写数字分类实战

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

2026/10/15 1:37:04 阅读更多 →
52pojie 的 IoT 固件分析:熵值会告诉你哪一段藏了东西

52pojie 的 IoT 固件分析:熵值会告诉你哪一段藏了东西

副题:魔术字、香农熵、结构体——拆开一个固件镜像的三把钥匙 摘要:吾爱破解软件调试区里有一篇《IoT 漏洞分析之模拟环境搭建》(6037 回复),同区还有《记一次手机付费充电设备研究》(7196)。这…

2026/10/15 1:37:04 阅读更多 →
双 11 核心链路变异测试大摸底:让关键交易状态机测试坚不可摧

双 11 核心链路变异测试大摸底:让关键交易状态机测试坚不可摧

在电商交易系统中,最核心、也最令架构师夜不能寐的领域内核,永远是有限状态机(Finite State Machine, FSM)。 在双 11 狂风暴雨般的流量洪峰冲击下,一笔交易订单在几毫秒内可能经历极其错综复杂的状态跳转:…

2026/10/15 1:37:04 阅读更多 →
u-boot-2020.07在Exynos4412上的电源时钟内存初始化实战

u-boot-2020.07在Exynos4412上的电源时钟内存初始化实战

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

2026/10/15 1:37:04 阅读更多 →
行业术语同义词图谱挖掘:从非结构化语料到标准化知识库的语义归一

行业术语同义词图谱挖掘:从非结构化语料到标准化知识库的语义归一

在将海量企业内部非结构化语料(如研发设计文档、售后工单、专家经验纪要、行业研报)汇聚到统一知识库并驱动 RAG(检索增强生成)系统时,工程团队往往面临一个巨大的语义鸿沟——“专有名词的极度多样性与非标准性”。 在…

2026/10/15 1:37:04 阅读更多 →
工业机器人坐标系全解析:从原理到标定实操

工业机器人坐标系全解析:从原理到标定实操

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

2026/10/15 1:36:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →