RISC-V 开源软件安装与自行编译

risc-v 开发板虽然可以运行 Linux 发行版,但是毕竟还是处于起步阶段,生态是没法跟 arm 以及 x86 相比的。

这段时间在研究这台 visionfive,在软件这方面也折腾了不少,本文记录一下心得。

以前拿到开发板或者可以运行 Linux 的机顶盒时,我喜欢在上面装下载软件,以及开启 smb 共享,让它作为一台简易 NAS 来使用。这次在 visionfive 上面我也有进行尝试。

首先 BT 下载软件 transmission 和 qbittorrent 在这上面想要安装都非常简单,直接用 dnf 就行

dnf install transmission-daemon
dnf install qbittorrent-nox

image-20220412155348270

image-20220412155459647

samba 也可以直接用 dnf 安装

dnf install samba

image-20220412160053966

这种是比较简单的,这里就不多细讲了。

像有些开源软件,它是托管在 GitHub 上面的,这类软件,我们可以到它的 GitHub release 里面,下载 riscv 架构的可执行文件。这里举两个例子

syncthing

这是一个多平台同步软件,之前有一段时间,我经常使用它将我手机里的照片、视频,同步到电脑上面。

想要让它在 visionfive 上面运行,需要到 https://github.com/syncthing/syncthing/releases 里面找名字带 riscv64 的,目前最新的是这个

https://github.com/syncthing/syncthing/releases/download/v1.19.2/syncthing-linux-riscv64-v1.19.2.tar.gz

我们可以通过 wget 将它下载到本地,然后使用 tar 解压

wget https://github.com/syncthing/syncthing/releases/download/v1.19.2/syncthing-linux-riscv64-v1.19.2.tar.gz
tar xf syncthing-linux-riscv64-v1.19.2.tar.gz

此时我们得到的是一个文件夹

$l syncthing-linux-riscv64-v1.19.1
total 23M
drwxr-xr-x 5 riscv riscv 4.0K Mar 1 14:45 .
drwx------. 19 riscv riscv 4.0K Apr 10 10:45 ..
-rw-r--r-- 1 riscv riscv 14K Mar 1 14:38 AUTHORS.txt
drwxr-xr-x 11 riscv riscv 4.0K Mar 1 14:45 etc
drwxr-xr-x 2 riscv riscv 4.0K Mar 1 14:45 extra
-rw-r--r-- 1 riscv riscv 17K Mar 1 14:38 LICENSE.txt
drwxr-xr-x 2 riscv riscv 4.0K Mar 1 14:45 .metadata
-rw-r--r-- 1 riscv riscv 4.7K Mar 1 14:38 README.txt
-rwxr-xr-x 1 riscv riscv 23M Mar 1 14:44 syncthing

执行文件夹里的 syncthing 即可启动这个软件,然后它会输出一些启动信息

cd syncthing-linux-riscv64-v1.19.1 
➜ syncthing-linux-riscv64-v1.19.1 ./syncthing
[start] 16:13:15 INFO: syncthing v1.19.1 "Fermium Flea" (go1.17.7 linux-riscv64) teamcity@build.syncthing.net 2022-02-21 13:57:21 UTC
[start] 16:13:15 INFO: Generating ECDSA key and certificate for syncthing...
[start] 16:13:16 INFO: Default folder created and/or linked to new config
[start] 16:13:16 INFO: Default config saved. Edit /root/.config/syncthing/config.xml to taste (with Syncthing stopped) or use the GUI
[start] 16:13:16 INFO: Archiving a copy of old config file format at: /root/.config/syncthing/config.xml.v0

等一会会出现一条比较重要的信息

[6RXV3] 16:13:32 INFO: Access the GUI via the following URL: http://127.0.0.1:8384/

它表示我们只能在 visionfive 上面使用浏览器访问这个网址,才可以打开 syncthing 的图形化界面。如果你像我一样,并没有给 visionfive 接显示器,一直都是 ssh 连接来操作的。此时这一步就没有进行下去了。

所以我们需要先停止软件,改一下配置文件后,再来启动。按 ctrl + c 这两个按键可以退出软件,然后我们使用 nano 来修改配置文件。

nano ~/.config/syncthing/config.xml

找到 <address>127.0.0.1:8384</address> 这一行,改为 <address>0.0.0.0:8384</address> ,再次输入 ./syncthing 启动软件

此时就可以用电脑的浏览器来访问运行在 visionfive 上面的 syncthing 了。

image-20220412162500139

miniserve

这个软件是我个人非常喜欢的文件展示应用,它的主要功能就是将某个文件夹通过 web 的方式共享出来,但是功能远不止于此。它还是支持上传功能,以及添加用户名密码验证,所以也可以把它当一个简易网盘来使用。

项目:https://github.com/svenstaro/miniserve

安装方法:

wget https://github.com/svenstaro/miniserve/releases/download/v0.19.4/miniserve-v0.19.4-riscv64gc-unknown-linux-gnu
mv miniserve-* miniserve
chmod +x miniserve

使用:

./miniserve

非常简单,下载后赋予它可执行权限,然后直接 ./ 就可以运行了。这样它会将你当前所在的文件夹,通过 8080 端口共享出来。

如果想使用其它端口,可以使用 -p 来指定,想添加上传功能,使用 -u ,想共享其它的文件夹,直接将文件夹路径写上去即可。

示例:

➜ ./miniserve -u -p 9527 /tmp/test
miniserve v0.19.3
Bound to [::]:9527, 0.0.0.0:9527
Serving path /tmp/test
Available at (non-exhaustive list):
http://127.0.0.1:9527
http://192.168.68.178:9527
http://[::1]:9527

Quit by pressing CTRL-C

image-20220412163658298

自行编译

上面讲到的 syncthing 和 miniserve,它们的 release 里都有提供 riscv 的可执行文件,所以我们使用起来还算是比较容易。

但这类还是比较少数的,其它开源软件大多数目前都是没有提供 riscv 版的,所以如果我们想要使用的话,就需要自行编译。

先来一个简单的——zerotier

这个软件的功能是组虚拟局域网,让家里没有公网 ip 的用户,也可以远程访问家里设备。

想让它在 visionfive 上面运行我们需要自行编译,很简单,下载源代码到本地,进入项目文件夹,执行 make 编译就行

git clone --depth=1 https://github.com/zerotier/ZeroTierOne.git
cd ZeroTierOne
make

编译完成后当前目前下多出 zerotier-onezerotier-cli

./zerotier-cli -v                   
1.8.8

另外我还尝试编译 frp 这款软件,这个耗费了我不少的时间。由于它是用 go 写的,想要编译它需要有 go 环境,然后我就想到 golang 的官网下载,却发现并没有提供 riscv 版的。

走了一堆弯路之后,我才发现 visionfive 的 Fedora 里竟然自带 go

➜  ~ go version
go version go1.14.6 gccgo (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1) linux/riscv64

不过我使用它并没法成功编译 frp,想使用自带的 go1.14.6 编译现在最新的 go1.18 也没成功。

之后又发现在 x86 上面是可以使用 go 设定交叉编译,来编译 riscv64 的可执行文件的。

最终我使用这两条命令,成功编译出 riscv 版的 frp 服务器端和客户端

go env -w GOPROXY=https://goproxy.cn

网络问题,先设置代理

CGO_ENABLE=0 GOOS=linux GOARCH=riscv64 go build ./cmd/frpc
CGO_ENABLE=0 GOOS=linux GOARCH=riscv64 go build ./cmd/frps

这样编译出来的文件是在当前目录下的,想存放在其它地方,应该使用 -o 参数

CGO_ENABLE=0 GOOS=linux GOARCH=riscv64 go build -o bin/frpc-riscv64 ./cmd/frpc
➜ frpc -v         
0.41.0
➜ file frpc
frpc: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, Go BuildID=Pwh5MYcPoYJ1E09FI1rO/vrYuoTbR0yxAguZ0ck9D/DeYARJeTJfCF72R2PXOv/9mZ673VwFshYBrO5Grjy, not stripped

那么用同样的方法,也可以编译 filebrowser 的后端部分

GOOS=linux GOARCH=riscv64 go build
➜ file filebrowser
filebrowser: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), statically linked, Go BuildID=8ohLL6OaYPgPR1ZtkIRd/d9lcK8Ocz9YIDVZqMFFv/cB4dn0G6WtNCIXUJsvX-/Xo17t9_I87svg4x4zqx_, not stripped

前端部分需要 nodejs 和 npm ,这个官方没有提供 riscv 版,GitHub 上面有修改版,说是可以给 riscv 用,不过我没弄成功。