IPFS的文件有不同的模式
默认模式
默认模式下, 文件会被解析并存入blocks, 同时文件的结构被存入filestore, 因为IPFS是按内容寻址的文件系统, 在添加时最外层的目录名或文件名信息会丢失, 如果需要保留名称信息, 需要在外层用目录包围(使用-w参数)
添加文件
# 添加一个文件
ipfs add some_file
# 添加文件并保留文件名(外层添加目录)
ipfs add -w some_file
# 添加整个目录
ipfs add -r some_folder/
文件管理
对于文件的查看,移动,改名,复制和删除, 用对应的命令完成, 和普通linux命令是一样的, 在这里可以重新组织你的文件结构以及重命名
# 查看, 默认路径为/,
ipfs files ls <path>
# 移动和改名
ipfs files mv <src> <tgt>
# 复制
ipfs files cp [-r] <src> <tgt>
# 删除
ipfs files rm <path>
大二进制文件模式
对于大的二进制文件, 例如压缩包和视频等, 对底层分割好的每个小内容块进行对象化会浪费很多不必要的空间, 因为这些信息不重要并且在下次更新时就会全部丢弃. 这时候对于底层叶子节点可以使用raw blocks, 关于raw blocks和objects的区分: In IPFS, a block refers to a single unit of data, identified by its key (hash). A block can be any sort of data, and does not necessarily have any sort of format associated with it. An object, on the other hand, refers to a block that follows the Merkle DAG protobuf data format. It can be parsed and manipulated via the ipfs object command. Any given hash may represent an object or a block.
添加文件
使用raw blocks模式添加文件需要使用参数 --nocopy, 使用这个参数隐含了 --raw-leaves 参数的使用, 使用这种方式添加, 在IPFS中只存储文件的meta信息, 不存储文件内容, 在读取时, 从源文件读取. 这种方式特别节省空间.
启用 使用这种方式需要在config中开启 Experimental.FilestoreEnabled true
# 使用--nocopy模式添加文件
ipfs add -r --nocopy some_folder/
ipfs add --progress --recursive --nocopy $HOME/mounts/foo
需要注意的是, 这里的目录必须在IPFS的工作空间目录下, IPFS的工作空间就是.ipfs目录所在的路径. 如果需要将任意路经的文件包含进来, 可以使用软链接.
# 列出所有的blocks, 不加参数则列出所有, 加参数则仅列出参数对应的对象, 注意这些对象都是底层的数据段, 不包含外层的文件名和目录结构等信息
ipfs filestore ls <object_hash>
# 校验所有的blocks, 不加参数则校验所有
ipfs filestore verify <object_hash>
通过--nocopy添加的文件不会出现在Files中, 在ipfs files ls中是看不到的, 这些文件在pin里面, 需要按pin的方式来管理.
通过--nocopy添加的文件, 其CID和普通模式添加的CID是不一样的, 因为从最底一层的数据块开始CID就已经不同.
文件管理
ipfs filestore对文件的管理还不够完整, 在对linux文件系统中的文件进行修改后, 可以通过ipfs add --nocopy再次同步, 但是不会删除那些已经不存在的文件对应的filestore内容. 需要等ipfs filestore rm命令的完善.
https://github.com/ipfs-filestore/go-ipfs/blob/master/filestore/README.md