Ceph osdmaptool 完全指南:OSD Map 创建、CRUSH 操作、PG 映射分析与 upmap 平衡模拟
存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载osdmaptool是 Ceph 发行版内置的 OSD Cluster Map 离线操作工具用于创建、查看与修改 OSD Map提取或嵌入 CRUSH Map模拟 upmap 平衡器以评估 PG 分布并计算 PG 到 OSD 的映射关系。本文以 doc/man/8/osdmaptool.rst 为骨架结合 src/tools/osdmaptool.cc 的选项解析实现与 src/test/cli/osdmaptool 下的 CLI 测试用例完整讲解每个选项的用法、输出含义与底层机制。读完本文你将掌握如何离线构造并检验 OSD Map、如何在不解集群的情况下验证 CRUSH 映射是否均衡、如何生成可直接执行的 upmap 平衡命令以及如何模拟读平衡primary 平衡效果。一、工具定位与适用场景osdmaptool是 Ceph 分布式存储系统中的 OSD 集群映射OSD cluster map操作工具其核心能力包括创建离线生成一份全新的 OSD Map--createsimple、--create-from-conf查看以纯文本或 JSON 形式打印 OSD Map 内容--print、--dump、--tree、--healthCRUSH 操作从 OSD Map 中导出内嵌的 CRUSH Map或导入新的 CRUSH Map--export-crush、--import-crush映射分析模拟 PG 到 OSD 的映射--test-map-pgs系列、--test-map-pg、--test-map-object、--test-crush、--test-random平衡模拟模拟 upmap 平衡器模式预先评估为平衡 PG 所需的上调操作数量与内容--upmap、--upmap-active以及模拟读平衡primary 平衡--read。典型使用场景包括离线测试新建集群的 PG 分布是否均衡、在批量 OSD 上线前预演 upmap 平衡会产生多少条命令、调试 CRUSH 规则对映射的影响以及在测试环境中快速生成一份可用的 OSD Map。该工具不需要运行中的集群只需一个 OSD Map 文件即可工作非常适合脚本化与自动化验证。从源码看工具入口位于 src/tools/osdmaptool.cc 的main()函数先通过ceph_argparse_*系列函数解析全部命令行参数再执行对应的创建、标记、映射测试或 upmap 计算逻辑工具以CEPH_ENTITY_TYPE_CLIENT类型初始化并设置CINIT_FLAG_NO_DEFAULT_CONFIG_FILE意味着它不依赖默认配置文件即可运行。二、命令行语法总览原文档给出了完整的 Synopsis其语法为osdmaptool mapfilename [--print] [--createsimple numosd [--pgbits bitsperosd]] [--clobber] osdmaptool mapfilename [--import-crush crushmap] osdmaptool mapfilename [--export-crush crushmap] osdmaptool mapfilename [--upmap file] [--upmap-max max-optimizations] [--upmap-deviation max-deviation] [--upmap-pool poolname] [--save] [--upmap-active] osdmaptool mapfilename [--upmap-cleanup] [--upmap file]mapfilename是唯一的位置参数其余均为可选开关。需要注意若未指定--createsimple/--create-from-conf且文件已存在osdmaptool 会直接读取该文件若创建模式且目标文件已存在则必须显式携带--clobber才允许覆盖源码 src/tools/osdmaptool.cc 中通过::stat检查文件存在性并报错exists, --clobber to overwrite。选项的默认值在源码中有明确定义src/tools/osdmaptool.ccpg_bits 6、pgp_bits 6、upmap_max 10、upmap_deviation 5、upmap_file -即 stdout。此外工具还要求upmap-deviation 1否则报错退出--osd-size-aware仅在 read 模式下可用。三、选项详解与源码印证3.1 查看类选项选项说明--print在所有修改完成后以纯文本形式打印 Map 的完整内容--dump format以纯文本显示 Map当指定格式不受支持时回退为 JSON。是--print的替代方案--tree以层级树形式显示 Map 的 OSD 拓扑--health输出健康检查health checks信息源码中--dump与--tree都支持携带格式参数当参数为空或等于plain时使用默认文本输出否则通过Formatter::create(val, , json)创建指定格式的 formattersrc/tools/osdmaptool.cc这与文档所述格式不支持时回退 JSON一致。3.2 创建类选项选项说明--createsimple numosd [--pg_bits bitsperosd] [--pgp_bits bits]创建一份包含numosd个设备的通用 OSD Map--create-from-conf使用默认配置创建 OSD Map--with-default-pool创建 Map 时包含默认 poolrbd--clobber允许 osdmaptool 覆盖已存在的mapfilename--createsimple的 PG 数量计算规则是pg_num numosd pg_bits即numosd左移bitsperosd位pgp_num numosd pgp_bits。在 src/tools/osdmaptool.cc 中创建路径调用osdmap.build_simple()或build_simple_with_pool()完成初始化默认pg_bits与pgp_bits均为 6。--create-from-conf需要结合-c ceph.conf使用参见测试 src/test/cli/osdmaptool/upmap.t 中的osdmaptool --create-from-conf om -c $TESTDIR/ceph.conf.withracks --with-default-pool此时num_osd被置为-1Map 结构由配置文件中的osd_pool_default_*等参数决定。验证示例对应 src/test/cli/osdmaptool/create-print.t$ osdmaptool --createsimple 3 myosdmap --with-default-pool osdmaptool: osdmap file myosdmap osdmaptool: writing epoch 1 to myosdmap随后打印出的 Map 摘要显示pool 1 rbd replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 192 pgp_num 192——这里 3 个 OSD、默认 6 bit得到pg_num 3 6 192与文档规则完全吻合。3.3 CRUSH 导入导出与权重调整选项说明--import-crush mapfile从mapfile加载 CRUSH Map 并嵌入 OSD Map--export-crush mapfile从 OSD Map 提取 CRUSH Map 并写入mapfile--adjust-crush-weight osdid:weight[,osdid:weight,...]修改指定 OSD 的 CRUSH 权重默认不持久化导出使用osdmap.crush-encode()编码后写入文件src/tools/osdmaptool.cc导入则会先解码校验CrushWrapper::decode并检查crushmap max_devices是否超过osdmap max_osd随后通过OSDMap::Incremental增量应用到 OSD Mapsrc/tools/osdmaptool.cc。将导出的 CRUSH Map 交给crushtool --decompile即可查看文本形式的 CRUSH 结构见 src/test/cli/osdmaptool/create-print.t。--adjust-crush-weight使用osdid:weight的逗号分隔格式内部通过osdmap.crush-adjust_item_weightf()修改权重若同时指定--save则会构造 Incremental 并将修改持久化到文件src/tools/osdmaptool.cc。测试 src/test/cli/osdmaptool/crush.t 演示了不带--save仅打印 Adjusted osd.0 CRUSH weight to 5、不落盘与带--save写入 epoch 5的差异。3.4 PG 映射测试类选项选项说明--test-map-pgs [--pool poolid] [--range-first first --range-last last]打印所有 PG 到 OSD 的映射--test-map-pgs-dump [--pool poolid] [--range-first first --range-last last]打印所有 PG 的摘要及其到映射 OSD 的映射--test-map-pgs-dump-all [--pool poolid] [--range-first first --range-last last]打印所有 PG 的摘要及其到全部 OSD 的映射--test-map-pg pgid将特定 PG 映射到 OSD--test-map-object objectname [--pool poolid]将特定对象映射到 OSD--test-crush [--range-first first --range-last last]将 PG 映射到 acting OSD--test-random对 PG 做随机映射用于对照实验--range-first/--range-last的作用是当mapfilename指向一个目录时依次读取该目录下以0,1,2,...命名的多个 OSD Map 文件并逐个解码src/tools/osdmaptool.cc例如osdmaptool --test-map-pgs --range-first 0 --range-last 2 osdmap_dir会迭代读取osdmap_dir目录中名为 0、1、2 的文件。此外--test-map-pgs还额外支持--pg_num pg_num临时覆盖 pool 的 PG 数见 src/tools/osdmaptool.cc。--test-map-object的完整映射链路为object_locator_to_pg()计算对象归属的原始 PG →raw_pg_to_pg()规整 PG 号 →pg_to_acting_osds()得到 acting 集合src/tools/osdmaptool.cc未指定--pool时默认假设 pool 1。--test-map-pg则直接解析pgid形如1.2f同时输出 raw / up / acting 三套集合及其各自的 primarysrc/tools/osdmaptool.cc可以清晰看到原始 CRUSH 结果与经过 upmap/primary-affinity 调整后的实际生效结果之间的差异。3.5 状态标记类选项选项说明--mark-up-in将所有 OSD 标记为 up 且 in不持久化--mark-out osdid将 OSD 标记为 out不持久化--mark-up osdid将 OSD 标记为 up不持久化--mark-in osdid将 OSD 标记为 in不持久化--clear-temp清除pg_temp与primary_temp变量--clean-temps清理pg_temp这些选项不持久化的含义是仅在内存中的 OSDMap 对象上生效用于后续的映射测试或 upmap 模拟并不会写回文件。源码中--mark-up-in遍历get_max_osd()范围内的所有 OSD逐一置位CEPH_OSD_UP状态并设置 in 权重对 CRUSH 权重为 0 的 OSD 还会自动调用adjust_item_weightf(..., 1.0)补上默认权重src/tools/osdmaptool.cc保证新建的 OSD 能参与后续映射计算。测试 src/test/cli/osdmaptool/test-map-pgs.t 就是先用--mark-up-in把 500 个 OSD 全部标记为 up/in再做--test-map-pgs验证size 3下 8000 个 PG 全部映射到 3 个不同 OSD。--clear-temp调用osdmap.clear_temp()--clean-temps则构造 Incremental 并调用OSDMap::clean_temps()src/tools/osdmaptool.cc。3.6 upmap 平衡类选项选项说明--upmap-cleanup file清理pg_upmap[_items]条目将命令写入file默认-表示 stdout--upmap file计算用于平衡 PG 布局的 pg upmap 条目将命令写入file--upmap-max max-optimizations设置最多计算的 upmap 条目数默认 10--upmap-deviation max-deviation设置偏离目标的允许范围默认 5--upmap-pool poolname将 upmap 平衡限制在单个 pool可重复使用以限定多个 pool--upmap-active模拟活跃平衡器持续应用修改直到分布均衡--upmap-seed seed指定随机种子源码中通过--upmap-seed解析便于复现结果--save将 upmap 或 CRUSH 调整的修改写入修改后的 OSD Map 文件--vstart为 upmap 与 read 输出添加./bin/前缀面向 vstart 开发环境--upmap的计算流程在 src/tools/osdmaptool.cc先解析--upmap-pool指定的 pool 名并校验存在性未指定时默认对 Map 中全部 pool 计算。每轮迭代会随机打乱 pool 顺序逐 pool 调用osdmap.calc_pg_upmaps(cct, upmap_deviation, left, one_pool, pending_inc, seed)计算最多left条调整累计输出prepared X/Y changes。生成的命令通过print_inc_upmaps()输出包含四类 Ceph 命令src/tools/osdmaptool.ccceph osd pg-upmap pgid osd.../ceph osd rm-pg-upmap pgidceph osd pg-upmap-items pgid from to.../ceph osd rm-pg-upmap-items pgidceph osd pg-upmap-primary pgid osd/ceph osd rm-pg-upmap-primary pgid在--upmap-active模式下工具会反复应用增量并重新计算直到某轮prepared 0/N changes即输出 Unable to find further optimization, or distribution is already perfect随后打印每个 OSD 的最终 PG 数量与总耗时/轮数。当--save或--upmap-active生效时计算出的增量会被apply_incremental()应用到内存 Map 并标记modified最终写回文件epoch 递增。测试 src/test/cli/osdmaptool/upmap.t 展示了完整链路--create-from-conf建 Map →--mark-up-in --upmap-max 11 --upmap c --save生成 11 条ceph osd pg-upmap-items命令并持久化 →--print验证pg_upmap_items已写入 Map。这也是推荐的工作流先用 osdmaptool 离线验证与生成命令再在真实集群中执行。3.7 读平衡primary 平衡类选项选项说明--read file计算用于平衡 PG primary 的 upmap 条目写入file--read-pool poolname指定读平衡器要调整的 pool--osd-size-aware读模式下考虑不同容量设备需 pool 设置read_ratio读平衡的目标是让每个 OSD 上的primary 数量即承担读流量主副本的角色尽量均衡。源码流程src/tools/osdmaptool.cc校验 pool 存在且为副本replicated类型纠删码池会直接报错退出调用get_pgs_by_osd()收集调整前每个 OSD 的 PG 与 primary 分布并用calc_read_balance_score()计算read_balance_score分数越低越均衡调用osdmap.balance_primaries()计算调整方案--osd-size-aware时传入RB_OSDSIZEOPT此时要求 pool 已设置合法的read_ratio可通过ceph osd pool set pool read_ratio value配置再次统计并打印 BEFORE / AFTER 两段对比每个 OSD 的primary affinity、number of prims以及前后read_balance_score最后输出num changes与生成的命令。--osd-size-aware模式下若read_ratio未设置或超出(0,100]范围工具会给出明确的设置指引后退出。四、实战示例与输出解读4.1 创建 16 设备 OSD Map 并查看osdmaptool --createsimple 16 osdmap --clobber osdmaptool --print osdmap第一条命令创建包含 16 个 OSD 的通用 Map若文件已存在则覆盖第二条以纯文本打印全部内容包括 epoch、fsid、pool 定义、max_osd以及内嵌 CRUSH Map 的文本视图。4.2 查看 pool 1 的 PG 映射统计osdmaptool osdmap --test-map-pgs-dump --pool 1典型输出如下完整复刻自原文档pool 1 pg_num 8 1.0 [0,2,1] 0 1.1 [2,0,1] 2 1.2 [0,1,2] 0 1.3 [2,0,1] 2 1.4 [0,2,1] 0 1.5 [0,2,1] 0 1.6 [0,1,2] 0 1.7 [1,0,2] 1 #osd count first primary c wt wt osd.0 8 5 5 1 1 osd.1 8 1 1 1 1 osd.2 8 2 2 1 1 in 3 avg 8 stddev 0 (0x) (expected 2.3094 0.288675x)) min osd.0 8 max osd.0 8 size 0 0 size 1 0 size 2 0 size 3 8该输出包含四层信息PG 表pool 1 有 8 个 PG每行是一个 PG列为「PG id、acting 集合、primary OSD」。例如1.5 [0,2,1] 0表示 PG 1.5 的 acting 集合为[0,2,1]primary 是 OSD 0OSD 表每行是一个 OSD列为「映射到该 OSD 的 PG 数count、该 OSD 出现在 acting 集合首位first的 PG 数、作为 primary 的 PG 数、CRUSH 权重c wt、OSD 权重wt」分布统计对 3 个 OSD 上 PG 数量做统计给出均值avg、标准差stddev、stddev/avg、以及期望标准差基于二项分布模型的期望值与其比值——本例 stddev 为 0说明 8 个 PG 被完美均匀地分散到 3 个 OSDsize 分布统计映射到 n 个不同 OSD 的 PG 数量。本例size 3 8表示全部 8 个 PG 都映射到了 3 个不同的 OSD副本数恰好 3没有 PG 出现降级size 3。4.3 失衡集群的统计对比在一个分布不那么均衡的集群中输出可能如下来自原文档#osd count first primary c wt wt osd.0 33 9 9 0.0145874 1 osd.1 34 14 14 0.0145874 1 osd.2 31 7 7 0.0145874 1 osd.3 31 13 13 0.0145874 1 osd.4 30 14 14 0.0145874 1 osd.5 33 7 7 0.0145874 1 in 6 avg 32 stddev 1.41421 (0.0441942x) (expected 5.16398 0.161374x)) min osd.4 30 max osd.1 34 size 0 0 size 1 0 size 2 0 size 3 646 个 OSD 承载 64 个 PG平均 32 个/PG标准差 1.41421。注意此处c wtCRUSH 权重 0.0145874与wtOSD 权重 1不一致——CRUSH 权重低但 OSD 权重为 1 的情况往往意味着设备存在容量差异或 CRUSH 权重被调整过这正是需要 upmap 平衡器介入的场景。4.4 模拟 upmap 活跃平衡器osdmaptool --upmap upmaps.out --upmap-active --upmap-deviation 6 --upmap-max 11 osdmap输出来自原文档osdmaptool: osdmap file osdmap writing upmap command output to: upmaps.out checking for upmap cleanups upmap, max-count 11, max deviation 6 pools movies photos metadata data prepared 11/11 changes Time elapsed 0.00310404 secs pools movies photos metadata data prepared 11/11 changes Time elapsed 0.00283402 secs pools data metadata movies photos prepared 11/11 changes Time elapsed 0.003122 secs pools photos metadata data movies prepared 11/11 changes Time elapsed 0.00324372 secs pools movies metadata data photos prepared 1/11 changes Time elapsed 0.00222609 secs pools data movies photos metadata prepared 0/11 changes Time elapsed 0.00209916 secs Unable to find further optimization, or distribution is already perfect osd.0 pgs 41 osd.1 pgs 42 osd.2 pgs 42 osd.3 pgs 41 osd.4 pgs 46 osd.5 pgs 39 osd.6 pgs 39 osd.7 pgs 43 osd.8 pgs 41 osd.9 pgs 46 osd.10 pgs 46 osd.11 pgs 46 osd.12 pgs 46 osd.13 pgs 41 osd.14 pgs 40 osd.15 pgs 40 osd.16 pgs 39 osd.17 pgs 46 osd.18 pgs 46 osd.19 pgs 39 osd.20 pgs 42 Total time elapsed 0.0167765 secs, 5 rounds解读要点每轮以pools 名称列表开头pool 顺序每轮随机打乱源码中std::shuffle(pools.begin(), pools.end(), ...)prepared X/11 changes表示本轮计算出的调整条目数条目内容写入upmaps.out形如ceph osd pg-upmap-items 1.7 142 147参见 src/test/cli/osdmaptool/upmap.t5 轮后某轮prepared 0/11判定无法继续优化或分布已完美随即打印每个 OSD 的最终 PG 数20 个 OSD 均在 3946 之间最大差 7已落在--upmap-deviation 6允许的偏离范围内每个file输出可直接作为脚本在真实集群执行sh upmaps.out这就是先离线模拟、再线上执行的平衡落地方式。4.5 模拟读平衡primary 平衡先确保容量已通过 upmap 模式平衡再对副本池做读平衡osdmaptool osdmap --read read.out --read-pool pool name输出来自原文档./bin/osdmaptool: osdmap file om writing upmap command output to: read.out ---------- BEFORE ------------ osd.0 | primary affinity: 1 | number of prims: 3 osd.1 | primary affinity: 1 | number of prims: 10 osd.2 | primary affinity: 1 | number of prims: 3 read_balance_score of cephfs.a.meta: 1.88 ---------- AFTER ------------ osd.0 | primary affinity: 1 | number of prims: 5 osd.1 | primary affinity: 1 | number of prims: 5 osd.2 | primary affinity: 1 | number of prims: 6 read_balance_score of cephfs.a.meta: 1.13 num changes: 5BEFORE/AFTER 对比显示primary 数从 3/10/3 调整为 5/5/6read_balance_score从 1.88 降至 1.13共 5 处调整命令写入read.out。若输出 Unable to find further optimization, or distribution is already perfect则表示 primary 分布已无需优化。五、与其他工具的分工与配合ceph(8)在线管理集群的命令行入口ceph osd pg-upmap等命令用于在运行中的集群上应用 upmap 调整crushtool(8)独立的 CRUSH Map 操作工具可对osdmaptool --export-crush导出的文件做--decompile/--compile/--test等操作。两者常配合使用先用--export-crush导出再用 crushtool 离线验证 CRUSH 规则或用crushtool --build构造新 CRUSH Map 后通过--import-crush导入见 src/test/cli/osdmaptool/test-map-pgs.t 中crushtool --build --num_osds 500 node straw 10 rack straw 10 root straw 0构造 500 设备 CRUSH Map 再导入的用法。六、源码结构速览主程序src/tools/osdmaptool.cc985 行涵盖参数解析、Map 构建、CRUSH 导入导出、PG 映射测试、upmap/read 平衡计算与输出OSD Map 核心类src/osd/OSDMap.h 与 src/osd/OSDMap.cc提供calc_pg_upmaps()、balance_primaries()、clean_pg_upmaps()、calc_read_balance_score()等平衡算法实现CLI 回归测试src/test/cli/osdmaptool 目录下的*.t文件覆盖创建打印create-print.t、CRUSH 导入导出与权重调整crush.t、upmap 生成与持久化upmap.t、upmap-out.t、映射统计test-map-pgs.t、树形视图tree.t、pool 处理pool.t、覆盖保护clobber.t、参数缺失missing-argument.t等场景。七、使用注意事项--createsimple/--create-from-conf在目标文件已存在且未加--clobber时会拒绝覆盖--mark-up、--mark-out、--mark-in、--adjust-crush-weight等修改默认不写回文件只有显式--saveupmap/read 模式为--upmap-active或--save才会持久化并使 epoch 递增--upmap-deviation必须 ≥ 1--read仅支持副本池--osd-size-aware仅对 read 模式生效且要求 pool 已配置read_ratio生成的 upmap/read 命令文件需要在真实集群中用ceph命令逐一执行osdmaptool 本身不会连接集群该工具用于离线分析、预演与脚本化测试实际集群中的动态平衡由 mgr balancer 模块在线完成两者共享同一套calc_pg_upmaps底层算法因此离线模拟结果对线上有直接参考价值。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Ceph 动态集群管理CRUSH 映射、PG 放置与自愈机制深度解析Ceph 动态集群管理CRUSH 映射、PG 放置与自愈机制深度解析 导读 本文基于 Ceph 官方架构文档 doc/architecture/dynamic存储分布式文件系统对象存储后端高可用葱香酱肉包出品全解供应商溯源、蒸柜 15 分钟标准流程与营养数据CookLikeHOC 早餐篇葱香酱肉包出品全解供应商溯源、蒸柜 15 分钟标准流程与营养数据CookLikeHOC 早餐篇 本文围绕 CookLikeHOC 仓库中 早餐/葱香酱肉包存储分布式文件系统对象存储后端高可用Ceph 集群平衡设计解析容量平衡Upmap与读平衡Read Balancer的机制与实战Ceph 集群平衡设计解析容量平衡Upmap与读平衡Read Balancer的机制与实战 在分布式存储系统 Ceph 中请求的均衡分布直接决定了集存储分布式文件系统对象存储后端高可用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PCIe 6.0从PAM4到Flit:关键协议变化与64GT/s链路验证

PCIe 6.0从PAM4到Flit:关键协议变化与64GT/s链路验证

简介:PCI Express 6.0 Base Specification是PCI-SIG于2021年发布的官方基础规范文档,面向硬件工程师、FPGA开发者、系统架构师以及计算机体系结构学习者,用于理解新一代高速串行总线的技术演进与实现细节。文档重点阐述了PAM4信号编码、每通道…

2026/9/24 23:21:21 阅读更多 →
Django驱动的渗透测试平台:模型设计、异步扫描与插件化实现

Django驱动的渗透测试平台:模型设计、异步扫描与插件化实现

简介:这套基于Python-Django的多功能Web安全渗透测试工具源码包,面向安全测试人员、Python开发者和网络安全相关专业学习者,解决Web应用安全评估与漏洞发现的实际需求。系统集成漏洞检测、目录识别、端口扫描、指纹识别、域名探测、旁站探测、…

2026/9/23 1:08:04 阅读更多 →
300611从入门到精通:3天吃透原理,面试不再哑口无言

300611从入门到精通:3天吃透原理,面试不再哑口无言

300611从入门到精通:3天吃透原理,面试不再哑口无言 面试时被问到底层原理,你只能尴尬地微笑?很多开发者在300611相关技术栈的进阶路上,都卡在了“知其然不知其所以然”的瓶颈。想从入门到精通,光背代码没用,必须把底层逻辑吃透。今天不整…

2026/9/23 1:07:04 阅读更多 →

最新新闻

ctf-wiki 橢圓曲線加密(ECC)從入門到實戰:離散對數基礎、ElGamal 方案與 SECCON CTF 破解

ctf-wiki 橢圓曲線加密(ECC)從入門到實戰:離散對數基礎、ElGamal 方案與 SECCON CTF 破解

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本篇技術指南以 ctf-wiki 的 ecc.md 為主體,系統梳理橢圓曲線加密(Elliptic Curve C…

2026/9/25 2:49:25 阅读更多 →
swagger-codegen 生成的 Java 只读模型文档解读:以 okhttp-gson-parcelableModel 的 HasOnlyReadOnly 为例

swagger-codegen 生成的 Java 只读模型文档解读:以 okhttp-gson-parcelableModel 的 HasOnlyReadOnly 为例

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http…

2026/9/25 2:49:25 阅读更多 →
TypeResolver 入门指南:基于 PSR-5 的 PHP 类型与 FQSEN 解析实战

TypeResolver 入门指南:基于 PSR-5 的 PHP 类型与 FQSEN 解析实战

开发工具静态分析 【免费下载链接】TypeResolver A PSR-5 based resolver of Class names, Types and Structural Element Names 项目地址: https://gitcode.com/gh_mirrors/ty/TypeResolver 点击查看 免费下载 本文是一份面向 PHP 开发者的 TypeResolver 上手指南…

2026/9/25 2:49:24 阅读更多 →
Apereo CAS Standalone 配置模式全解:外部化配置目录、文件加载顺序与覆盖策略

Apereo CAS Standalone 配置模式全解:外部化配置目录、文件加载顺序与覆盖策略

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 导读:本文深入讲解 Apereo CAS 默认的 Standalone&#…

2026/9/25 2:49:24 阅读更多 →
企业采购矩阵工具:版本选型需要考量哪些核心要素?

企业采购矩阵工具:版本选型需要考量哪些核心要素?

很多企业做线上内容矩阵运营,在挑选矩阵管理工具的时候,很容易陷入只看价格、只对比基础功能的误区。不少运营负责人采购后才发现,版本不匹配团队规模、账号上限不够、缺少内容分发或者数据汇总能力,后续升级还要额外付费&#xf…

2026/9/25 2:49:23 阅读更多 →
EasyWeChat 6.x 开放平台第三方平台实战示例:从推送事件接收、预授权到代公众号/小程序调用

EasyWeChat 6.x 开放平台第三方平台实战示例:从推送事件接收、预授权到代公众号/小程序调用

后端即时通讯 【免费下载链接】easywechat 📦 一个 PHP 微信 SDK 项目地址: https://gitcode.com/gh_mirrors/ea/easywechat 点击查看 免费下载 本篇基于 EasyWeChat 6.x(PHP 微信 SDK)的开放平台第三方平台模块,围绕…

2026/9/25 2:48:22 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →