CoreDNS transfer 插件实战指南:为权威插件提供出站区域传输(AXFR/IXFR)与 NOTIFY 通知
后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载导读transfer是 CoreDNS 中负责出站区域传输outgoing zone transfer的核心插件它为file、auto、secondary、kubernetes等实现了transfer.Transferer接口的权威插件统一应答完整的 AXFR 全量传输请求并以「IXFR 增量传输 AXFR 回退」的方式处理增量同步同时负责在区域变更时向各 secondary 服务器主动发送 NOTIFY 通知。读完本文你将掌握transfer的配置语法ZONE、to、source、与acl插件组合限制传输来源、以及如何借助源码与测试用例理解其请求分发、64KB TCP 消息分片和 NOTIFY 重试的底层机制。插件定位它不是区域数据的提供者而是传输通道的调度者阅读 plugin/transfer/README.md 可以知道transfer自身并不持有任何 DNS 记录。它的职责是为其他权威插件应答区域传输请求。任何插件只要实现了transfer.Transferer接口就能借助transfer插件对外提供 AXFR / IXFR 服务并享受统一的 NOTIFY 通知能力。从 plugin.cfg 可以看到transfer:transfer被正式注册为 CoreDNS 的内置插件。目前官方文档明确列出以下插件基于它实现区域传输file以本地 zone 文件为数据源的权威插件auto自动加载 zone 文件的权威插件secondary从上游主服务器拉取区域的插件kubernetes以 Kubernetes Service / Pod 为数据源生成区域的插件。如果你是一位插件作者想为自己的插件接入区域传输能力官方指引是直接阅读 plugin/transfer/transfer.go 了解接口契约——下面我们会从源码层面逐条拆解这份契约。核心接口transfer.Transferer契约transfer插件之所以能通用地为多个权威插件服务关键在 transfer.go 中定义的接口// Transferer may be implemented by plugins to enable zone transfers type Transferer interface { Transfer(zone string, serial uint32) (-chan []dns.RR, error) }接口契约有非常明确的语义约定注释原文即规范serial 0表示 AXFR 请求插件必须把整区的记录全部写入返回的 channel。第一个写入的必须是 SOA 记录随后是所有其他记录包括全部 NS 记录及其 glue 记录最后还要再写一次 SOA 作为传输结束标志。transfer插件只负责把这些记录原样转发给请求方几乎不做校验。serial ! 0表示 IXFR 请求如果请求方携带的 serial大于等于更新于当前区域的 serial说明对方已是最新只需向 channel 写入单个 SOA 记录后关闭 channel如果请求方的 serial小于更旧于当前 serial则执行AXFR 回退——按 AXFR 的方式把整个区域完整传输一遍。非权威判定如果插件对该 zone 不权威必须立即返回transfer.ErrNotAuthoritative错误定义见 transfer.go。这一约定至关重要它保证transfer可以在多个实现了Transferer的插件之间做正确的选择而不会错误地让插件 X 去传输本应由插件 Y 提供的区域数据。以file插件为例plugin/file/xfr.go 先通过lookupZone确认自己是该 zone 的权威否则返回ErrNotAuthoritative确认后调用z.Transfer(serial)。其内部实现plugin/file/xfr.go正是上述契约的典型写照IXFR 且 serial 相等时只发 SOA否则发送 apex含 SOA、遍历整棵树的所有记录、最后再补一个 SOA 并关闭 channel。kubernetes插件的实现位于 plugin/kubernetes/xfr.go其 AXFR 输出包含 SOA、按需去重的 NS 记录、NS 地址glue、以及按 namespace 暴露策略过滤后的 Service 记录对于多集群场景isMultiClusterZone还会走transferMultiClusterServices分支。配置语法与参数详解transfer的 Corefile 语法如下原文语法完整保留transfer [ZONE...] { to ADDRESS... source ADDRESS }ZONE要应答传输请求的区域可指定一个或多个 zone留空时自动继承所在 server block 的 zone 列表源码中由plugin.OriginsFromArgsOrServerBlock(c.RemainingArgs(), c.ServerBlockKeys)实现见 setup.go。要对某个 zone 应答传输同一个 server block 中必须存在另一个同样服务该 zone、且实现了transfer.Transferer的插件——否则没有数据来源传输自然无从谈起。允许在一条配置中多次书写transfer块为不同 zone 组配置不同的to白名单。例如 setup_test.go 中同时配置了transfer example.net example.org {...}与transfer example.com example.edu {...}分别对应两组to地址。toADDRESS...允许向其传输的地址指定允许接收传输的地址列表to可以被多次指定多次出现会累积生效。使用*表示允许向所有地址传输。合法的地址格式包括1.2.3.4、12:34::56IPv6、1.2.3.4:5300IPv4 加端口、[12:34::56]:5300IPv6 加端口方括号包裹。省略端口时默认补全为 53解析逻辑见 setup.go它调用parse.HostPort(host, transport.Port)做归一化例如1.2.3.4会被规范化为1.2.3.4:53、[1::2]:34保持端口 34 不变对应测试见 setup_test.go。to是必填项若transfer块内没有出现任何to配置解析会直接报错to is required见 setup.go。sourceADDRESS发送 NOTIFY 时的本地源地址指定向to地址发送**区域变更通知NOTIFY**时使用的本地 IP 地址。注意它的作用范围很窄只影响 NOTIFY 数据包的源地址并不会改变哪些客户端被允许请求 AXFR/IXFR——允许列表仍由to决定。解析限制source必须是合法 IPnet.ParseIP校验且每个transfer块只能出现一次重复指定会报source already specified见 setup.go。从 setup_test.go 可以看到几类典型的解析错误场景缺失to、未知子指令、source给了域名而非 IP、重复source都会被配置解析器拒绝。配置解析的完整行为源码级parseTransfer 是完整的解析函数其行为要点每个transfer块生成一个内部xfr结构Zones、to、source三个字段见 transfer.go支持多个块 → 多个xfr最终汇总到Transfer.xfrs列表to支持*与带端口地址source只收一个合法 IP除了to/source之外的任何子指令都会报unknown property错误。请求处理主流程从 TCP 请求到 AXFR/IXFR 应答transfer的请求处理入口是ServeDNStransfer.go完整流程如下类型过滤只有QType为 AXFR 或 IXFR 的请求才进入传输处理其他类型直接交给链上下一插件plugin.NextOrFailure。协议强制区域传输必须走TCPDNS 协议规定 AXFR/IXFR 不使用 UDP非 TCP 请求直接返回REFUSEDtransfer.go。测试用例统一使用test.ResponseWriter{TCP: true}构造 TCP 场景。区域匹配通过longestMatchtransfer.go在所有xfr块中找到最长匹配的 zone查询sub.example.org.时若同时配置了example.org.与sub.example.org.则更具体的sub.example.org.胜出对应测试TestLongestMatchMostSpecificZone见 transfer_test.go。匹配是大小写不敏感的TestAXFRZoneMatchCaseInsensitive。若没有匹配的 zone请求交回链上后续插件处理。来源白名单校验调用x.allowed(state)transfer.go遍历to列表*直接放行否则将请求方 IP 与配置地址逐条比对不匹配则构造REFUSED响应返回测试TestTransferNotAllowed验证了该行为transfer_test.go。提取 IXFR serialIXFR 请求的 AUTHORITY 段必须恰好包含一条 SOA从中取出 serial段为空或不是 SOA 则返回SERVFAILtransfer.go。选择 Transferer依次调用Transferers中每个插件的Transfer(zone, serial)遇到ErrNotAuthoritative就跳过尝试下一个直到找到第一个能提供数据的插件transfer.go。Transferers列表在启动时自动收集——见 setup.go它会遍历当前 server block 的所有 handler把实现了Transferer的插件全部收集进来。select_test.go中的TestZoneSelection验证了「非权威插件被跳过、正确插件被选中」的选择逻辑。TSIG 支持如果请求携带 TSIGtransfer会把配置中的 TSIG 密钥表tsigSecret来自dnsserver配置在 OnStartup 时注入交给dns.Transfer.Out使用实现带签名的传输transfer.go。流式写出从生产者 channel 不断取记录累积成批次通过dns.Transfer.Out写回客户端全部记录传输完成后关闭 channel 并等待写出 goroutine 结束随后记录日志Outgoing transfer of %d records of zone %q to %s for %d SOA serial。大区域传输的 64KB 消息分片DNS over TCP 单条消息上限为 64KBdns.MaxMsgSize65535 字节。transfer.go 对生产者送来的记录做按字节数的批量分片每条记录累加dns.Len(rr)一旦累计超过约 63000 字节为 12 字节消息头与 question 段预留余量就把当前批次作为一个dns.Envelope写出并重置。测试用例TestTransferLargeRecordBatchingtransfer_test.go用 300 条约 240 字节的 TXT 记录总计约 75KB验证了传输被正确拆分成多个TCP 消息每个消息打包后都不超过dns.MaxMsgSize且记录总数302 300 TXT 2 SOA不丢失。客户端中断时的生产者排空若客户端在传输中途断连写出失败transfer.go 会启动一个 goroutine 继续把生产者 channel 中的剩余记录排空避免生产者的 goroutine 因 channel 缓冲区写满而永久阻塞泄漏。TestTransferDrainsProducerOnClientErrortransfer_test.go专门验证了这一点failed_write_test.go中的TestWriteMessageFailed则验证了写出失败会向上返回错误。IXFR 的两个分支在实现中的体现区域已最新当 IXFR serial 等于或新于当前 serial 时Transferer 只向 channel 写入一个 SOA。ServeDNS检测到「只收到 1 条记录且它是 SOA」时不再走常规写出路径而是直接把这条 SOA 作为单个应答消息返回并记录日志Outgoing noop, incremental transfer for up to date zonetransfer.go。测试TestTransferIXFRCurrent验证应答恰好含 1 条 SOA 记录。区域已过期 → AXFR 回退serial 更旧时走完整 AXFR 流程。测试TestTransferIXFRFallbacktransfer_test.go用serial-1发起 IXFR验证最终返回的应答结构与 AXFR 完全一致validateAXFRResponse要求首尾均为 SOA、共 4 条记录。NOTIFY 通知区域变更时主动告知 secondary当插件检测到区域数据变化并希望通知其 secondary 时会回调transfer插件的Notify方法notify.go构造 NOTIFY 消息m.SetNotify(zone)用longestMatch找到匹配该 zone 的xfr块无匹配则静默返回不报错遍历该块to列表中的每个 IP 地址*被跳过因为通配符没有可通知的具体目标逐个发送 NOTIFY每个地址的发送失败会被累积最终通过errors.Join合并返回。file插件在收到来自主服务器的 NOTIFY 后触发transferIn拉取更新plugin/file/file.go而secondary插件正是依赖这一整套「NOTIFY 主动拉取」机制维持与主服务器的同步。发送细节与重试逻辑sendNotifynotify.go的实现要点使用UDP发送dns.Client默认每个地址最多重试 3 次只要收到RcodeSuccess即视为成功全部重试失败时根据「网络错误」还是「rcode 非成功」构造不同错误信息。source的底层实现notifyClientnotify.go在配置了source时会给dns.Client设置Dialer net.Dialer{LocalAddr: net.UDPAddr{IP: x.source}}从而让 NOTIFY 数据包携带指定的源 IP。notify_test.go中的TestNotifyClientSource验证了未配置source时不设置 Dialer配置了 IPv6 地址后 Dialer 的 LocalAddr 正是该 IP。TestNotifyMultipleFailures则验证多地址通知的失败聚合——当两个目标分别返回 SERVFAIL 和 REFUSED 时返回的错误同时包含两个地址与各自的 rcode 描述。实战配置示例示例一与acl组合限制传输来源网段transfer自身的to只能做「精确 IP 列表」匹配源码注释中的 TODO 也承认暂不支持网段见 transfer.go。要按网段做精细管控官方推荐叠加acl插件。下面的 Corefile 片段摘自 plugin/transfer/README.md 原示例完整保留将 AXFR/IXFR 传输限制在10.1.0.0/16网段... acl { allow type AXFR net 10.1.0.0/16 allow type IXFR net 10.1.0.0/16 block type AXFR net * block type IXFR net * } transfer { to * } ...acl插件的policy结构按 actionallow/block/filter/drop与 qtype 匹配查询plugin/acl/acl.gotype AXFR/type IXFR正是按 qtype 命中后执行 allow/block。这样transfer侧用to *放开所有来源真正的网段级访问控制由acl兜底完成。示例二从指定本地地址发送 NOTIFY当服务器有多张网卡、需要让 secondary 从特定地址收到 NOTIFY 时使用source摘自 plugin/transfer/README.md 原示例... transfer { to 2001:db8::1 source 2001:db8::53 } ...to 2001:db8::1表示只允许 IPv6 地址2001:db8::1发起传输请求同时 NOTIFY 将从2001:db8::53发出。注意source不影响哪些客户端被允许请求传输。示例三多区域、多目标的白名单配置参照 setup_test.go 中的解析用例可以为一个 server block 内的多个区域分别配置传输策略example.org { file example.org example.org.signed transfer example.org { to 192.0.2.1 192.0.2.2:5353 [2001:db8::10]:53 source 192.0.2.53 } transfer { to * } }第一个transfer块example.org的传输只允许发给192.0.2.1、192.0.2.2:5353、2001:db8::10端口 53NOTIFY 源地址固定为192.0.2.53第二个transfer块不写 zone继承 server block 的 zone 列表to *表示其余场景放行——具体如何取舍取决于你的安全策略。常用排错与验证手段查看传输日志transfer使用独立的transferloggerclog.NewWithPlugin(transfer)transfer.go。成功的传输会打印Outgoing transfer of N records ...IXFR 无需更新时打印Outgoing noop, incremental transfer for up to date zone ...NOTIFY 发送打印Sent notifies for zone ...Debug 级别。用 dig 验证 AXFR在支持 TCP 的客户端上执行dig 127.0.0.1 example.org AXFR观察是否返回以 SOA 开头和结尾的完整区域记录。用 dig 验证 IXFRdig 127.0.0.1 example.org IXFR当前serial应只返回单条 SOA用更小的 serial如IXFR1应触发 AXFR 回退返回完整区域。用 dig 验证 NOTIFY 源地址dig 127.0.0.1 example.org NOTIFY配合抓包或对端日志确认通知确实来自source指定的 IP。返回码语义来源不在to白名单或 acl 拦截时收到REFUSED非 TCP 的 AXFR/IXFR 请求也返回REFUSEDIXFR 请求的 AUTHORITY 段不含 SOA 时返回SERVFAIL——这些行为均可由 transfer_test.go 与 failed_write_test.go 中的测试用例佐证。小结transfer插件通过一个简洁的Transferer接口把「区域数据传输」这件事与具体数据源解耦file、auto、secondary、kubernetes各自负责生成区域记录transfer统一负责应答 AXFR/IXFR、执行 IXFR→AXFR 回退、以及向 secondary 发送 NOTIFY。配置上只需掌握ZONE、to、source三个要素再配合acl插件即可构建出网段级精细管控的权威 DNS 传输方案源码层面的最长区域匹配、Transferer 选择、64KB 分片写出与 NOTIFY 重试逻辑则为深入定制或自行实现Transferer的插件作者提供了清晰的可参考实现。赞分享后端网络云原生【免费下载链接】corednsCoreDNS is a DNS server that chains plugins项目地址https://gitcode.com/gh_mirrors/co/coredns点击查看免费下载相关推荐终极指南miekg/dns库如何实现高效AXFR/IXFR区域传输终极指南miekg/dns库如何实现高效AXFR/IXFR区域传输 DNS区域传输是域名系统管理中的关键功能而miekg/dns作为Go语言中最强大的DNS网络后端Telegraf Sumo Logic 输出插件实战指南通过 HTTP Source 上传指标数据Telegraf Sumo Logic 输出插件实战指南通过 HTTP Source 上传指标数据 本篇技术指南以 Telegraf 内置的 sumologi可观测性指标监控运维CoreDNS errors 插件完全指南错误日志输出与 consolidate 合并机制CoreDNS errors 插件完全指南错误日志输出与 consolidate 合并机制 本篇技术指南围绕 CoreDNS 的 errors 插件展开讲解后端网络云原生上一篇NVIDIA Profile Inspector终极指南解锁显卡隐藏设置提升游戏性能下一篇微信红包自动助手无需Root的智能抢红包解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

脱敏数据会被还原吗:安当DBG 的重标识风险治理

脱敏数据会被还原吗:安当DBG 的重标识风险治理

一、引言:为什么"脱敏过"的数据仍然危险 很多团队在百度搜索"脱敏方案"时,潜意识里把"做脱敏"等同于"数据已安全"。但真实世界里反复出现这样的场景:一张客户表对手机号做了掩码、对姓名做了替换&am…

2026/10/5 13:06:59 阅读更多 →
OpenCore Legacy Patcher 完整实操:老 Mac 装新版 macOS 的最短路径

OpenCore Legacy Patcher 完整实操:老 Mac 装新版 macOS 的最短路径

OpenCore Legacy Patcher 完整实操:老 Mac 装新版 macOS 的最短路径 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 这篇文章教你把想装的最新版 …

2026/10/5 13:05:59 阅读更多 →
异地多活下密钥怎么跟:安当TDE 的容灾密钥跟随

异地多活下密钥怎么跟:安当TDE 的容灾密钥跟随

一、为什么灾备里最容易出问题的是"密钥"而不是"数据" 很多团队做数据库异地多活、主备容灾时,把精力都花在复制链路、网络带宽、脑裂处理和 RTO/RPO 指标上,却忽略了一个极其关键的事实:**透明加密之后,磁盘…

2026/10/5 13:05:59 阅读更多 →

最新新闻

插件加载失败怎么排查?从IAR到Harness,一次讲透插件机制与修复方法

插件加载失败怎么排查?从IAR到Harness,一次讲透插件机制与修复方法

前阵子一个朋友给我转来一长串截图,全是同一个主题: harness failed to load plugins web boot: 2 entries did not activate 。扫一眼没头没尾,但类似的报错我在不同工具里见过太多次了。紧接着嵌入式群又有人问“iar plugins 是干什么的”…

2026/10/5 13:49:17 阅读更多 →
Oracle rownum迁移到瀚高数据库的SQL改写指南

Oracle rownum迁移到瀚高数据库的SQL改写指南

做oracle到瀚高数据库迁移的时候,SQL改写是最躲不开的一关。我接手过不少迁移项目,真正让开发同学头疼的往往不是那些复杂分析函数,反而是rownum这种看似不起眼、Oracle独有的伪列——改不对,轻则结果集多几行,重则分页…

2026/10/5 13:49:17 阅读更多 →
头盔护目镜耐穿透试验机|国标 GB/T811 头盔镜片冲击强度检测设备

头盔护目镜耐穿透试验机|国标 GB/T811 头盔镜片冲击强度检测设备

1. 概述头盔护目镜耐穿透试验机是骑行头盔安全性能专项检测设备,用于电动自行车头盔、摩托车头盔护目镜的冲击强度测试。 试验核心判定要求:护目镜经受冲击发生破碎时,不得产生角度小于 60 的碎片,防止尖锐碎片划伤骑行者眼部。2.…

2026/10/5 13:49:17 阅读更多 →
SolidWorks拉伸切除失败的五大根因与排查技巧

SolidWorks拉伸切除失败的五大根因与排查技巧

做了这么多年SolidWorks相关的工作,也带过不少新人刷练习题,我越来越觉得,练习题的含金量往往不在于题目本身有多复杂,而在于它能不能逼你把某个隐藏的坑踩一遍。就拿这几天好几个朋友都在问的问题来讲——为什么有时拉伸切除会执…

2026/10/5 13:49:17 阅读更多 →
量化LLM微调工具实战:QLoRA单卡跑通7B模型与避坑指南

量化LLM微调工具实战:QLoRA单卡跑通7B模型与避坑指南

简介:这份资源是面向大语言模型微调研究者与工程实践者的QLoRA量化微调工具包,聚焦在有限显存条件下对LLM进行高效适配训练,适合具备一定深度学习基础、希望将模型落地到具体任务的中高级开发者。压缩包共274个文件,约50.81MB&…

2026/10/5 13:49:17 阅读更多 →
MySQL JSON类型完全指南:从函数使用到索引优化与JSON_TABLE实战

MySQL JSON类型完全指南:从函数使用到索引优化与JSON_TABLE实战

MySQL 的 JSON 数据类型从 5.7 引入到现在快十年了,但我在实际项目里见到的大量用法,还停留在“把 JSON 塞进 TEXT 字段,查询时全表捞出来再用程序解析”这种原始阶段。等到数据量上来、接口响应变慢、想按 JSON 里的某个字段过滤却没法走索引…

2026/10/5 13:48:17 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

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/5 5:06:42 阅读更多 →
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/5 1:10:22 阅读更多 →
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/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →