如何在树莓派上编译和运行Substratum Node

in #substratum6 years ago (edited)

guide_sub_pi_ch.jpg

Substratum,作为新一代去中心化网络的基础,经过仅仅八个月的开发后已经取得惊人的进展。团队正在开发的有网络节点 (SubstratumNode)加密支付 (CryptoPay) 以及另一个未公布的项目。

用户现在已经可以通过直接从官网下载公开测试版或者自行编译源代码的方式在自己的电脑上运行Substratum Node。在撰写本教程时,也就是2018年6月10日,Node的0.3.2版本已经面向三大操作系统发行,包括微软的Windows自由软件Linux苹果的MacOS。开放的源代码的版本(git commit 379a696)比0.3.2更新,而且通过编译运行的方式将可能支持更多的系统。

树莓派是一个小巧而廉价的计算机主板,被用在很多有趣的项目,比如廉价计算集群,网页服务器和数字币挖矿项目。

人们从2017年底Substratum项目刚开始众筹的时候就异口同声地问一个问题 - Substratum Node到底能不能在树莓派上运行? 答案是,!Substratum团队其实已经对树莓派产生了兴趣,正在做相关开发,尤其是用在去中心化网络的测试方面。如果你是像我一样已经迫不及待地要试一下,那你现在就可以参照我写的首篇非官方教程来在树莓派上编译并运行Substratum Node

3_boot.jpg

4_xfce.jpg

5_node.jpg

1. 所需硬件

1_pi.jpg

  • 树莓派3B
    你的树莓派必须要包含支持64位运算的ARMv8处理器,即3B及更新的型号。但要注意,本教程所用的Arch Linux系统暂时还不支持最新的3B+型号。
  • 电源线
    你需要一条和树莓派3B适配的电源,是5伏2安培的。
  • Micro SD卡
    最小容量8G
  • 一台运行Linux的电脑
    这将被用来烧录Linux系统到SD卡,以及ssh远程控制树莓派。你通过Windows,MacO或者虚拟机应该也能达到这些目的,但可能需要用到其他特殊软件及步骤,而这不是本教程将涉及的。
  • 路由器
    你可能需要一个能连接到因特网的路由器。有线无线均可。需要注意的是,如果它只有无线功能,那你应该还需要额外的HDMI线,显示器和键盘以便作WIFI连接设置。
  • (可选)其它花哨附件
    根据你的兴趣可以添置一些树莓派的附件,比如外壳,散热风扇,无线小键盘,小屏幕,LED插件。我觉得你至少要给树莓派加个散热板吧。

2_fancy.jpg

2. 烧录Linux系统到SD卡

据我所知,Substratum Node暂时只支持64位系统的编译及运行。Arch Linux (ARM AArch64版本)可能是支持在树莓派上运行Substratum Node的最佳系统。它已经能几乎完美支持64位的树莓派3B,而其他Linux系统(包括最流行的Raspbian)要么仅支持32位,要么对64位缺少某些功能,要么缺少新软件。Arch采用采用滚动升级模式来确保系统每一个软件包都是最新的。你无需再为传统的跳跃式版本升级而烦恼。在撰写本教程时,Arch已经采用最新的Linux内核4.17版本。

现在开始我们的安装旅程,先把Arch Linux (ARM AArch64版)烧录到你的micro SD卡里。

首先,把SD卡插入你的电脑,可以是自带的或者USB读卡器。

其次,依照archlinuxarm.org上的AArch64步骤操作,注意不是ARMv7的步骤。

这些步骤比较有技术性,所以我在这里录制了详细的动画以供参考。

a. 找到SD卡的标签名字,并用fdisk给SD卡分两个区

1_partition_b.gif

lsblk

运行这个命令可以列出电脑中的所有物理盘,你就可以知道SD卡所对应的标签名。以我的为例,标签名是mmcblk0,在你电脑上的名字应该有所不同。

运行fdisk开始对SD卡作分区操作。请注意要使用你电脑上的SD卡专有名称。

sudo fdisk /dev/mmcblk0

根据archlinuxarm.org的教程,在fdisk的命令行界面里,依次作如下操作:

键入o,这将清空SD卡中的分区信息。

键入p列出当前分区。此时应该无分区。

键入n,然后p选主分区,1选第一分区,按回车键以接受默认起始扇区,然后键入+100M作为结束扇区。

键入t,然后c把第一分区的格式设置为W95 FAT32 (LBA)。

键入n,然后p选主分区,2选第二分区,按两次回车键以接受默认起始和结束扇区。

键入w以写入分区表信息并退出。

b. 格式化及挂载这两个分区

2_format_mount_b.gif
确保你用lsblk命令知道了SD卡上这两个分区的名字后再进行格式化和挂载操作。

lsblk
sudo mkfs.vfat /dev/mmcblk0p1
mkdir boot
sudo mount /dev/mmcblk0p1 boot

lsblk
sudo mkfs.ext4 /dev/mmcblk0p2
mkdir root
sudo mount /dev/mmcblk0p2 root
c. 下载Arch Linux

3_download.gif

wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-3-latest.tar.gz
d. 烧录系统

4_filesystem.gif
从现在起,你必须要以root的身份运行以下命令,而不是通过sudo获得root权限。

运行su并输入你的root帐号的密码来获得root身份。

su

然后运行以下命令来烧录文件系统到SD卡:

bsdtar -xpf ArchLinuxARM-rpi-3-latest.tar.gz -C root
sync
e. 移动文件,移除挂载,并退出

5_move_unmount_exit.gif

mv root/boot/* boot
umount boot root
exit

在以root身份处理完命令后千万记得运行exit以确保系统安全:)

3. 连上Raspberry Pi

把micro SD卡插入你的树莓派3B。

在运行你的树莓派时,有以下几种情况:

  1. 你的树莓派连接了显示器,键盘和网线。
    这种情况下,你就象在操作一台小型电脑。树莓派应该能通过网线从路由器自动获取IP地址并连上因特网。默认用户名和密码都叫alarm,是Arch Linux ARM的缩写。root帐号和密码都是root。你可以通过运行ifconfig来获知其具体IP地址,以便远程操作。

  2. 类似情形1,但是你只有WIFI无线网。
    启动,输入用户名alarm和密码alarm
    运行su,输入密码root以获得root身份。
    运行wifi-menu -o,选择你想要连上的无线网,输入无线网密码。
    作如下操作,树莓派每次启动就可以自动连上无线网:
    运行cd /etc/netctlls,可获得你的无线连接点的设置文件名,比如wlan0-WIFI
    运行netctl enable wlan0-WIFI
    到这一步,树莓派每次启动就可以自动连上无线网,而且你应该不需要显示器和键盘了,因为可以使用用ssh远程连接了。
    同样,你可以用ifconfig来获取你的确切IP地址。
    不要忘记用exit来退出root身份。

  3. 你的树莓派没有连接显示器及键盘。
    在这种情况下你只能使用网线连接树莓派和路由器。你的电脑也要连到网络,有线无线均可。
    如果你知道树莓派被分配的IP地址是192.168.1.9,那你可以在电脑上运行ssh [email protected]来连接到树莓派。
    但如何知道树莓派的确切IP地址?通常情况下,树莓派会被路由器分配一个192.168.1.X形式的地址。X是未知的。你可以通过显示器,键盘,以及ifconfig命令获得,或者你可以暴力尝试X = 2, 3, 4, 5 ...。你应该能自己搞定。

6_connect.gif

4. 基本设置

用用户名和密码alarm登陆。就像前面说的,你可以用键盘及显示器在本地登陆,或者在另一台电脑上用ssh登陆。
新安装的Arch Linux需要作几项基本设置才能用。
首先需要运行su并输入密码root来获得root身份。此时的系统还没有常用的sudo

su

其次,按照Arch Linux ARM的教程步骤,初始化pacman钥匙串并构建Arch Linux ARM软件包的签名密钥。

pacman-key --init
pacman-key --populate archlinuxarm

7_keyring.gif

第三,安装sudo

pacman -S sudo

第四,允许使用sudo

EDITOR=nano visudo

你现在正通过nano编辑器阅读文本内容。找到# %wheel ALL=(ALL) ALL这一行。删除开头的#字符,按组合键Ctrl+O保存文件,Ctrl+X退出编辑器。

现在你终于可以不使用危险的root帐号,回到普通用户alarm了。

exit

从现在起,你可以在alarm帐号里使用sudo命令了。我们更新一下系统吧。

sudo pacman -Syu

哈,这是你在这个树莓派上第一次使用sudo命令。系统给了你一个温柔的提示,“能力越大,责任越大”:)
系统更新完毕后你应该已经获得了4.17版本以上的Linux内核,这可比其他系统的新多了,爽!

8_sudo.gif

重启。

sudo reboot now

9_reboot.gif

5. 安装编译依赖包

再次以alarm登陆。不要用root
需要安装一些必要的开发软件包以便编译Substratum Node。gitrust是必须的,同时还建议安装开发库base-devel

a. 安装gitbase-devel
sudo pacman -S git base-devel

注意这里你在某一步需要按下回车键来选择base-devel下的所有软件包。

10_dev_env.gif

b. 安装rust
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.25.0

在撰写本教程时,默认的稳定版1.26.2在编译时会有不该出现的警告提示'+fp' is not a recognized feature for this target (ignoring feature)。所以还是安装旧一点的1.25.0为妙。

11_rust.gif

6. 编译Node

开搞!

下载源代码

git clone https://github.com/SubstratumNetwork/SubstratumNode.git

进入代码文件夹

cd SubstratumNode

12_git.gif

Checkout与0.3.2版本相关的创建于2018年5月30日的commit f4e63f2。我没有测试更新的commits,它们很有可能带有和树莓派相关的bug。

git checkout f4e63f2

修改编译文件

nano ci/all.sh

在和sccache相关的两行的行头添加字符#,如下:

#cargo install sccache || echo "Skipping sccache installation"  # Should do significant work only once
#export RUSTC_WRAPPER=sccache

Ctrl+O保存,Ctrl+X退出。
此步修改的原因是sccache编译会由于某些未知原因会失败。修改后不会影响Node编译结果,缺少sccache只会导致编译速度变慢。

13_compile_part1.gif

程序照例将依次编译TEST_UTILS,SUB_LIB,ENTRY_DNS,NEIGHBORHOOD,HOPPER,PROXY SERVER,PROXY CLIENT,NODE,DNS UTILITY和NODE UI,但事实上编译完NODE就会停止。
它会叫你输入密码来开始集成测试(run_integration_tests.sh)。输入密码后很快报错no default toolchain configured

14_compile_part2.gif

没关系!NODE起始已经成功编译完毕,并且它所包含的每一各组件都已经成功通过所有单元测试,只是因为缺少某些测试工具包而无法运行集成测试而已。

7. 测试Node

我们来测试一下,看运行在命令行上的Substratum Node能不能接管树莓派上的网络数据。

a. 安装能在命令行界面运行的的浏览器lynx
sudo pacman -S lynx

运行lynx google.com你就可以在命令行下浏览谷歌了,厉害吧?

15_lynx.gif

b. 设置DNS为本机的127.0.0.1

只有在你把DNS地址设为本机的127.0.0.1后Substratum Node才开始接管网络流量。在树莓派下我们该如何操作这一步?

先用getent来看未更改时的DNS是不是正常运作。

getent hosts google.com

netstat可以列出系统中的所有开放端口。

netstat -lntup

看到端口53了吧?你可能从Dan Wiebe法师那听说过53端口的一些坏消息但不必慌张!这在Arch Linux系统下完全不是个事。来,运行以下命令:

sudo systemctl stop systemd-resolved

53端口不再被占用了!

netstat -lntup

现在你需要编辑resolv.conf

sudo nano /etc/resolv.conf

修改IP地址位为127.0.0.1Ctrl+O保存,Ctl+X退出。

我们来看一下现在系统还能不能域名解析google.com

getent hosts google.com

不能了,这正是我们想要的。 现在你的DNS域名解析将依赖于本机127.0.0.1

16_dns.gif

c. 测试Node

我们需要同时打开两个命令行终端,一个用来运行Node,一个给浏览器。

(终端1)
lynx httpbin.org

没错,此时你无法浏览httpbin.org,因为浏览器暂时无法从DNS获取网页服务器的IP地址。
现在开始在终端2运行Node。

(终端2)
sudo node/target/release/SubstratumNode --dns_servers 1.1.1.1

太好了,没有错误信息,Node成功运行。
现在你可以在终端1再次运行lynx

(终端1)
lynx httpbin.org

17_node.gif

你的成功了吗?我的运行成功了! :)

你可以通过Ctrl+C来关闭Node。

至此,恭喜你,你的Substratum Node在树莓派上安全无故障平稳运行!

这直接证明了Substratum Node 0.3.2版是可以在树莓派3B上运行的。

但是,如果你还想玩一些花哨的,比如界面,那请继续往下。

8. 编译DNS_UTILITY

之前的编译过程在对NODE进行集成测试前停止了,所以DNS_UTILITY和NODE UI肯定没被编译嘛。

首先,我们需要恢复DNS域名解析服务,因为编译过程需要用到网络。

sudo systemctl start systemd-resolved

为避免系统重新编译之前编译过的软件组建,你需要再次修改ci/all.sh,注释掉和已编译组件(TEST_UTILS,SUB_LIB,ENTRY_DNS,NEIGHBORHOOD,HOPPER,PROXY SERVER,PROXY CLIENT,NODE)相关的命令行。

cd ~/SubstratumNode
nano ci/all.sh

很简单,在每个相关行添加#就行了。每个组件有两行。下面是一个关于ENTRY_DNS的例子。

#cd "$CI_DIR/../entry_dns_lib"
#ci/all.sh

Ctrl+O save, Ctrl+X exit.

开始编译DNS_UTILITY。

ci/all.sh

18_dns_utility_part1.gif

和NODE类似,DNS_UTILITY也会在集成测试上失败。但没关系,你的DNS_UTILITY已经成功编译。

19_dns_utility_part2.gif

9. 编译NODE_UI

编译Node界面需要依赖一些额外的软件包。

sudo pacman -S yarn gconf

20_ui_part1.gif

你需要最后一次修改编译文件。

nano ci/all.sh

注释掉DNS_UTILITY的相关命令行以避免重编译。

#cd "$CI_DIR/../dns_utility"
#ci/all.sh "$PARENT_DIR"

Ctrl+O保存,Ctrl+X退出。

开始最后一次编译!

ci/all.sh

21_ui_part2.gif

耐心等待却换来了测试过程中的错误提示:Application launch Error: ChromeDriver did not start within 5000ms。不必慌张,你的NODE_UI也已经成功编译。该测试在命令行终端下是无法成功运行的。

10. 安装X Window系统以及Node UI界面的依赖包

在命令行终端下安装Xorg,Wayland,Xfce和Chromium

sudo pacman -S xorg-server weston xfce4 xfce4-goodies chromium

关机

sudo shutdown now

给树莓派接上显示器,键盘,鼠标。开机,登陆alarm
没有X Window界面嘛?不要恐慌!

startxfce4

界面启动,你可以用鼠标了

让我们打开一个模拟终端来运行Node UI!

cd ~/SubstratumNode/node_ui
sudo yarn start

恭喜你终于爬到了这一步!享受吧!

3_boot.jpg

4_xfce.jpg

5_node.jpg

请注意,你现在运行Node还不能获得Sub币奖励。未来的0.4.0版本会加入去中心化联网功能,之后0.5.0版本才会加入货币化(也就是俗称的赚币)功能。

特别感谢Arch Linux ARM项目以及Substratum Network项目。

请密切关注Substratum官推@SubstratumNet来获得项目最新进展,以及加入官方电报群以及中文非官方电报群进行讨论。当然,你也可关注我的推Microoo

附:本教程的英文版 Hitchhiker's Guide to Substratum Node on Raspberry Pi

Sort:  

Interesting article. I subscribed to you. Subscribe to me. Let's be friends

Congratulations @microoo! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

You got your First payout
Award for the total payout received

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


You can upvote this notification to to help all Steemit users. Learn why here!

Congratulations @microoo! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of upvotes

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - Home stretch to the finals. Do not miss them!


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


You can upvote this notification to to help all Steemit users. Learn why here!