在樹莓派上編譯 go-ipfs

1. 需求

用 PC 當 Server 測試環境,費電!挖出吃灰多年的樹莓派 Model B Rev 2 000f,打算用它跑 ipfs!

2. 系統選型

  • 較熟悉的 CentOS、FreeBSD、Ubuntu Server、Windows IoT 的當代主流版本都不支持這款古老的樹莓派。
  • ArchLinux 支持,然而穌個人認為 ArchLinux(屬於 Linux 中的邪教)不適合當 Server。
  • 嘗試刷 OpenWRT,發現即使設置密碼,本地控制檯也是沒密碼就能登陸。這不太安全,雖然本地就是不安全的,但別的系統可不是這麼設計的!
  • 還是官方的 Raspbian Buster Lite 吧!

3. 安裝系統

主要參考官方文檔:

  • Setup:選個 16GB 的 SD 卡。
  • Installing operating system images:用官方 Raspberry Pi Imager 工具把系統鏡像刷到 SD 卡。
  • 接 HDMI 顯示,通電。首次啟動,系統會自動對 SD 卡的分區進行擴容,使第二個分區擴滿未分配空間。

4. 配置系統

通過 sudo raspi-config 做基本配置:

  • 進“本地化”把默認語言 en_GB.UTF-8 去掉,勾選 en_US.UTF-8。
  • 鍵盤佈局改為通用 105 鍵(國際)美國佈局(默認的英國佈局下按 | 會變 ~)。
  • 時區改為當地。
  • 改機器名(如果您有多個樹莓派,不改會重名),穌將之改為 rp1b。
  • 改 pi 用戶的密碼。
  • 開啟 SSH,插上網線或者 USB 無線網卡,就可以從別處遠程登陸它了。

5. 配置國內 apt 源

<code>sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 增加阿里雲源
echo 'deb https://mirrors.aliyun.com/raspbian/raspbian/ buster main non-free contrib
deb-src https://mirrors.aliyun.com/raspbian/raspbian/ buster main non-free contrib' | sudo tee /etc/apt/sources.list.d/aliyun.list
# 增加清華大學源
echo 'deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib' | sudo tee /etc/apt/sources.list.d/tsinghua.list/<code>

6. 安裝 Go 編譯器

打算直接在樹莓派上編譯,所以要先在樹莓派上安裝編譯環境。不過不要通過 sudo apt install golang 安裝,因為截至今天(2020-03-28),這命令安裝的是 1.11.6 版,這對 go-ipfs 項目來說太低了。

到 golang 官網下載 ARMv6 安裝包,目前最新版本是 1.14.1。

壓縮包裡是有一個 go 文件夾的,所以只要解壓到 /usr/local/ 下即可。

<code># aria2 比 wget 強大
# sudo apt install aria2
cd ~
aria2c https://dl.google.com/go/go1.14.1.linux-armv6l.tar.gz
cd /usr/local
tar -xzf ~/go1.14.1.linux-armv6l.tar.gz
sudo ln -s /usr/local/go/bin/go /usr/bin/go
sudo ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt/<code>

7. 編譯項目

<code>git clone https://github.com/ipfs/go-ipfs
cd go-ipfs
make build/<code>

有很多依賴庫需要下載,開始漫長等待……如果代碼都下載完,則 make build 的輸出為:

<code>go version go1.14.1 linux/arm
bin/check_go_version 1.14.1
plugin/loader/preload.sh > plugin/loader/preload.go
go fmt plugin/loader/preload.go >/dev/null
go build "-asmflags=all='-trimpath='" "-gcflags=all='-trimpath='" -ldflags="-X "github.com/ipfs/go-ipfs".CurrentCommit=3561de074-dirty" -o "cmd/ipfs/ipfs" "github.com/ipfs/go-ipfs/cmd/ipfs"
/<code>

最後一行會卡很久!em……用高性能機器來交叉編譯才是正確的方式!

8. 在 macOS 上編譯樹莓派程序

樹莓派的 CPU 架構是 armv6l,所以用以下命令編譯:

<code>CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 make build/<code>

在 MBP15 上編譯快很多!(前面純屬折騰!

)編完複製到樹莓派:

<code>scp ./cmd/ipfs/ipfs pi@rp1b:/home/pi//<code>

在樹莓派上測試:

<code>pi@rp1b:~ $ uname -a
Linux rp1b 4.19.97+ #1294 Thu Jan 30 13:10:54 GMT 2020 armv6l GNU/Linux

pi@rp1b:~ $ ./ipfs version
ipfs version 0.5.0-dev

pi@rp1b:~ $ ./ipfs init
initializing IPFS node at /home/pi/.ipfs
generating 2048-bit RSA keypair...

pi@rp1b:~ $ ./ipfs daemon
Initializing daemon...
go-ipfs version: 0.5.0-dev-3561de074
Repo version: 9
System version: arm/linux
Golang version: go1.14
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.1.91/tcp/4001
Swarm listening on /ip6/240e:379:254c:9d00:969d:e453:9448:1efb/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/110.87.124.125/tcp/21551
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.1.91/tcp/4001
Swarm announcing /ip6/240e:379:254c:9d00:969d:e453:9448:1efb/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready/<code>


分享到:


相關文章: