当前位置:   article > 正文

m2 Mac 中 Ubuntu server 安装和使用 Hyperledger Fabric_mac m2 安装linux docker ubuntu

mac m2 安装linux docker ubuntu

1. 前言

  • m2 的 Mac,已经安装了 Ubuntu server 的虚拟机,详细安装过程参见 link ,网上搜了很多关于 Hyperledger Fabric 的安装教程,发现对于 arm 架构的教程很少,大多数都是 amd 架构的,因此记录一下这次的安装过程
  • 总体来讲就是安装 docker + docker compose、golang、hyperledger fabric 这几个东西,但是都要注意选择 arm 架构的。

2. 前置操作

2.1 docker / docker-compose

1. 查看操作系统版本
  puyijun@vmubuntu2204:~$ uname -a
  Linux vmubuntu2204 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:29:11 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux
  • 1
  • 2
  • 5.15.0-91-generic:这是正在运行的Linux内核版本。5.15.0-91-generic 是内核的具体版本号,其中 generic 表示这是一个通用内核版本,适用于各种硬件。
  • #101-Ubuntu SMP:这部分提供了更多内核编译信息。
    • #101 表示这是Ubuntu源代码树的第101次编译。
    • SMP (Symmetric Multiprocessing) 表明内核支持多处理器,这是现代操作系统的标准配置。
    • aarch64:表示处理器架构是 aarch64,也就是64位的ARM架构。这种架构常见于ARM处理器,这种处理器通常用于移动设备、一些服务器和最近的一些个人电脑。
2. 下载 docker 和 docker-compose 的离线包

1) docker:https://download.docker.com/linux/static/stable/

image-20240126120944950
 这里有多个架构的镜像:

 1. armel -- 全称:ARM EABI (Embedded Application Binary Interface);架构:通常指32位的旧ARM处理器,如ARMv5;用途:`armel`是为较老的、性能较低的ARM设备设计的,支持没有硬件浮点运算的处理器;兼容性:与较老的ARM设备兼容。
 2. armhf -- 全称:ARM Hard Float;架构:指32位的较新ARM处理器,如ARMv7;用途:`armhf`代表“硬浮点”,意味着这些处理器支持硬件浮点运算,这对于许多计算任务来说更高效;兼容性:与支持硬件浮点运算的较新ARM设备兼容。
 3. aarch64 -- 全称:ARM 64-bit Architecture;架构:指64位的ARM处理器,如ARMv8;用途:`aarch64`为64位处理器设计,提供了更高的性能和更大的内存地址空间;兼容性:与64位ARM处理器兼容,常见于现代移动设备和一些服务器。
 
 根据我的虚拟机架构,选择 aarch64 的架构的镜像下载
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2)docker-compose:https://github.com/docker/compose/releases

 ![image-20240126121920303](https://img-blog.csdnimg.cn/img_convert/bcb6bebf90306986b02a9b1d321c8419.png)
 我选择了 2.17.2 版本的 aarch64 架构的
  • 1
  • 2

3)准备 docker.service 配置文件

  docker.service
    
  [Unit]
  Description=Docker Application Container Engine
  Documentation=https://docs.docker.com
  After=network-online.target firewalld.service
  Wants=network-online.target
  
  [Service]
  Type=notify
  # the default is not to use systemd for cgroups because the delegate issues still
  # exists and systemd currently does not support the cgroup feature set required
  # for containers run by docker
  ExecStart=/usr/bin/dockerd
  ExecReload=/bin/kill -s HUP $MAINPID
  # Having non-zero Limit*s causes performance problems due to accounting overhead
  # in the kernel. We recommend using cgroups to do container-local accounting.
  LimitNOFILE=infinity
  LimitNPROC=infinity
  LimitCORE=infinity
  # Uncomment TasksMax if your systemd version supports it.
  # Only systemd 226 and above support this version.
  #TasksMax=infinity
  TimeoutStartSec=0
  # set delegate yes so that systemd does not reset the cgroups of docker containers
  Delegate=yes
  # kill only the docker process, not all processes in the cgroup
  KillMode=process
  # restart the docker process if it exits prematurely
  Restart=on-failure
  StartLimitBurst=3
  StartLimitInterval=60s
  
  [Install]
  WantedBy=multi-user.target
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
3. 将上一步准备的三个文件(docker 需要解压后)移动到对应的目录下,然后启动服务
  1. 解压 docker ,并移动到 /usr/bin 目录下

    tar -xvf docker-20.10.7.tar
    sudo cp -p docker/* /usr/bin
    
    • 1
    • 2
  2. 将 docker-compose 复制到 /usr/local/bin 目录下,重命名为 docker-compose,并设置权限

    sudo cp docker-compose-linux-aarch64 /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    
    • 1
    • 2
  3. 将 docker.service 移到 /etc/systemd/system/ 目录,并设置权限

    sudo cp docker.service /etc/systemd/system/
    sudo chmod +x /etc/systemd/system/docker.service
    
    • 1
    • 2
  4. 加载配置文件,启动 docker,设置 docker 开机启动

    systemctl daemon-reload
    systemctl start docker
    systemctl enable docker.service
    
    • 1
    • 2
    • 3
4. 查看 docker / docker-compose 的版本

2.2 golang 安装

1. 下载 go 安装包 https://studygolang.com/dl
  • image-20240126133522522

  • 我下载的是1.20.13 版本 arm64 架构的

2. 解压将 go 文件包移动到 /usr/lib/ 中 golang 目录中
  • tar -xf go1.20.13.linux-arm64.tar
    sudo mkdir /usr/lib/golang
    sudo cp go/* /usr/lib/golang/ -rf
    
    • 1
    • 2
    • 3
3. 更新环境变量
  • vim /etc/profile
    
    # 文件尾部添加
    export GOROOT=/usr/lib/golang
    export PATH=$PATH:$GOROOT/bin
    
    # 启用修改
    source /etc/profile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
4. 查看 go 版本
image-20240126134343924

3. Hyperledger Fabric 安装与使用 (参见官方文档)

3.1 安装并启动 fabric 网络

1. 创建工作区目录
  • mkdir test-fabric
    cd test-fabric
    
    • 1
    • 2
2. 获取 install script
  • curl -sSLO https://raw.githubusercontent.com/hyperledger/fabric/main/scripts/install-fabric.sh && chmod +x install-fabric.sh
    
    • 1

    image-20240126153638087

3. 执行 install-fabric.sh 脚本,参数指定使用 docker 下载镜像、克隆 fabric-samples 仓库、下载 fabric binaries
  • -f, --fabric-version <arg>:指定要安装的 Hyperledger Fabric 的版本。如果没有指定,默认为 '2.5.4'

  • -c, --ca-version <arg>:指定要安装的 Hyperledger Fabric CA(证书颁发机构)的版本。如果没有指定,默认为 '1.5.7'

  • <comp-1> [<comp-2>] ... [<comp-n>] 指定要安装的组件。可以是下列一个或多个:

    • docker:安装 Docker 镜像。

    • binary:安装 Fabric 二进制文件。

    • samples:安装 Fabric 示例。

    • podman:安装使用 Podman(类似 Docker 的容器工具)的相关设置。

      也可以只使用每个组件名称的首字母(例如,d 代表 docker)。

      如果没有指定任何组件,则默认安装 dockerbinarysamples
      具体命令可以是

  • sudo ./install-fabric.sh d s b
    
    • 1
4. 执行了 install-fabric.sh 脚本之后,脚本帮我们自动拉取了 fabric-samples 仓库,回到我们创建的工作区目录,可以查看到
5. 进入 fabric-samples 目录,然后在进入他给出的测试用例 test-network,使用sudo权限执行脚本进行启动网络
  • sudo ./network.sh up
    
    • 1

    image-20240126172534052

    一个拥有两个 peer 节点和一个 orderer 节点的网络就起来了

3.2 创建通道

通道是特定网络成员之间的私有通信层,只有被邀请加入通道的组织才能使用通道,对网络的其他成员来说这些通道是不可见的。每个通道都有一个单独的区块链账本,被邀请的组织会把它们的节点加入到通道中,以存储通道账本并验证通道上的交易。

直接使用 network.sh 脚本中的函数创建一个通道:

# 创建一个名为 mychannel 的通道
./network.sh createChannel
  • 1
  • 2

image-20240130221413557

3.3 安装链码

链码也就是智能合约,它用来与通道中的账本进行交互。智能合约包含了控制区块链账本上资产的业务逻辑,网络成员运行的应用程序可以调用智能合约在账本上创建资产以及更改和转移资产,应用程序还可以查询智能合约以读取账本上的数据。

使用智能合约创建的交易通常需要多个组织的签名才能提交到通道账本,多重签名是 Fabric 信任模型的核心部分。对交易要求多方背书可以防止通道上的某个组织篡改其节点上的账本或使用未经同意的业务逻辑。为了签署交易,每个组织需要在其节点上调用并执行智能合约,然后对交易的输出进行签名,如果输出一致且已由足够多的组织签名,交易就可以提交到账本。指定需要执行智能合约的通道上的一组组织的政策称为背书政策,这是作为链码定义的一部分设置的。

在 Fabric 中,智能合约以称为链码的包形式在网络上部署。链码安装在组织的节点上(install),然后部署到通道上,在那里它可以用来背书交易和与区块链账本进行交互。在链码部署到通道之前,通道的成员需要对链码定义达成一致(approve)。当所需数量的组织同意后,链码定义可以提交到通道(commit),链码准备就绪并可用。

具体的操作为在 /scripts/deployCC.sh 以及其他的文件如 utils.sh 中,使用方法比较简单:

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
  • 1

这个命令直接在 peer0.org1.example.com 和 peer0.org2.example.com 上安装 asset-transfer (basic) 链码,并将链码部署在 mychannel 通道上,-ccl 指定 go 语言,具体的链码在 fabric-samples 目录中的 asset-transfer-basic 中

可能遇到的问题(第一次安装时遇到了,后来又干了一些事情之后再回来就没问题,即使直接用 sudo 也不会出现 go 的路径问题):

参考博客 link

  • 使用 sudo 命令 gopath 有问题

    Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
    
    • 1

    但如果不适用 sudo 出现权限的问题

    ./scripts/packageCC.sh: line 90: log.txt: Permission denied
    
    • 1

    解决方法:修改 fabric-samples 目录的权限:

    sudo chmod 777 -R /home/puyijun/test-fabric/fabric-samples
    
    • 1

    不用 sudo 执行命令即可

    image-20240130224051036

3.4 调用智能合约与 fabric 网络交互

1. 设置环境变量
  • # 添加上级目录中的二进制 bin 工具集
    export PATH=${PWD}/../bin:$PATH
    # 设置 FABRIC_CFG_PATH
    export FABRIC_CFG_PATH=$PWD/../config/
    # Environment variables for Org1
    export CORE_PEER_TLS_ENABLED=true
    export CORE_PEER_LOCALMSPID="Org1MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    export CORE_PEER_ADDRESS=localhost:7051
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
2. 初始化账本(使用 invoke)
  • peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
    
    • 1

    image-20240130224749331

3. 在 CLI 中调用链码与账本进行交互
  • # 调用 GetAllAssets 函数获取账本信息
    peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
    # 调用 TransferAsset 函数进行一个转账操作
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
    
    • 1
    • 2
    • 3
    • 4

    image-20240130225103872

    image-20240130225132477

4. 其他问题

处理 docker 镜像的时候出现空间不足的问题

No space left on device
  • 1

解决方法:

sudo docker system prune -a
  • 1

最后发现是我给虚拟机之分了20G的磁盘大小,感觉有点太小了,所以现在进行扩容,扩容过程详见另一篇博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/275353
推荐阅读
相关标签
  

闽ICP备14008679号