dag export为何导出不完整CAR? 图 1
dag export为何导出不完整CAR? · 图 1

一份能被保存为.car的文件,不一定是一份完整备份。dag export以一个根为入口遍历DAG;根块存在、文件有体积、命令也没有把进度写进标准输出,都不足以证明所有后代已进入CAR。导出前后的核心问题只有两个:目标根要求哪些块,以及这些块在执行时是否都可读。

先保护CAR二进制流

ipfs dag export从一个根CID递归获取DAG,并把结果以CAR流写到标准输出。

进度信息写往标准错误流,CAR二进制流应单独重定向,避免把日志混入输出文件。

CAR写往标准输出,进度信息写往标准错误。自动化应分别重定向两个通道:标准输出只进入目标文件,标准错误进入日志,并同时保存退出码。把两个通道合并、在管道中插入会输出提示的命令,或让终端包装器给标准输出加前缀,都可能污染二进制文件。

写盘还要使用临时文件,完成基本检查后再原子改名。磁盘满、管道消费者提前退出或远程会话中断时,目标路径可能留下半截文件;若脚本只判断文件存在,下一步就会把残缺产物当成成功备份上传。

单根与遍历顺序的含义

当前命令只支持单根选择并输出CARv1,区块按严格DAG遍历、首次出现顺序输出。

当前命令按单个根选择DAG并输出CARv1,区块以严格DAG遍历中首次遇到的顺序写出。共享子树只需写一次,因此文件中的物理顺序和重复次数不能简单等同于应用目录顺序。若要备份多个独立根,应逐根导出或在上层构造清晰的汇总根,并保留根清单。

现象可能解释下一步证据
CAR体积偏小共享块多或存在缺块与dag stat、历史基线比较
根可读取只证明根路径的一部分遍历深层样本与块清单
导入成功文件结构可被解析在空仓库做根级读取
日志出现进度遍历正在发生仍需检查最终退出码

local-only是尽力而为,不是完整模式

local-only执行尽力而为的离线导出,会跳过本地缺失或不可读的区块及其子树,因此结果可能不完整。

local-only不从网络补取缺失块。遇到本地没有或不可读的区块时,它会跳过该块以及依赖它继续遍历的子树,于是仍可能产生一个包含根和部分分支的CAR。这个选项适合取证本地已有集合,不适合在没有额外验证的情况下宣称完成灾备。

离线导出前先用dag stat、实际读取或块清单定位缺口。若允许联网补块,则把网络获取与导出拆成两个可观察阶段:先让目标DAG完整进入本地并固定,再执行导出。这样网络抖动不会和文件写盘故障混成同一种失败。

在线导出也没有必达承诺

在线模式会尝试获取本地缺少的内容,但远端提供者可能离线,路由可能超时,网关或节点也可能限流。脚本应设置整体维护窗口,记录缺失CID和请求错误;超时后不要只增加重试次数,而要确认是否仍有可用提供者以及目标数据是否本来就不存在。

观察待取对象可结合Bitswap待取CID排查。即使最终网络请求返回成功,也要在固定的本地快照上重新执行导出,避免遍历期间数据集合持续变化导致难以复现。

最有力的验收是空仓复导入

在隔离的空仓库导入产物,确认声明的根,执行递归Pin验证,再读取代表性的深层文件。把导出前的dag stat共享大小结果与导入后统计比较,但不要直接把累计大小相加当作磁盘占用。重要备份再做CAR文件哈希并复制到独立介质。

完整的CAR备份检查路径见CAR备份完整性核验。本文只给出数据导出与恢复验收方法;它不保证网络上的内容永久存在,也不构成代币或存储服务投资建议。

导出取证资料

  1. Kubo dag export:导出语义、local-only、顺序和进度流。
  2. IPLD CARv1 specification:CARv1头、根与区块编码。

资料访问时间为2026-08-15。仍需保留的边界:远程网络获取是否完成取决于提供者、超时与本地节点状态,文章不承诺一次导出必然补齐所有块。