飞行的蜗牛

一个正在觉醒的无名氏修行者,略懂编程,略懂音乐。

Ceph-09 使用 PHP 操作 Ceph S3 接口

::: motto 岸见一郎 – 被讨厌的勇气
这个世界世界给了你什么,那是你决定不了的。但是怎么看待,怎么利用你手里的东西,确是你可以决定的。
:::

本文我们接着上文继续来探讨一下如何使用使用 PHP 来操作 Ceph S3 接口。

从零开始搭建 Filecoin 主网挖矿集群[持续更新]

::: motto 和菜头 – 成年人修炼手册
角色之所以为角色,是因为舞台恰好需要。
:::

如果你是一个 Filecoin 小白,但是略懂 Linux 运维,那么读完这篇教程,你应该可以自己动手搭建一个 Filecoin 挖矿集群。

环境说明

  • 操作系统:Ubuntu-18.04LTS
  • Golang 版本:1.15.5
  • Rust 版本:1.46
  • Lotus 版本:1.2.1

搭建编译环境

  1. 安装 lotus 编译所需要的依赖库和工具

    1
    sudo apt install mesa-opencl-icd ocl-icd-opencl-dev gcc git bzr jq pkg-config curl clang build-essential hwloc libhwloc-dev wget -y 
  2. 安装 golang 编译环境:

    1
    wget -c https://golang.org/dl/go1.16.4.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local

    添加环境变量

    1
    echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc && source ~/.bashrc
  3. 安装 Rust 编译环境

    ::: tip 提示
    本步骤需要到 Rust 官方镜像去下载一些软件包,如果你有个好的代理的话,能节省不少时间。
    :::

    1
    curl https://sh.rustup.rs -sSf | sh

    上面脚本会让你选择安装方式,直接选择 1, 回车。安装完成之后运行下面脚本使 rust 环境变量生效:

    1
    source $HOME/.cargo/env

编译 lotus 源码

  1. 下载源代码,并切换到指定的分支。

    1
    2
    3
    4
    # clone 源码到本地
    git clone https://github.com/filecoin-project/lotus.git
    # 切换到你想要分支或者 tag 版本,如:
    cd lotus && git checkout v1.13.0
  2. AMD 机器编译命令

    1
    RUSTFLAGS="-C target-cpu=native -g" FFI_BUILD_FROM_SOURCE=1 make clean all
  3. 对于一些不支持 ADX 指令的旧 Intel 和 AMD 处理器可能会因非法指令错误(illegal instruction errors)。可以通过添加 CGO_CFLAGS 环境变量来解决此问题:

    1
    FFI_BUILD_FROM_SOURCE=1 CGO_CFLAGS_ALLOW="-D__BLST_PORTABLE__" CGO_CFLAGS="-D__BLST_PORTABLE__" make clean all
  4. 如果想要启用 GPU CUDA 计算支持(能显著提升 C2 计算效率),通过添加 FFI_USE_GPU 环境变量来启用:

    1
    FFI_BUILD_FROM_SOURCE=1 FFI_USE_GPU=1 make clean all

启动 lotus daemon

由于 Lotus 需要通过设置环境变量的形式来修改节点的默认配置,而使用全局的环境变量又容易污染系统环境,有时还会导致一些莫名奇妙的错误。所以为了避免每次使用 lotus 命令之前都要
输入一大堆环境变量,因此我们建议重写 lotus 命令。

首先,新建脚本

1
vim /usr/local/bin/lotus

脚本内容如下

1
2
3
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/ 
export LOTUS_PATH=/data/lotus
/opt/lotus/lotus $*
  • /data/lotus lotus 区块存储地址
  • /opt/lotus/lotus lotus 可执行文件的路径

启动 lotus daemon

1
lotus daemon > daemon.log 2>&1 &

::: warning 注意
上面的命令是启动全节点,从 0 开始同步区块,这样会比较慢,以目前的高度 286186 来说,网络好的话,估计也得同步 5 天到 1 个星期。
但是通常如果你不是做钱包或者交易所的话,你并不需要全节点,你可以直接从官方提供的快照来同步,或者从其他节点导出快照,再导入到当前 daemon.
:::

可以使用以下方式创建完整的 CAR 快照:

1
2
3
4
# usage 
lotus chain export <filename>
# e.g
lotus chain export lotus-chain-2020-12-02.car

通过上面的命令你可以导出一个完整的 lotus chain 快照。不过这个快照比较大,可能超过 100 GB。所以更常用的方式是使用下面的命令导出一个阉割版的快照,
就是只导出最新的区块,跳过以前的旧消息。

1
2
3
4
# usage
lotus chain export --skip-old-msgs --recent-stateroots=<stateroots-num> <filename>
# e.g
lotus chain export --skip-old-msgs --recent-stateroots=2000 lotus-chain-2020-12-02.car

--recent-stateroots 参数指定要导出的状态根数,最小快照 –recent-stateroots 为 900,小于 900 的快照可能导入失败--skip-old-msgs 参数表示只导出那些 stateroots 直接引用的区块。

然后在首次启动 daemon 的时候执行导入快照。(只是第一次需要导入,后面再启动 daemon 就不需要了)。

Note: 如果导入失败的话,请试着加大 --recent-stateroots 的值,不过通常情况下 2000 足够了。

1
2
3
4
# Without verification
lotus daemon --import-snapshot <filename>
# With verification
lotus daemon --import-chain <filename>

如果你希望在快照导入之后就立即退出守护进程,(例如在docker环境中很有用),请在命令中添加 --halt-after-import 标志:

1
lotus daemon --import-snapshot --halt-after-import <filename>

初始化矿工

进行这个操作之前,你最好先等 lotus daemon 完成区块同步,使用下面的命令检查区块是否同步完成

1
lotus sync wait

该命令会显示当前同步多少区块了,还有多少没有同步完成,以及你现在的同步速度。如果没有同步完成,会一直处于阻塞状态,等待同步完成了该命令才会退出。

同样的,我们也需要重写 lotus-miner 脚本

1
vim /usr/local/bin/lotus-miner

脚本内容如下

1
2
3
4
5
6
7
8
9
export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters  # proof 参数路径
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
export LOTUS_PATH=/data/lotus # daemon 数据根路径
export LOTUS_MINER_PATH=/data/lotus-miner # miner 数据存储跟路径
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 # 启用 GPU加速 COLUMN hash 计算
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1 # 启用 GPU 构造 Merkle 树
export RUST_LOG=Info
export FIL_PROOFS_MAXIMIZE_CACHING=1
/opt/lotus/lotus-miner $*
  1. 创建钱包:

    1
    lotus wallet new bls

    输出钱包地址: f3xxxx

    ::: warning 警告
    创建好钱包先不要急着充值,而是要先备份钱包私钥!!!
    :::

    1
    lotus wallet export f3xxxx
  2. 充值,如果只是创建矿工的话,充值 1 个FIL 足够了。

  3. 创建矿工。

    1
    2
    3
    4
    5
    # usage
    lotus-miner init --owner=<address> --sector-size=<val>
    # e.g
    lotus-miner init --owner=f0xxxx --sector-size=32GiB
    lotus-miner init --owner=f0xxxx --sector-size=64GiB

修改 Miner 配置

miner 的配置文档在 $LOTUS_MINER_PATH/config.toml,如果你是跑单节点的话,那么无需修改配置文档,但是如果你是需要跑集群的话,
那么你需要修改下面几个地方:

  1. 修改 API 连接配置,主要用于 worker 连接 miner.

    1
    2
    3
    4
    # e.g
    [API]
    ListenAddress = "/ip4/xxx.xxx.xxx.xxx/tcp/2345/http"
    RemoteListenAddress = "xxx.xxx.xxx.xxx:2345"

    xxx.xxx.xxx.xxx 替换成你 miner 的内网 IP 地址。

  2. 修改 [Storage] 选项,将密封相关的任务全部分配给 worker 去做。

    1
    2
    3
    4
    5
    6
    7
    [Storage]
    # ParallelFetchLimit = 10
    AllowAddPiece = false
    AllowPreCommit1 = false
    AllowPreCommit2 = false
    AllowCommit = false
    # AllowUnseal = true

使用远程 lotus daemon

如果你的 miner 和 lotus daemon 是跑在不同的机器上,那么你需要做一些额外的配置:

  1. 配置你的 lotus daemon config.toml 文件:

    1
    2
    3
    4
    # e.g
    [API]
    ListenAddress = "/ip4/xxx.xxx.xxx.xxx/tcp/1234/http"
    RemoteListenAddress = "xxx.xxx.xxx.xxx:1234"

    xxx.xxx.xxx.xxx 替换成你 lotus daemon 的内网 IP 地址。

  2. 拷贝 lotus dameon 的 api 和 token 文件到 miner 机器的 $LOTUS_PATH 目录下。

启动 lotus-miner

1
lotus-miner run > miner.log 2>&1 &

启动 lotus-worker

同样的,我们也需要重写 lotus-worker 脚本

1
vim /usr/local/bin/lotus-worker

脚本内容如下

1
2
3
4
5
6
7
8
9
export FIL_PROOFS_PARAMETER_CACHE=/gamma/filecoin-proof-parameters  # proof 参数路径
export IPFS_GATEWAY=https://proof-parameters.s3.cn-south-1.jdcloud-oss.com/ipfs/
export LOTUS_WORKER_PATH=/data/lotus-worker # worker 数据存储目录
export LOTUS_MINER_PATH=/data/lotus-miner # 保存 miner api 和 token 的目录
export FIL_PROOFS_USE_GPU_COLUMN_BUILDER=1 # 启用 GPU加速 COLUMN hash 计算
export FIL_PROOFS_USE_GPU_TREE_BUILDER=1 # 启用 GPU 构造 Merkle 树
export RUST_LOG=Info
export FIL_PROOFS_MAXIMIZE_CACHING=1
/opt/lotus/lotus-worker $*
  1. 拷贝 miner 的 api 和 token 文件到 $LOTUS_MINER_PATH 目录下。

  2. 启动 worker 程序,可以根据传入不同的参数来定义 worker 的类型。

    (1) 启动一个只接 P1 任务的 worker

    1
    lotus-worker run --listen=11.11.11.11:2345 --precommit1=true --precommit2=false -commit=false

    注意: 11.11.11.11 需要替换成你 worker 的内网 IP 地址。

    (2) 启动一个可以同时接 P1 和 P2 任务的 worker

    1
    lotus-worker run --listen=11.11.11.11:2345 --precommit1=true --precommit2=true -commit=false

    (2) 启动一个只接 C2 任务的 worker

    1
    lotus-worker run --listen=11.11.11.11:2345 --precommit1=false --precommit2=false -commit=true

worker 启动之后会自动通过我们在 lotus-worker 脚本里配置的 API 信息,连接到 miner 领取任务,你可以通过下面的命令查看已经连接到 miner 的 worker 列表。

1
lotus-miner sealing workers

Worker 也启动了,那么接下来我们就可以开始质押扇区,启动挖矿了。

1
lotus-miner sectors pledge # 质押一个随机数据的扇区,开始密封

查询当前集群的任务分配情况:

1
lotus-miner sealing jobs

集群常规运维操作

集群操作请参考 Filecoin 运维(2) - 环境变量和常用运维操作,此处不再赘述。

2021 博客更新计划

::: motto 大鱼海棠
拥有,是人际关系中最大的幻觉,没有人能够拥有另一个人,我们只是在各自的旅程相遇,然后彼此结伴同行。这种相遇有长有短,最终我们还是会分开,各走各的路。

这短短的一生,我们最终都会失去。所以,你不妨大胆一些,爱一个人,攀一座山,追一个梦。
:::

随着 filecoin 的主网上线,公司陷入了忙碌模式,每天忙着搭建集群,改代码,测试… 一入 Filecoin 深似海,从此周末是路人,因为周末也得盯着集群是否正常。
直到上周陆陆续续有网友通过邮件,微信提醒我:博主,你的博客好久没有更新了。 我才发现确实已经整整三个月没有更新博客了,让我感觉挺惭愧的。

Lotus 源码研究 01 - 如何快速上手

::: motto 刘慈欣 – 三体
人类真正的道德自觉是不可能的,就像他们不可能拔着自己的头发离开大地。
:::

本文是我们 lotus 源码研究系列 的第一篇,今天我们先调整好心态,顺便给大家分享一个我个人是如何研究一个新的项目,
或者说是如何学习一门新的技能的。

拿到一个陌生的项目,或者说进入一个陌生的领域,当然,能到行家给自己讲讲是最省时省力的办法了,
但是不见得每个人都有这个条件,普通人只能自己自学。
而作为职场人员遇到的更常见的情况是,你的老板不会给你太多时间学习,这也是一般公司为什么不喜欢招新手的原因。

今天我们就以如何快速上手 Filecion 源码开发为例,谈谈我们是如何快速投入 Lotus 源码开发的。

矿工应该了解的几个 Filecoin 重要的 FIP(持续更新)

::: motto 马丁·海德格尔
世界先于我们而存在,而在我们死了之后,世界依然存在。

也许,我们存在的唯一意义,就是给世界一次变好的机会。
:::

这篇文章我们来聊一聊,作为 Filecoin 矿工,你应该知道的几个重要的 FIP。

可能对于新手矿工来说,你并不知道什么是 FIP,那么我希望这篇文章能让你彻底搞懂它,让你能对 Filecoin 这个项目有一些高级的认知,并从中了解 Filecoin 网络的发展历程,体会一点社区治理的智慧。

谈一谈不同固态硬盘颗粒(SLC,MLC,TLC,QLC)的区别

::: motto 和菜头
我们不可能在了解所有的情况,在最充分的准备下做选择,那样就不是选择,而是作弊。

我们选择的可能不是最好的那个选项,也不是让自己更舒服的选项,只是选择一个令自己心安的选项。
:::

最近有不少 Filecoin 矿工朋友问我:为什么我的机器配置跟别人的一模一样,跑的挖矿程序也是一样的,但是产出却低很多?1TB 内存别人机器并行 14 个 PC1 任务都只要 3 个半小时,
而我只能并行 10 PC1 个任务,而且都要 4 个小时跑完?

这个时候我一般会反问一句:你 Woker 机器的 SSD 缓存盘是什么颗粒的?通常他们听到这个都会一脸懵逼,什么颗粒啊?
本文我们就来介绍不同颗粒的 SSD 硬盘之间到底有什么区别。

Filecoin 技术选型系列1 - 硬件选购

::: motto 斯多葛哲学家·塞涅卡
我们的房子,财富,社会地位,我们的眼睛,身体,我们的亲人,子女,朋友,我们所珍惜的一切,都是不是我们的,包括我们自己。它们只是命运女神借我们暂用一下。
我们要像虔诚的,圣神的保管者一样好好保管他们。如果有一天命运女神想要收回它们,我们绝不该抗命不从,而应该满心欢喜,
不带怨气地说:感谢您让我拥有并保管了这一切,我已悉心保管,现在如数奉还。
:::

目前,对于 Filecoin 矿工来说,除了抵押币,硬件算是最大的一笔现金投入了。Filecoin 矿机的对于硬件的配置很高。现在一台算力机少则10几万,多则20几万。
硬件没选对的话,会严重影响封装的效率,对于矿工来说是损失也是很大的。本文分享一些自己在 Filecoin 硬件选购上的一些心得。对于那些购买云算力的同学,请直接略过。

Filecoin 技术选型系列2 - 存储选型

::: motto 富兰克林
总统和穷光蛋的口袋都一文不名,女王和拾荒妇都不需要名片。
:::

扇区落盘是 Filecoin 密封的最后一个阶段。也是至关重要的阶段,容易一着不慎,满盘皆输。造成辛辛苦苦几十年,一下回到解放前的尴尬结局。本文我们来聊聊 Filecoin 挖矿存储的技术选型。

很多同学问我:请问我组 Raid 挖 Filecoin 可以吗?Filecoin 存储是组 Raid 好还是 LVM,或者是 ZFS?

对于这些问题我的回答都是:因人而异,这得结合你当前所有拥有的技术和资源以及你集群的大小来决定。