首页 > 其他分享 >移植docker容器到一种CPU架构

移植docker容器到一种CPU架构

时间:2023-01-06 18:47:56浏览次数:69  
标签:vendor org golang linux go 架构 docker CPU

docker包含组件 docker/            docker-cli/        docker-compose/    docker-containerd/ docker-engine/     docker-proxy/ 编译打包 1、.stamp_built' failed,要看前面的错误,一般都是前面有错误停止了导致.stamp_built文件没有生成,如果前面没有错误,尝试make clean后重新make。 2、menuconfig使能需要在go.mk添加csky      else ifeq ($(BR2_csky),y)      GO_GOARCH = csky 3、更换golang直接将交叉工具链放去install,跳过golang的build步骤。  编译CLI和contained 4、提示SP错误,修改gcc_cs.S(关闭CGO后没有此问题) 5、 解决类型未定义_CPU_SETSIZE问题。 将output\host\lib\go\src\cmd\vendor\golang.org\x\sys\unix\中的 ./zerrors_linux_csky.go ./zsyscall_linux_csky.go ./syscall_linux_csky.go ./asm_linux_csky.s ./ztypes_linux_csky.go ./zsysnum_linux_csky.go 拷贝到output\build\docker-cli-19.03.8\vendor\golang.org\x\sys\unix。 cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/unix/* output/build/docker-cli-19.03.8/vendor/golang.org/x/sys/unix/ cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/unix/* output/build/docker-containerd-1.2.13/vendor/golang.org/x/sys/unix/ 6、解决提示缺少internal目录下的unsafeheader文件: cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/internal/ output/build/docker-cli-19.03.8/gopath/src/github.com/docker/cli/vendor/golang.org/x/sys/ -r cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/internal/ output/build/docker-containerd-1.2.13/vendor/golang.org/x/sys/ -r 7、提示错误: vendor/go.etcd.io/bbolt/db.go:109:13: undeclared name maxMapSize for array length vendor/go.etcd.io/bbolt/db.go:376:12: undefined: maxMapSize vendor/go.etcd.io/bbolt/db.go:394:10: undefined: maxMapSize 解决方法: cp output/build/docker-containerd-1.2.13/vendor/go.etcd.io/bbolt/bolt_arm.go output/build/docker-containerd-1.2.13/vendor/go.etcd.io/bbolt/bolt_csky.go   8、编译contained除了和cli类似错误,新增提示unknown reloc to io.ErrUnexpectedEOF: 67 (R_CSKY_ADDR32_HILO) 解决方法:CGO_ENABLE = 0;     编译docker-engine 9、提示错误:vendor/go.etcd.io/bbolt/db.go:400:12: undefined: maxMapSize 解决方法: cp output/build/docker-engine-19.03.8/vendor/go.etcd.io/bbolt/bolt_arm.go output/build/docker-engine-19.03.8/vendor/go.etcd.io/bbolt/bolt_csky.go 10、提示错误: vendor/golang.org/x/sys/unix/affinity_linux.go:13:20: undefined: _CPU_SETSIZE vendor/golang.org/x/sys/unix/affinity_linux.go:13:35: undefined: _NCPUBITS vendor/golang.org/x/sys/unix/affinity_linux.go:16:25: undefined: cpuMask vendor/golang.org/x/sys/unix/affinity_linux.go:49:27: undefined: cpuMask 解决方法: cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/unix/* output/build/docker-engine-19.03.8/vendor/golang.org/x/sys/unix/ 11、提示错误cannot find package "golang.org/x/sys/internal/unsafeheader" 解决方法:cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/internal/ output/build/docker-engine-19.03.8/vendor/golang.org/x/sys/ -r   12、编译docker-engine,提示错误undefined: cmsghdr     解决方法:cp output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/zsys_linux_arm.go output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/zsys_linux_csky.go 13、编译提示 vendor/golang.org/x/net/internal/socket/msghdr_linux.go:11:9: vs[i].set undefined (type iovec has no field or method set) vendor/golang.org/x/net/internal/socket/msghdr_linux.go:13:4: h.setIov undefined (type *msghdr has no field or method setIov) vendor/golang.org/x/net/internal/socket/msghdr_linux.go:15:5: h.setControl undefined (type *msghdr has no field or method setControl) vendor/golang.org/x/net/internal/socket/socket.go:143:4: h.set undefined (type *cmsghdr has no field or method set) vendor/golang.org/x/net/internal/socket/socket.go:166:4: h.set undefined (type *cmsghdr has no field or method set) 解决方法:添加csky支持 gedit output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go  :// +build arm mips mipsle 386 csky gedit output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go  :// +build arm mips mipsle 386 csky gedit output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/iovec_32bit.go     :// +build arm mips mipsle 386 csky 14、提示错误:undefined: sysRECVMMSG 解决方法:cp output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/sys_linux_arm.go output/build/docker-engine-19.03.8/vendor/golang.org/x/net/internal/socket/sys_linux_csky.go 注意这个文件不同arch的配置数值不一样,和zsysnum_linux_csky.go的定义有关,因此复制完后还需要修改sys_linux_csky.go文件,  sysRECVMMSG = 243  sysSENDMMSG = 269   15、提示错误undefined: icmpFilter, undefined: icmpv6Filter 解决方法: cp output/build/docker-engine-19.03.8/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go output/build/docker-engine-19.03.8/vendor/golang.org/x/net/ipv4/zsys_linux_csky.go cp output/build/docker-engine-19.03.8/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go output/build/docker-engine-19.03.8/vendor/golang.org/x/net/ipv6/zsys_linux_csky.go 16、提示 undefined: quota.NewControl 问题原因:因为禁止了CGO,导致projectquota.go文件中依赖了import "C"之后的代码没有编译,其中就有NewControl的实现。 解决方法: docker-engine.mk配置文件中添加exclude_disk_quota,关闭此项功能。 17、提示错误:cannot use ifrDataByte(hw[i]) (value of type int8) as type uint8 in assignment 解决方法:找到代码添加强制转换: gedit output/build/docker-engine-19.03.8/vendor/github.com/docker/libnetwork/drivers/bridge/netlink_deprecated_linux.go uint8(ifrDataByte(hw[i])) 18、执行docker run报错: docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: time=\\\\\\\"2020-02-07T16:00:32Z\\\\\\\" level=fatal msg=\\\\\\\"failed to create a netlink handle: failed to set into network namespace 31 while creating netlink socket: bad address\\\\\\\"\\\\n\\\"\"": unknown. 分析:netns_linux.go文件中的func Setns(ns NsHandle, nstype int) (err error)做系统调用没有成功调用到zsyscall_linux.go中的代码。 解决方法:netns_linux.go中的var SYS_SETNS = map[string]uintptr 增加 "csky":     268,     编译runc 18、提示:lookup.go:15:41: undefined: current       解决方法:run.mk中删除CGO 19、提示:vendor/golang.org/x/sys/unix/affinity_linux.go:13:20: undefined: _CPU_SETSIZE  解决:cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/unix/* output/build/runc-1.0.0-rc10/vendor/golang.org/x/sys/unix/ 20、提示:cannot find package "golang.org/x/sys/internal/unsafeheader" in any of cp output/host/lib/go/src/cmd/vendor/golang.org/x/sys/internal/ output/build/runc-1.0.0-rc10/vendor/golang.org/x/sys/ -r 21、提示: libcontainer/init_linux.go:315:19: undefined: system.Setgid libcontainer/init_linux.go:318:19: undefined: system.Setuid 解决:编辑的gedit output/build/runc-1.0.0-rc10/libcontainer/system/syscall_linux_32.go,增加// +build 386 arm csky 22、提示: libcontainer/system/syscall_linux_32.go:12:35: undefined: unix.SYS_SETUID32 libcontainer/system/syscall_linux_32.go:21:35: undefined: unix.SYS_SETGID32 解决:gedit output/build/runc-1.0.0-rc10/vendor/golang.org/x/sys/unix/zsysnum_linux_csky.go,增加定义  SYS_SETUID32 = 447  SYS_SETGID32 = 448 23、tags中打开cgo标志,出现system.GetClockTicks为定义情况,go中没有实现,cgo中有实现,但是因为cgo_enable=0,所以其中import “C“的实现没有参与编译。 24、使能CGO编译docker-engine提示错误:/opt/csky-toolchain/bin/../lib/gcc/csky-linux-gnuabiv2/6.3.0/../../../../csky-linux-gnuabiv2/bin/ld: cannot find -lsystemd没有解决,临时在docker-engine.mk中注释了systemd等。     部署镜像 1、使用busybox文件系统打包成rootfs.tar 2、编写dockerfile: FROM scratch MAINTAINER cql ADD rootfs.tar / 3、板卡上cd到包含rootfs.tar和dockerfile的工作目录,制作docker镜像:docker build -t busyboxbase:latest . 4、查看docker镜像:docker image ls 4、运行docker镜像:docker run --rm -it busyboxbase sh     运行调试 1、docker ps 测试,出现错误提示 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? docker启动失败。 查看启动日志或者使用dockerd --debug,提示错误:failed to start daemon: error initializing graphdriver: invalid argument 原因是没有使能graphdriver。menuconfig中打开一个即可。   3、原因是没有部署socker镜像,下面通过dockers build建立镜像并部署到系统。 6、查看启动日志,dockerd运行一直报错: failed to set to initial namespace, net:[4026531877], initns fd 14: bad address 代码分析: InitOSContext—>SetNamespace(vendor/github.com/docker/libnetwork/ns/init_linux.go)—>Setns(vendor/github.com/vishvananda/netns/netns_linux.go) —>syscall.Syscall(SYS_SETNS)—>Syscall(vendor/golang.org/x/sys/unix/gccgo.go)—>realSyscall(vendor/golang.org/x/sys/unix/gccgo_c.c) 4、执行docker run报错: docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: time=\\\\\\\"2020-02-07T16:00:32Z\\\\\\\" level=fatal msg=\\\\\\\"failed to create a netlink handle: failed to set into network namespace 31 while creating netlink socket: bad address\\\\\\\"\\\\n\\\"\"": unknown. 分析:netns_linux.go文件中的func Setns(ns NsHandle, nstype int) (err error)做系统调用没有成功调用到zsyscall_linux.go中的代码。 解决方法:netns_linux.go中的var SYS_SETNS = map[string]uintptr 增加 "csky":     268, 5、执行docker run报错: docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown. 分析: container_linux.go打印确认,但是添加打印有点奇怪,通过编写测试程序stat系统调用正常,确认docker文件系统镜像中是包含了/bin/sh目录,怀疑是文件系统的路径不对。使用docker run --rm -it busyboxbase /rootfs/bin/sh测试可以成功进入容器。 解决方法:重新支持容器文件系统,将bin等目录置于压缩包rootfs.tar的一级目录,剔除rootfs目录。  

标签:vendor,org,golang,linux,go,架构,docker,CPU
From: https://www.cnblogs.com/mic-chen/p/17031337.html

相关文章

  • AMD锐龙7000系列CPU命名混乱?三分钟帮你看明白
    在CES2023上,AMD发布了多款7000系平台,全新的联想小新笔记本锐龙版产品线将涵盖其中的锐龙7040、锐龙7035、锐龙7030三大系列。想要快速记住它们也很简单,小新帮大家复习......
  • Linux +Docker +Nginx 部署代理转发初探
    很多开发人员仅仅只会码代码,如果让开发人员部署一些深入点的东西,或者做负载均衡等,很多开发人员估计就懵逼了,作为一个专业的开发还需要懂一些基本的运维知识;虽然说在互联......
  • docker逃逸汇总
    利用特权模式进行docker逃逸使用特权模式启动容器,可以获取大量设备文件访问权限。因为当管理员执行dockerrunprivileged时,Docker容器将被允许访问主机上的所有设备......
  • 三 docker存储和网络
    docker数据管理数据卷volumes可供一个或多个容器使用的特殊目录,可以在容器之间共享,对数据卷的修改会立即生效且不会影响镜像,与容器声明周期独立,即容器删除数据卷也可......
  • .Net 微服务架构技术栈的那些事
    一、前言大家一直都在谈论微服务架构,园子里面也有很多关于微服务的文章,前几天也有一些园子的朋友问我微服务架构的一些技术,我这里就整理了微服务架构的技术栈路线图,这里就......
  • 【.net core】电商平台升级之微服务架构应用实战(core-grpc)
    一、前言这篇文章本来是继续分享IdentityServer4的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享。......
  • 46-Docker-Container容器管理各种操作
    容器相关命令[root@ubuntu2204~]#dockercontainerUsage:dockercontainerCOMMANDManagecontainersCommands:attachAttachlocalstandardinput,output,and......
  • Docker 版本升级
    Docker版本升级1、查看系统要求Docker要求CentOS系统的内核版本高于3.10,查看CentOS的内核版本。uname-a2、删除旧版本yumremovedockerdocker-commondock......
  • 简单java servlet的登录脚本,部署到docker
    先打算参考这篇文章Simpleloginpageexampleusingjspservlet-Candidjava内含war文件和zip文件。但是tomcat上该war文件总是报错。于是又参考这篇(46条消息)Jav......
  • Docker版思源笔记使用Dark+主题,无法显示“霞鹜文楷等宽”字体的解决方式
    在Docker版思源笔记中使用Dark+主题时,编辑器的字体与Dark+中主题预览的字体不一致。此问题咨询了思源笔记官方得到是回复是“官方暂时不考虑Docker版的编辑器暂不考虑......