新闻详情

新闻详情

首页 / 资讯中心 / 详情

Perkeep 文件系统 Schema 公共字段全解:camliVersion、文件名与 Unix 元数据规范

发布时间:2026/9/29 2:36:24来源:尧图网络
Perkeep 文件系统 Schema 公共字段全解:camliVersion、文件名与 Unix 元数据规范
后端数据存储【免费下载链接】perkeepPerkeep (née Camlistore) is your personal storage system for life: a way of storing, syncing, sharing, modelling and backing up content.项目地址https://gitcode.com/gh_mirrors/pe/perkeep点击查看免费下载在 Perkeep前身 Camlistore的 blob 存储体系中底层存储的只是哑字节而上层应用通过一套统一的 JSON Schema 来赋予数据含义。doc/schema/common.md定义的正是这套规范中所有文件系统类对象共享的基础字段——无论你处理的是普通文件file、目录directory、符号链接symlink、FIFO 还是套接字socket这些字段都是它们公共的骨架。读完本文你将掌握这些公共字段的确切语义、可选与必填约束、文件名与 Unix 元数据的编码规则以及 Perkeep 源码在解析这些字段时的防御性处理细节。公共字段在 Schema 体系中的定位Perkeep 的 Schema 文档体系以 doc/schema/README.md 为入口它明确了底层设计任何 schema blob 都是 JSON 对象其中camliVersion与camliType两个属性永远存在前者恒为 1后者标明该 blob 承载的元数据类型同时schema blob 的大小上限为 1MB对应源码中的MaxSchemaBlobSize 1 20见 pkg/schema/schema.go。common.md描述的字段被其他类型文档以包含方式复用doc/schema/file.md 的文件 Schema 通过#include common.md引入公共字段再叠加inodeRef当链接计数大于 1、需要正确表示硬链接时指向inodeblobdoc/schema/directory.md 的目录 Schema 要求完整包含common.md 中所有必填与可选字段并额外要求必填的entries指向一个static-setblob 的引用symlink、fifo、socket等类型同样以 common.md 为基座分别补充symlinkTarget、parts等各自专有字段。因此理解 common.md 是读懂整个文件系统类 Schema 的前提。两个永远在场的字段camliVersion 与 camliType{camliVersion: 1, camliType: ..., // one of file, directory, symlink, fifo, socket }camliVersionschema blob 的格式版本号当前恒为 1。源码 pkg/schema/schema.go 中所有 builder 都以base(1, ctype)起步将该值固定写入mapJSON还保证规范化的 JSON 输出总是以{camliVersion:开头。camliType指明 blob 的元数据类型。pkg/schema包用CamliType常量枚举了全部合法值pkg/schema/schema.gobytes、claim、directory、fifo、file、inode、keep、permanode、share、socket、static-set、symlink。其中属于本公共字段讨论范围的文件系统类类型是file、directory、symlink、fifo、socket五种。注意common.md只列出这五种而源码中newDirectoryEntry校验目录条目时也正是只接受这五种类型pkg/schema/schema.go。文件名字段fileName 与 fileNameBytes 的二选一约束// At most one of these may be set. (zero may be present only for large files subranges, // represented as a tree of file schemas) But exactly one of these is required for // top-level files, directories, symlinks, FIFOs, sockets, e.t.c. fileName: if-it-is-utf8.txt, // only for utf-8 fileNameBytes: [65, 234, 234, 192, 23, 123], // if unknown charset (not recommended)这是公共字段中最容易出错的部分规则值得细读二者至多设置其一fileName与fileNameBytes是同一信息条目基准文件名的两种编码不允许同时出现。顶层对象必须恰好设置其一对顶层的 file、directory、symlink、FIFO、socket 等对象恰好一个是必填约束。唯一例外当大文件被切分成子区间、表示为一棵文件 Schema 树时中间层的子文件对象可以两者都不设置即允许零个。fileName仅当文件名是合法 UTF-8 时使用直接以 JSON 字符串承载。fileNameBytes当字符集未知不推荐的做法时使用。它是由数字字节值和 UTF-8 字符串片段混合组成的数组例如[65, 234, 234, 192, 23, 123]表示逐字节给出非 UTF-8 文件名。源码侧的处理印证了这一设计的防御意图。superset结构同时定义了FileName string与FileNameBytes []any两个字段pkg/schema/schema.go而访问器FileNameString()先取fileName为空时再经stringFromMixedArray从字节数组还原pkg/schema/schema.go。stringFromMixedArray会把数组中的字符串片段直接拼入、把数字当作字节值写入pkg/schema/schema.go反向的mixedArrayFromString则负责把任意字符串拆回 UTF-8 片段与非 UTF-8 字节的混合数组。更重要的是安全校验FileNameString()一旦发现还原后的文件名包含/或\会直接返回空字符串——这是为了防止恶意的 schema blob 通过文件名注入路径分隔符绕过目录边界。Perkeep 在读取 schema 数据时就把这类伪造 schema blob视为无效并忽略。Unix 元数据字段权限、属主、属组与时间戳// Optional: unixPermission: 0755, // no octal in JSON, so octal as string unixOwnerId: 1000, unixOwner: bradfitz, unixGroupId: 500, unixGroup: camliteam, unixXattrs: [....], // TBD unixMtime: 2010-07-10T17:14:51.5678Z, // UTC-- ISO 8601, as many significant digits as known unixCtime: 2010-07-10T17:20:03.9212Z, // UTC-- ISO 8601, best-effort to match unix meaning // Not recommended to include, but if you must: (atime is a bit silly) unixAtime: 2010-07-10T17:14:22.1234Z, // UTC-- ISO 8601权限unixPermission必填性可选字段但它在 FUSE 挂载等场景中决定条目呈现的模式。格式陷阱JSON 没有八进制字面量因此八进制权限码必须以字符串形式出现如0755。注意这里的写法0前缀与写入侧的fmt.Sprintf(0%o, ...)一致见 pkg/schema/schema.go。解析逻辑源码superset.FileMode()使用strconv.ParseUint(ss.UnixPermission, 8, 64)把该字符串按八进制解析再叠加类型位目录加ModeDir、符号链接加ModeSymlink、FIFO 加ModeNamedPipe、套接字加ModeSocket。若该字段缺失则按类型回退默认值目录0755、其余0644pkg/schema/schema.go。属主与属组unixOwnerId / unixOwner / unixGroupId / unixGroup四个字段成对出现数字 ID 与名称互为补充便于在不同机器间移植。源码populateSchemaUnixpkg/schema/schema_posix.go在 Linux、macOS 等 POSIX 系统上从syscall.Stat_t读取 UID/GID并尝试解析出对应的用户名/组名一并写入。消费侧的逻辑值得注意MapUid()/MapGid()会优先按名称映射——先尝试用unixOwner/unixGroup在本地查找匹配的 UID/GID找不到才直接透传数字 IDpkg/schema/schema.go。这意味着跨机器恢复文件时只要名称存在就能正确归属名称缺失时才回退到数字而源码注释也指出数字 ID 未设置时回退为 0 并不理想。时间戳unixMtime / unixCtime / unixAtime三个时间字段统一采用UTC 的 ISO 8601RFC 3339格式小数秒的位数按已知精度尽量多给unixMtime修改时间是最常被使用的字段。unixCtime状态变更时间尽力与 Unix 语义一致。在 Linux 上由populateSchemaCtimepkg/schema/schema_linux.go从st.Ctim读取且仅在 ctime 与 mtime 不同的情况下才写入避免冗余。源码注释明确说明这是尽力匹配 unix 含义的最佳实践因为 ctime 语义在不同文件系统上并非完全一致。unixAtime访问时间文档直言atime 有点蠢atime is a bit silly不推荐包含。写入侧的时间序列化统一走RFC3339FromTimepkg/schema/schema.go时区已知则转换为 UTC 并以Z结尾时区未知如 EXIF 中常出现的无时区偏移时间则使用-00:01这一魔法时区UnknownLocationUTC 以西 1 分钟见 pkg/schema/schema.go仅当时间带小数秒时才输出纳秒精度。读取侧superset.ModTime()则用time.Parse(time.RFC3339, ...)解析unixMtime解析失败返回零值时间。unixXattrsunixXattrs目前标注为TBD待定文档只给出占位[....]表示扩展属性序列化格式尚未定型生产环境不应依赖该字段。从源码看公共字段的完整映射pkg/schema包中superset结构pkg/schema/schema.go被称为Perkeep JSON Schema 公共键的超集它把所有公共字段直接映射为 Go 结构体标签方便快速核对本文讨论的每个字段文档字段JSON tag说明camliVersionjson:camliVersion版本恒为 1camliTypejson:camliType类型枚举见上文fileNamejson:fileNameUTF-8 文件名fileNameBytesjson:fileNameBytes混合字节数组非 UTF-8 用unixPermissionjson:unixPermission八进制权限字符串unixOwnerIdjson:unixOwnerId属主数字 IDunixOwnerjson:unixOwner属主名称unixGroupIdjson:unixGroupId属组数字 IDunixGroupjson:unixGroup属组名称unixMtimejson:unixMtime修改时间RFC 3339unixCtimejson:unixCtime状态变更时间尽力而为unixAtimejson:unixAtime访问时间不推荐此外parseSupersetpkg/schema/schema.go在读入任意 schema blob 时会先执行 1MB 上限检查io.CopyN读MaxSchemaBlobSize1字节超限报errSchemaBlobTooLarge再进行 JSON 反序列化——这就是上文schema blob 最大 1MB约束在实现层的落实也是理解大目录/大文件为什么需要static-set分片与bytes哈希树的原因。公共字段的实战组合示例结合 doc/schema/bytes.md描述文件字节内容的parts数组与 doc/schema/attributes.mdpermanode 上camliContent等属性约定一个真实的、可上传的顶层文件 schema blob 大致如下{ camliVersion: 1, camliType: file, fileName: notes.txt, unixPermission: 0644, unixOwnerId: 1000, unixOwner: bradfitz, unixGroupId: 500, unixGroup: camliteam, unixMtime: 2010-07-10T17:14:51.5678Z, unixCtime: 2010-07-10T17:20:03.9212Z, parts: [ {blobRef: sha1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, size: 1024} ] }对应的目录 schema 则在继承全部公共字段如fileName、unixPermission等之外还必须提供指向static-set的entries引用{ camliVersion: 1, camliType: directory, fileName: projects, unixPermission: 0755, entries: sha1-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy }对于需要保留非 UTF-8 文件名的极端场景公共字段则退化为fileNameBytes形式不推荐{ camliVersion: 1, camliType: file, fileNameBytes: [65, 234, 234, 192, 23, 123], parts: [ {bytesRef: sha1-zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz, size: 5000000, offset: 492} ] }小结doc/schema/common.md虽然篇幅精炼却是 Perkeep 文件系统类 schema 的公共契约camliVersion/camliType标识 blob 的身份fileName/fileNameBytes以二选一方式承载文件名且允许大文件子区间对象两者皆无unixPermission/unixOwnerId/unixOwner/unixGroupId/unixGroup/unixMtime/unixCtime/unixAtime完整描述了 Unix 元数据其中 atime 被明确标注为不建议携带。结合 pkg/schema/schema.go 中superset的字段映射、FileNameString的路径分隔符防御、FileMode的八进制解析与默认模式回退以及 pkg/schema/schema_posix.go 和 pkg/schema/schema_linux.go 的系统级填充逻辑你既能写出符合规范的 schema blob也能理解 Perkeep 在读取与恢复这些元数据时的真实行为边界。赞分享后端数据存储【免费下载链接】perkeepPerkeep (née Camlistore) is your personal storage system for life: a way of storing, syncing, sharing, modelling and backing up content.项目地址https://gitcode.com/gh_mirrors/pe/perkeep点击查看免费下载相关推荐TransformerLab 任务数据模型全解析文件系统存储、index.json 权威元数据与 task.yaml 规范TransformerLab 任务数据模型全解析文件系统存储、index.json 权威元数据与 task.yaml 规范 本文围绕 TransformerL人工智能大模型微调模型评测模型推理服务LLMOps本地部署后端CLITruffle 合约工件Contract ArtifactJSON Schema 全解析contract-schema 规范、字段定义与规范化实现Truffle 合约工件Contract ArtifactJSON Schema 全解析contract schema 规范、字段定义与规范化实现 导读区块链开发工具Web3跨平台Node.js开发指南文件系统与文件名规范详解跨平台Node.js开发指南文件系统与文件名规范详解 前言 在跨平台开发中文件系统操作是一个常见但容易被忽视的痛点。不同操作系统对文件名和路径有着不同的限制上一篇从源码到固件st7789_mpy驱动的C语言实现原理与MicroPython移植指南下一篇Ant Design X组件性能优化案例AI应用性能提升的实战案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TensorFlow本质:从计算引擎到工业级AI落地框架 2026/9/29 3:26:44

TensorFlow本质:从计算引擎到工业级AI落地框架

1. 这不是“装个库”那么简单:TensorFlow到底在解决什么问题?你搜“tensorflow安装”,页面跳出的全是pip install、conda install、CUDA版本匹配、cuDNN路径报错——但真正卡住你的,从来不是那行命令敲得对不对。我带过二十多个从…

阅读更多 →
电气互联系统有功-无功协同优化模型与Matlab实现 2026/9/29 3:26:44

电气互联系统有功-无功协同优化模型与Matlab实现

“碳中和”目标提出之后,电力系统的运行方式发生了根本性变化,新能源占比越来越高,电网与天然气网络的耦合越来越紧密,传统只盯着“有功调度”或者“无功电压”单线优化的做法,已经很难满足经济性、安全性和低碳性的多…

阅读更多 →
P1xt Guides 前端开发 Speedrun 实战清单:21 个练习项目与完整配套资源解析 2026/9/29 3:26:38

P1xt Guides 前端开发 Speedrun 实战清单:21 个练习项目与完整配套资源解析

教程文档 【免费下载链接】p1xt-guides Programming curricula 项目地址: https://gitcode.com/gh_mirrors/p1/p1xt-guides 点击查看 免费下载 本文以 frontend-dev.md 为蓝本,系统解析 P1xt Guides「Practice Speedrun」系列中前端 Web 开发方向的速刷…

阅读更多 →
从零构建AI应用工程:RAG智能问答全流程实践 2026/9/29 3:26:37

从零构建AI应用工程:RAG智能问答全流程实践

1. 从零开始做AI工程,我到底在做什么如果你搜过 ai-engineering-from-scratch,大概是已经受够了市面上那些“三天入门大模型”“七天搞定智能应用”的速成课,或者手头有个业务场景,想真正落地一套AI方案,但发现网上能找…

阅读更多 →
AI真的懂你!阿里发布Qwen3-Omni-Flash 全模态大模型:超强交互,人设任选——用 TaoToken 统一 Key 接入全模态对话 2026/9/29 3:26:31

AI真的懂你!阿里发布Qwen3-Omni-Flash 全模态大模型:超强交互,人设任选——用 TaoToken 统一 Key 接入全模态对话

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

阅读更多 →
Allegro PCB培训如何选:聚焦工程化能力跃迁 2026/9/29 3:26:25

Allegro PCB培训如何选:聚焦工程化能力跃迁

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉