Arm:重新编译etcd以“解决”出现“ETCD_UNSUPPORTED_ARCH”相关警告的问题

在github中的etcd已经有arm64的打包可供下载使用了,但是在使用时会有警告,就算是按照搜索到的设置了 export ETCD_UNSUPPORTED_ARCH=arm64 环境变量但是这不过是 running etcd on unsupported architecture arm64 since ETCD_UNSUPPORTED_ARCH is set 或者 etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=arm64 set 的区别而已。
直接执行etcd虽然会出现警告但是还是能运行起来可是使用service启动却会因为这个错误而不断重启。刚开始还在为难不知道要修改哪个文件时出现的一个提示让我快速的找到了文件。

在警告提示中看到了 etcdmain 让我快速定位到了文件夹,简单的浏览了下代码很快就知道怎么“解决”了。

1、安装GO环境
本来下载go1.16的,下载后才发现买的arm服务器系统中已经安装了go1.13的版本就直接使用1.13吧。

# 下载 go1.16.3.linux-arm64.tar.gz
wget https://golang.google.cn/dl/go1.16.3.linux-arm64.tar.gz
# 解压 go1.16.3.linux-arm64.tar.gz
tar -zxvf go1.16.3.linux-arm64.tar.gz
......

2、下载etcd源码并解压

# 下载 v3.2.32.zip 
https://github.com/etcd-io/etcd/archive/refs/tags/v3.2.32.zip
# 解压 v3.2.32.zip 
unzip v3.2.32.zip

3、修改

# 进到对应目录
cd etcd-3.2.32/etcdmain
# 编辑文件
vi etcd.go
# 在407加个判断条件 runtime.GOARCH == "arm64"
func checkSupportArch() {
        // TODO qualify arm64
        if runtime.GOARCH == "amd64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "arm64" {
                return
        }
        if env, ok := os.LookupEnv("ETCD_UNSUPPORTED_ARCH"); ok && env == runtime.GOARCH {
                plog.Warningf("running etcd on unsupported architecture %q since ETCD_UNSUPPORTED_ARCH isset", env)
                return
        }
        plog.Errorf("etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=%s set.", runtime.GOARCH)
        os.Exit(1)
}

4、编译

# 回到目录
cd ..
# 编译
bash build
# 编译完成后,都输出到bin目录
ll bin
# etcd etcdctl

至此已经“解决”提示问题了。

ChiuYut

2021年4月22日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!