龙芯loong64架构(prometheus二进制编译和镜像构建)
龙芯CPU的架构有Mips架构和loong64架构(如龙芯3C5000L)。
对于Mips架构,可以使用golang的交叉编译,指定GOARCH=mips64le编译出prometheus的可执行文件。
对于loong64架构,golang的交叉编译尚不支持,通常需要在龙芯的OS上安装golang,然后将prometheus的git repoc拷贝过去,然后本机编译。
# go version
go version go1.15.6 linux/loong64
【龙芯loong64架构(prometheus二进制编译和镜像构建)】本文探讨loong64架构下,prometheus二进制编译和镜像构建的方法。
GOPROXY 龙芯loong64提供了GOPROXY,里面包含了常用的依赖,但是不全:
go env -w GOPROXY=http://goproxy.loongnix.cn:3000,direct
配置direct后,当GOPROXY没有找到依赖时,会直接去源地址拉取。
编译方法 在开发机器中,使用go mod vendor,将依赖放置vendor目录,然后将整个prometheus项目(含vendor)拷贝至龙芯机器,再到龙芯机器上使用vendor进行本地编译(go build -mod vendor)。
在编译过程中,通常会报vendor目录下golang.org/x/sys、golang.org/x/net库失败,此时需要将龙芯机器本地的golang.org/x/sys和golang.org/x/net包替换到vendor目录即可。
prometheus编译过程 prometheus二进制构建,依赖构建工具promu,故要先build出来promu。
promu
构建过程:
- 开发机器:git clone github.com/prometheus/promu
- 开发机器:go mod vendor
- 将项目目录promu拷贝至龙芯机器;
- 龙芯机器:make build生成promu
构建过程:
- 开发机器:git clone github.com/prometheus/prometheus
- 开发机器:go mod vendor
- 将项目目录prometheus拷贝至龙芯机器;
- 龙芯机器:将/root/go/pkg/mod/golang.org/x/sys和x/net,替换vendor目录下的golang.org/x/sys和x/net;
- 将上一步构建出来的promu可执行文件,拷贝至prometheus项目根目录;
- 龙芯机器:修改Dockerfile.common,使用本地的promu工具
... $(PROMU): #$(eval PROMU_TMP := $(shell mktemp -d)) #curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) #mkdir -p $(FIRST_GOPATH)/bin #cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu #rm -r $(PROMU_TMP) cp ./promu $(FIRST_GOPATH)/bin/promu ...
- 龙芯机器:
- vendor/github.com/prometheus/procfs目录,增加cpuinfo_loong64.go文件
// +build linuxpackage procfsvar parseCPUInfo = parseCPUInfoLoong64
- vendor/github.com/prometheus/procfs目录,修改cpuinfo.go文件,增加下面的内容
scanner := bufio.NewScanner(bytes.NewReader(info))// find the first "processor" line firstLine := firstNonEmptyLine(scanner) if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") { return nil, errors.New("invalid cpuinfo file: " + firstLine) } field := strings.SplitN(firstLine, ": ", 2) cpuinfo := []CPUInfo{} systemType := field[1]for scanner.Scan() { line := scanner.Text() if strings.TrimSpace(line) == "" { break } }i := 0 for scanner.Scan() { line := scanner.Text() if !strings.Contains(line, ":") { continue } field := strings.SplitN(line, ": ", 2) switch strings.TrimSpace(field[0]) { case "processor": v, err := strconv.ParseUint(field[1], 0, 32) if err != nil { return nil, err } i = int(v) cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor cpuinfo[i].Processor = uint(v) cpuinfo[i].VendorID = systemType case "cpu family": cpuinfo[i].CPUFamily = field[1] case "BogoMIPS": v, err := strconv.ParseFloat(field[1], 64) if err != nil { return nil, err } cpuinfo[i].BogoMips = v } } return cpuinfo, nil }
- 龙芯机器:在prometheus项目根目录,执行make build,编译出prometheu二进制文件
在龙芯机器上,docker build构建镜像
docker build -t "harbor.mycompany.org/kubernetes/loong64/prometheus:v2.20.0" -f Dockerfile .
参考 1.龙芯golang: http://doc.loongnix.cn/web/#/...
2.龙芯harbor: http://doc.loongnix.cn/web/#/...
推荐阅读
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- 年薪30万的Java架构师必会的springboot面试题
- EdgeDB 架构简析
- 大众点评(redux架构)
- 架构的架构基础
- 从0开始学架构|从0开始学架构 - 高可用计算架构、异地多活架构、如何应对接口级故障
- (基础+优化+架构)太厉害了!华为大牛终于把MySQL讲的明明白白
- 3|3 台机器如何搞定一个 Redis 高可用架构
- 每日一书|每日一书丨学习微服务最好的方式(阅读《微服务架构设计模式》)
- Spring-Security-架构初谈