下载与安装
一般有三种安装方式:go-ipfs
- 直接在此下载二进制文件并移入/usr/local/bin/中;
- 使用sudo snap install ipfs IPFS- snap安装
- 从源码编译--官方github的方法--使用go get或者直接download进行make install
这里我们采用第一种,下载官方编译后的版本,然后进行安装:
- 从官方下载压缩包,并解压到指定位置:https://dist.ipfs.io/#go-ipfs
- mv ipfs 到可用的bin目录下(/usr/local/bin/ipfs或者~/bin/ipfs)
初步使用-创建ipfs节点&启动服务
- 在用户根目录创建 .ipfs
- 在目录下 ipfs init初始化一个ipfs node节点(类似于本地仓库)
- ipfs id :查看节点属性
- 里面有一个节点id
- 修改节点配置需要
export EDITOR=/usr/bin/subl //初始化一个编辑器
ipfs config edit
- 启动IPFS节点服务器:
ipfs daemon
- 如果需要暴露给外界,并提供访问,则需要配置:跨域资源共享CORS配置
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
- 验证服务访问情况
ipfs cat /ipfs/{nodeid}/readme
- 查看WebUI
http://localhost:5001/webui
- 查看相关命令
ipfs —help
注意访问是否需要屏蔽防火墙
运维和使用:
- 添加file
- ipfs add filename 添加文件数据
- ipfs cat hash 获取数据(文件)
但是现在官网还没有加入,所以无法通过http://ipfs.io/ipfs/hash 进行访问。 这是ipfs网络的官方网关-文件浏览器。在没有打开daemon时,添加是无效的。打开ipfs daemon,然后在添加file。是可以在官网进行访问的。(当然前提是你的daemon能够和官方网关在同一个网络中,你懂的。这个后面的文章会涉及)
- 添加文件夹
同时我们可以在IPFS的根目录中创建文件夹,然后将文件进行移动。
cp不会改变hash。但是mv会改变hash的寻址。
这里只是在ipfs的文件系统(并不是local文件系统中的ipfs根目录)创建目录。然后可以在这个目录底下创建文件。
- ipfs files mkdir /targetPath
- ipfs files cp /ipfs/hashcode /targetPath/file.txt
- ipfs files ls
- ipfs files read filepath
- 添加文件
ipfs add -r path
他会产生一个目录hash和这个目录下所有文件的hash。访问文件的方式:
- 可以通过目录hash/filename访问
- 也可以通过hashcode直接访问
如果修改目录下的内容,则需要持续更改IPFS目录的hash。我们可以用IPNS进行解决统一目录访问的问题。
其可以允许我们的节点的域名空间引用一个IPFS hash,也就是说我们可以通过节点ID对项目根目录的IPFS HASH进行绑定,以后我们访问内容站点时直接通过节点·ID访问即可,当我们更新内容时,重新发布到IPNS`即可。
-
ipfs name publish targePath
* 验证:ipfs name resolve id
* 通过IPNS进行访问:ipfs.io/ipns/id
进阶
- 添加文件
使用-w filename
,添加的文件会返回两行
[root@VM_0_12_centos ipfs_test]# echo "hello1" | ipfs add -w
added QmUgAgTVxq7UeY3Tbumz72fBsSvkUnveEgEkWvVquEvJVV QmUgAgTVxq7UeY3Tbumz72fBsSvkUnveEgEkWvVquEvJVVadded
QmYPQAaaw5mVxwT8iZ1wc7d6k5hD7cHhqCyQH81toPK7Rs
结果的第一行就是添加文件的hash,第二行就是包装这个文件的一个目录的hash。
-w
指令的航意就是让ipfs创建一个文件的内容以及包裹文件内容的目录(含有这个文件)。
ipfs ls hash
可以看到指定的hash的目录和文件信息,添加-v
参数可以将头部信息进行打印。
其本质上就是列出这个目录(hash)关联的所有文件。
Tips
有人会疑惑:“那不是一个目录就一个文件?”。其实我们在添加文件的时候,可以用空格进行分割,同时添加多个文件。这样就能够在一个directory下有很多的文件了。同时我们可以在add的时候使用-r
,同时在该目录下创建多级目录。这样我们就能够添加一个多层级的目录结构。而且目录有hash,文件有hash。例如:
[root@VM_0_12_centos ipfs_test]# ipfs add -wr file2.txt file1.txt test
added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN file1.txt
added QmQTJqBR6pXws7ustXUexbs1S49qzXR47DbwRHLkB3qJPe file2.txt
added Qmair6VNFLJMAH69E5TJBei3NNiJRWPnxXo3BA31j7oXf9 test/file1.txt
added QmWANm4FeobTEHg5P2pwwiraPJktZi7ikb75H62gXshqFj test/file2.txt
added Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V test
added QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7
[root@VM_0_12_centos ipfs_test]# ipfs ls -v QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7
Hash Size Name
QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN 14 file1.txt
QmQTJqBR6pXws7ustXUexbs1S49qzXR47DbwRHLkB3qJPe 18 file2.txt
Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V 160 test/
[root@VM_0_12_centos ipfs_test]# ipfs ls -v Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V
Hash Size Name
Qmair6VNFLJMAH69E5TJBei3NNiJRWPnxXo3BA31j7oXf9 23 file1.txt
QmWANm4FeobTEHg5P2pwwiraPJktZi7ikb75H62gXshqFj 31 file2.txt
这里要注意的ifps cat
和ipfs ls
,前者访问针对文件,后者访问针对目录。
不过可以通过路径与文件名的形式访问文件。例如:
[root@VM_0_12_centos ipfs_test]# ipfs cat QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7/file1.txt
hello
[root@VM_0_12_centos ipfs_test]# ipfs cat QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7/test
Error: this dag node is a directory
[root@VM_0_12_centos ipfs_test]# ipfs cat QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7/test/file1.txt
hell,,,,asdfas
[root@VM_0_12_centos ipfs_test]# ipfs cat QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7/Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V/file1.txt
Error: no link named "Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V" under QmWQqDLTsXwygeBQvxhY2d21RWiZiGbGS95S4qggSMDBy7
[root@VM_0_12_centos ipfs_test]# ipfs cat Qmd5m5ZJ6yMpYt6UUooJAHv5SbckrAGkEzMcmKHvyH7p4V/file1.txt
hell,,,,asdfas
这里做了一些测试:
-
一级目录hash/filename
可以获取文件 -
一级目录hash/二级目录名称
无法获取 -
一级目录hash/二级目录名称/二级目录文件
可以获取文件 -
一级目录hash/二级目录hash/二级目录文件
无法获取,因为目录hash本身没有层级关系(他被看做是一个文件名)。
同时,如果添加不同的文件名,但是内容相同的文件呢?
[root@VM_0_12_centos ipfs_test]# cat file1.txt > file3.txt
[root@VM_0_12_centos ipfs_test]# ipfs add file1.txt
added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN file1.txt
[root@VM_0_12_centos ipfs_test]# ipfs add file3.txt
added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN file3.txt
我们可以看到ipfs并不关心文件名,只关心内容。如果加上-w
呢?
[root@VM_0_12_centos ipfs_test]# ipfs add -w file1.txt added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN file1.txt
added QmUs71TZY6Vy47vYrgu5baJwfGQNpMQKeHE2eAn3k2r5kv
[root@VM_0_12_centos ipfs_test]# ipfs add -w file3.txt
added QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x1AwQH file3.txt
added QmXc7dSBQGCxPuB8pSVtKpGvqTB7afv9KB1zGNCzCH2rhA
我们看到,如果添加了索引目录的话,ipfs就会将其视为两个文件。并且分配不同的hash。但是具体存储的时候是否存了两份?这个我们等到源码分析的时候再看。