龙芯CPU的架构有Mips架构和loong64架构(如龙芯3C5000L)。

对于Mips架构,能够应用golang的穿插编译,指定GOARCH=mips64le编译出prometheus的可执行文件。

对于loong64架构,golang的穿插编译尚不反对,通常须要在龙芯的OS上装置golang,而后将prometheus的git repoc拷贝过来,而后本机编译

# go versiongo version go1.15.6 linux/loong64

本文探讨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

prometheus

构建过程:

  • 开发机器: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二进制文件

prometheus镜像

Dockfile中根底镜像为quay.io/prometheus/busybox,须要替换为龙芯下的busybox: harbor.loongnix.cn/mirrorloongsoncontainers/busybox,龙芯harbor的拜访办法参考2。

在龙芯机器上,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/#/...