最近接到了一个任务,在一块板上调试ipfs。所以呢,首先就要在板子上安装ipfs,可是令人头疼的是,那块板的芯片架构是mips架构的,ipfs官网没有提供支持mips架构的安装包。我就想着,既然没有,我就自己编译一个出来呗,接着就展开了以下工作,使用ipfs源码,编译出适合mips架构的安装包:
1.由于板子上没有搭建go环境,不可以直接编译go-ipfs,所以我就选择在虚拟机上先编译好,再移植过去(有好处,请接着看)。虚拟机上的golang版本是1.10版本的(可以选择其他版本,但可能执行交叉编译的时候有问题),虚拟机是amd64架构的,不可以直接编译出mips架构可以执行的文件,因此需要进行交叉编译。具体的交叉编译步骤以下会简单介绍,你也可以自行google或baidu。
2.获取源代码
go get -u -d github.com/ipfs/go-ipfs //也可以使用git clone https://github.com/ipfs/go-ipfs.git 获取
3.编译源代码
export GOPATH=/root/code/go //可以自定义目录的
把源代码放到 $GOPATH/src/github.com/ipfs/go-ipf 目录下,执行以下命令
cd $GOPATH/src/github.com/ipfs/go-ipf
make install
4.好了?不,早着呢!执行make install可能会遇到一大堆问题
第一,网络问题,由于编译的时候,需要从ipfs官网下载一些包,ipfs官网需要fq才能访问,最好是搞个fq路由器,这样命令行也可以fq,不然普通的fq方法只能使浏览器可以访问。
第二,执行make install 时,首先会从ipfs官网下载gx/gx-go(go-ipfs的包管理工具),把GOARCH设置为amd64后(export GOARCH=amd64),执行make install,此时除了网络问题,其他的应该问题不大,但是编译出来的ipfs执行文件(在/root/code/go/bin/目录下)只能在amd64架构执行。
以上步骤其实就是普通的编译安装ipfs过程,但是执行以上过程之后,我们就已经把所有需要的包都下载到本地了,接下来才是真正编译出mips架构可执行文件
1.设置交叉编译环境:
export GOOS=linux
export GOARCH=mipsle
2.执行
make install
此时将不会再遇到什么网络问题了,因为所需文件都已经下载到本地。但是由于ipfs源码不支持mips架构,所以还是会遇到一大堆问题的,比如:
gx/ipfs/QmTEmsyNnckEq8rEfALfdhLHjrEHGoSGFDrAYReuetn7MC/go-net/ipv4
../../../../../gx/ipfs/QmTEmsyNnckEq8rEfALfdhLHjrEHGoSGFDrAYReuetn7MC/go-net/ipv4/icmp.go:34:2: undefined: sysICMPFilter
gx/ipfs/QmTEmsyNnckEq8rEfALfdhLHjrEHGoSGFDrAYReuetn7MC/go-net/ipv6
../../../../../gx/ipfs/QmTEmsyNnckEq8rEfALfdhLHjrEHGoSGFDrAYReuetn7MC/go-net/ipv6/icmp.go:34:2: undefined: sysICMPv6Filter
就是说icmp.go文件里的sysICMPFilter、sysICMPv6Filter等未定义,解决方法是:
首先,在gen.go文件里添加mipsle的判断,可以参考https://bugzilla.redhat.com/attachment.cgi?id=1147705&action=diff,接着从网上自行找一份zsys_linux_mipsle.go文件添加到对应得文件夹里面,可以从以下链接尝试寻找:
https://github.com/kubeflow/katib/blob/master/vendor/golang.org/x/net/ipv6/zsys_linux_mipsle.go
https://github.com/intel/multus-cni/tree/master/vendor/golang.org/x/net/ipv4
然后,再次执行make install,若还是以上问题,则需要在zsys_linux_mipsle.go文件里面添加sysICMPFilter结构,可以参考其他的zsys_linux文件;接着遇到的问题也与以上的大同小异,解决方法也是修改zsys_linux_mipsle.go文件(注意ipv4、ipv6的都要改)。
最好,再次执行make install,此时应该没有什么大问题了,生成的执行文件在/root/code/go/bin/linux_mips/ipfs 路径下。把对应的ipfs执行文件移植到mips板子上,应该就可以执行成功了!
好了,以上就是本文章的全部内容了,希望可以帮到你。若有什么疑问,可以在下方进行评论留言,我们一起探讨!
本文章为原创内容,未经允许,不得转发!