Linux单机部署ipfs模拟分布式存储

IPFS简介(参考链接)

星际文件系统(InterPlanetary File System,缩写IPFS)是一个旨在创建持久且分布式存储和共享文件的网络传输协议。该技术是一种内容可寻址的对等超媒体分发协议。在IPFS网络中的节点将构成一个分布式文件系统。它是一个开放源代码项目,自2014年开始由Protocol Labs在开源社区的帮助下发展。

IPFS是一个对等的分布式文件系统,它尝试为所有计算设备(ipfs矿机)连接同一个文件系统。在某些方面,IPFS类似于万维网,但它也可以被视作一个独立的BitTorrent群、在同一个Git仓库中交换对象。换种说法,IPFS提供了一个高吞吐量、按内容寻址的块存储模型,及与内容相关超链接。这形成了一个广义的Merkle有向无环图(DAG)。IPFS结合了分布式散列表、鼓励块交换和一个自我认证的命名空间。IPFS没有单点故障,并且节点不需要相互信任。分布式内容传递可以节约带宽,和防止HTTP方案可能遇到的DDoS攻击。

该文件系统可以通过多种方式访问,包括FUSE与HTTP。将本地文件添加到IPFS文件系统可使其面向全世界可用。文件表示基于其哈希,因此有利于缓存。文件的分发采用一个基于BitTorrent的协议。其他查看内容的用户也有助于将内容提供给网络上的其他人。IPFS有一个称为IPNS的名称服务,它是一个基于PKI的全局命名空间,用于构筑信任链,这与其他NS兼容,并可以映射DNS、.onion、.bit等到IPNS。

Linux安装IPFS

安装golang语言的环境

linux是由golong语言实现的,所以我们linux本机首先要安装golang语言的环境。

  • 这里采用go语言中文网提供的资源进行下载。

为了保证界面干净,我这把一些环境的安装包都放到了一个文件夹下,进入到这个文件夹,使用命令

wget https://studygolang.com/dl/golang/go1.15.10.linux-amd64.tar.gz

在这里插入图片描述

  • 解压到指定的文件夹,这里直接tar -zxvf不带参数也可以。默认解压到相同文件夹。
tar -C /home/dongmu_env -zxvf go1.15.10.linux-amd64.tar.gz

在这里插入图片描述

  • 配置环境变量

进入/etc目录下编辑profile文件

[root@iZwz9hv1phm24s3jicy8x1Z dongmu_env]# cd /etc
[root@iZwz9hv1phm24s3jicy8x1Z etc]# cat profile
******
中间内容省略
******
set java environment
JAVA_HOME=/home/dongmu_env/jdk1.8.0_121        
JRE_HOME=/home/dongmu_env/jdk1.8.0_121/jre     
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

#下面这部分是我配置的go的环境变量,注意根据自己的解压目录配置环境变量
export GOROOT=/home/dongmu_env/go
export GOPATH=/home/dongmu_env/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

GITPATH=/home/dongmu_env/git_install

export PATH=$PATH:$GITPATH/bin

  • 检查是否配置成功
首先使用
source /etc/profile
重新加载配置的环境变量
然后使用
go --version
查看是否安装成功

也可以使用
go version
命令查看

结果如下
[root@iZwz9hv1phm24s3jicy8x1Z etc]# go version
warning: GOPATH set to GOROOT (/home/dongmu_env/go) has no effect
go version go1.15.10 linux/amd64

安装git(参考文章

(参考文章)
由于安装ipfs的过程中需要用到git命令,所以这里需要安装git。

这里我们采用下载git的源码编译进行安装,而Git是C语言编写的,所以在安装Git前需要提前安装编译Git时需要的包。

yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install -y gcc perl-ExtUtils-MakeMaker

这个环境配置好了之后下载git的包

wget --no-check-certificate https://www.kernel.org/pub/software/scm/git/git-2.36.1.tar.gz

在这里插入图片描述
然后将git解压到当前目录,然后进行安装

tar -zxvf git-2.36.1.tar.gz  -C /home/dongmu_env/

下面进入到解压的目录
[root@iZwz9hv1phm24s3jicy8x1Z dongmu_env]# cd git-2.36.1/

执行下面的命令,配置安装的路径
./configure prefix=/dongmu_env/git_install

使用下面的命令进行安装
make && make install

为了在所有的目录下均可以使用git命令,我们把它配置到/etc/profile目录当中去。

在末尾新加两行代码

GITPATH=/home/dongmu_env/git_install

export PATH=$PATH:$GITPATH/bin

之后保存

然后使用命令
source /etc/profile
重新加载环境变量

使用
git --version
命令查看是否安装成功。

[root@iZwz9hv1phm24s3jicy8x1Z etc]# git --version
git version 2.36.1

可以发现我们这里安装成功。

安装ipfs

安装了这么久,下面终于到了安装ipfs的时候了。

# 下载
$ wget https://download.fastgit.org/ipfs/go-ipfs/releases/download/v0.9.1/go-ipfs_v0.9.1_linux-amd64.tar.gz

# 解压缩
$ tar xvfz go-ipfs_v0.9.1_linux-amd64.tar.gz

# 安装
[root@iZwz9hv1phm24s3jicy8x1Z dongmu_env]# cd go-ipfs/
[root@iZwz9hv1phm24s3jicy8x1Z go-ipfs]# ls
install.sh  ipfs  LICENSE  LICENSE-APACHE  LICENSE-MIT  README.md
[root@iZwz9hv1phm24s3jicy8x1Z go-ipfs]# ./install.sh
Moved ./ipfs to /usr/local/bin

在这里插入图片描述

为了方便本机部署多个ipfs节点,这里进行相关的配置。在根目录的mnt文件夹下面创建下面几个文件夹。

mkdir /mnt/ipfs_nodes            #所有节点目录
mkdir /mnt/ipfs_nodes/key        #集群私钥目录,用来存放集群的私钥
 
#下面目录分别用来存放不同的节点
mkdir /mnt/ipfs_nodes/ipfs_1     #IPFS节点1
mkdir /mnt/ipfs_nodes/ipfs_2     #IPFS节点2
mkdir /mnt/ipfs_nodes/ipfs_3     #IPFS节点3


下面对三个节点分别进行初始化

IPFS_PATH=/mnt/ipfs_nodes/ipfs_1 ipfs init    #初始化节点1
IPFS_PATH=/mnt/ipfs_nodes/ipfs_2 ipfs init    #初始化节点2
IPFS_PATH=/mnt/ipfs_nodes/ipfs_3 ipfs init    #初始化节点3

因为这里我是单机部署多节点,所以每次操作需要指定操作节点目录,如果是部署单节点,那么就可以在环境变量中提前配置 IPFS_PATH 变量,不用这么麻烦。

删除引导程序节点的默认条目
因为我们是部署私有网络,所以需要移除原有的引导程序节点,如果不删除,启动后就会同步IPFS主网的数据。

IPFS_PATH=/mnt/ipfs_nodes/ipfs_1/ ipfs bootstrap rm --all
IPFS_PATH=/mnt/ipfs_nodes/ipfs_2/ ipfs bootstrap rm --all
IPFS_PATH=/mnt/ipfs_nodes/ipfs_3/ ipfs bootstrap rm --all

在这里插入图片描述

下面进入mnt目录下下载用来生成密钥的工具,用来创建私有集群密钥。

[root@iZwz9hv1phm24s3jicy8x1Z mnt]# git clone https://github.com/Kubuxu/go-ipfs-swarm-key-gen.git
Cloning into 'go-ipfs-swarm-key-gen'...
remote: Enumerating objects: 8, done.
remote: Total 8 (delta 0), reused 0 (delta 0), pack-reused 8
Receiving objects: 100% (8/8), done.
Resolving deltas: 100% (1/1), done.

#查看下载的文件
[root@iZwz9hv1phm24s3jicy8x1Z mnt]# ls
go-ipfs-swarm-key-gen  ipfs_nodes

然后使用以下命令创建密钥

[root@iZwz9hv1phm24s3jicy8x1Z mnt]# go build -o ipfs-swarm-key-gen go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/main.go
warning: GOPATH set to GOROOT (/home/dongmu_env/go) has no effect

将密钥复制到不同的节点下面,这样才可以实现多个节点集群部署

#copy swarm.key到各个节点根目录
cp /mnt/ipfs_nodes/key/swarm.key /mnt/ipfs_nodes/ipfs_1
cp /mnt/ipfs_nodes/key/swarm.key /mnt/ipfs_nodes/ipfs_2
cp /mnt/ipfs_nodes/key/swarm.key /mnt/ipfs_nodes/ipfs_3

由于是单机部署多个节点,所以要保证端口不能冲突,只能修改每个节点,使用不同的端口。

[root@iZwz9hv1phm24s3jicy8x1Z ipfs_nodes]# cd ipfs_1
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_1]# ll
total 28
drwxr-xr-x 27 root root 4096 Jul 21 20:32 blocks
#我们要修改的就是下面这个配置文件
-rw-------  1 root root 3174 Jul 21 17:34 config
drwxr-xr-x  2 root root 4096 Jul 21 17:38 datastore
-rw-------  1 root root  190 Jul 21 16:41 datastore_spec
drwx------  2 root root 4096 Jul 21 16:41 keystore
#下面这个就是我们的密钥
-rw-r--r--  1 root root   95 Jul 21 17:31 swarm.key
-rw-r--r--  1 root root    3 Jul 21 16:41 version

我这里三台节点分别配置下面的端口

[root@iZwz9hv1phm24s3jicy8x1Z ipfs_1]# cat config 
{
  "API": {
    "HTTPHeaders": {}
  },
  "Addresses": {
    "API": "/ip4/127.0.0.1/tcp/15001",
    "Announce": [],
    "Gateway": "/ip4/127.0.0.1/tcp/18081",
    "NoAnnounce": [],
    "Swarm": [
      "/ip4/0.0.0.0/tcp/14001",
      "/ip6/::/tcp/14001",
      "/ip4/0.0.0.0/udp/14001/quic",
      "/ip6/::/udp/14001/quic"
    ]
  },


*********************************************************************
{
  "API": {
    "HTTPHeaders": {}
  },
  "Addresses": {
    "API": "/ip4/127.0.0.1/tcp/15002",
    "Announce": [],
    "Gateway": "/ip4/127.0.0.1/tcp/18082",
    "NoAnnounce": [],
    "Swarm": [
      "/ip4/0.0.0.0/tcp/14002",
      "/ip6/::/tcp/14002",
      "/ip4/0.0.0.0/udp/14002/quic",
      "/ip6/::/udp/14002/quic"
    ]
  },
 **************************************************************************
 {
  "API": {
    "HTTPHeaders": {}
  },
  "Addresses": {
    "API": "/ip4/127.0.0.1/tcp/15003",
    "Announce": [],
    "Gateway": "/ip4/127.0.0.1/tcp/18083",
    "NoAnnounce": [],
    "Swarm": [
      "/ip4/0.0.0.0/tcp/14003",
      "/ip6/::/tcp/14003",
      "/ip4/0.0.0.0/udp/14003/quic",
      "/ip6/::/udp/14003/quic"
    ]
  },

启动节点进行测试

启动第一个节点

export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_1/ ipfs daemon &
 
# export LIBP2P_FORCE_PNET=1表示您将节点强制为私有
# & 是表示后台运行,第一次接触IPFS,建议不带 &运行,这样可以查看节点信息

启动第二个节点

不过这里再启动第二个节点的时候要注意,我们第一个节点启动之后,会有一个id,我们为了把三个节点建立起联系2,就要添加引导程序节点

#使用命令查看第一个节点的peer id
[root@iZwz9hv1phm24s3jicy8x1Z ~]# IPFS_PATH=/mnt/ipfs_nodes/ipfs_1/ ipfs id
{
	"ID": "12D3KooWKuyPW2zR1ASw3RnMM1uwMFr6bJRSpQUade5Xs4Ptn2zt",
	"PublicKey": "CAESIJYEmLzH4JRzccRnMaUJiQfmrdZCdbnSoetjwXeuszL5",
	"Addresses": null,
	"AgentVersion": "go-ipfs/0.9.1/",
	"ProtocolVersion": "ipfs/0.1.0",
	"Protocols": null
}

然后把另外两个节点的引导程序节点设置为这个id

IPFS_PATH=/mnt/ipfs_nodes/ipfs_2 ipfs bootstrap add /ip4/127.0.0.1/tcp/14001/ipfs/12D3KooWKuyPW2zR1ASw3RnMM1uwMFr6bJRSpQUade5Xs4Ptn2zt
 
IPFS_PATH=/mnt/ipfs_nodes/ipfs_3 ipfs bootstrap add /ip4/127.0.0.1/tcp/14001/ipfs/12D3KooWKuyPW2zR1ASw3RnMM1uwMFr6bJRSpQUade5Xs4Ptn2zt

下面进行利用不同的节点进行文件的上传以及文件的获取


#创建一个txt文件,内容为你好!
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_nodes]# touch t.txt
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_nodes]# vim t.txt 
#利用第一个节点把文件上传到ipfs服务器上面
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_nodes]# export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_1/ ipfs add t.txt 
added QmYHzyeG4kjqYrFu7Yvrd78kY2svgB9FFDHoyv4jmjWGZu t.txt
 10 B / 10 B [===============================================================================================================================================================================
# 利用第二个节点查看获取文件
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_nodes]# export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_2/ ipfs cat QmYHzyeG4kjqYrFu7Yvrd78kY2svgB9FFDHoyv4jmjWGZu 
你好!
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_3]# export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_2/ ipfs cat QmYHzyeG4kjqYrFu7Yvrd78kY2svgB9FFDHoyv4jmjWGZu
你好!
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_3]# export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_1/ ipfs cat QmYHzyeG4kjqYrFu7Yvrd78kY2svgB9FFDHoyv4jmjWGZu
你好!
[root@iZwz9hv1phm24s3jicy8x1Z ipfs_3]# export LIBP2P_FORCE_PENT=1|IPFS_PATH=/mnt/ipfs_nodes/ipfs_3/ ipfs cat QmYHzyeG4kjqYrFu7Yvrd78kY2svgB9FFDHoyv4jmjWGZu
你好!

最后可以发现我们使用三个服务均可以看到文件的内容,没有文件的hash值是无法获取文件的内容的。

最后查看一下三个节点的运行

[root@iZwz9hv1phm24s3jicy8x1Z dongmu_env]# ps -ef |grep ipfs
root     4090225 4088860  0 21:59 pts/2    00:00:00 ipfs daemon
root     4090390 4088860  0 22:00 pts/2    00:00:00 ipfs daemon
root     4090556 4081539  0 22:02 pts/0    00:00:00 ipfs daemon
root     4090920 4081573  0 22:05 pts/1    00:00:00 grep --color=auto ipfs

ps命令介绍

ps 命令的作用是显示进程信息的;

| 符号,是个管道符号,表示ps 和 grep 命令同时执行;

grep 命令是查找(Global Regular Expression
Print),能使用正则表达式搜索文本,然后把匹配的行显示出来;

ps命令有一些参数:
-e : 显示所有进程
-f : 全格式
-h : 不显示标题
-l : 长格式
-w : 宽输出
a :显示终端上的所有进程,包括其他用户的进程。
r :只显示正在运行的进程。
u :以用户为主的格式来显示程序状况。
x :显示所有程序,不以终端机来区分.

字段含义如下:
UID PID PPID C STIME TTY TIME CMD

列序号 列含义 列含义说明
1 UID 用户标识ID
2 PID 进程ID
3. PPID 父进程ID
4 C CPU占用率
5 STIME 进程开始时间
6 TTY 启动此进程的TTY(终端设备)
7 TIME 此进程运行的总时间
8 CMD 完整的命令名(带启动参数)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值