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