# 跨平台编译运行 ## 方案 镜像跨平台编译有两种方式: 1)使用binfmt实现镜像跨平台编译运行 2)使用qemu-user-static实现镜像跨平台编译运行 ## 涉及镜像 [ tonistiigi/binfmt, lcr.loongnix.cn/tonistiigi/binfmt, cr.loongnix.cn/tonistiigi/binfmt, multiarch/qemu-user-static, lcr.loongnix.cn/library/qemu-user-static, cr.loongnix.cn/library/qemu-user-static, ] ## x86仿真运行编译LA abi1.0 (以下方式二选一即可) 1. binfmt - 获取cr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch ``` docker pull cr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch``` - 将qemu-loongarch64注册码注册到/proc/sys/fs/binfmt_misc下,qemu-loongarch64存入缓存 ``` docker run --rm --privileged cr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch --install loongarch64``` - 拉取LA镜像,如 ``` docker pull --platform=linux/loong64 cr.loongnix.cn/library/alpine:3.11``` - 编译运行时需指定LA架构,如 ``` docker buildx build --platform linux/loong64 -t example:example -f example . ``` 2. qemu-user-static - 获取multiarch/qemu-user-static:latest qemu-loongarch二进制 ``` docker pull multiarch/qemu-user-static:latest wget https://github.com/Loongson-Cloud-Community/qemu-user-static/releases/download/x86_abi1.0/qemu-loongarch64-static ``` - 将qemu-loongarch64注册码注册到/proc/sys/fs/binfmt_misc下, 手动下载qemu-loongarch64 并放置到/usr/bin ``` docker run --rm -it --privileged multiarch/qemu-user-static:latest --reset mv qemu-loongarch64-static /usr/bin/qemu-loongarch64-static ``` - 拉取LA镜像,如 ``` docker pull --platform=linux/loong64 cr.loongnix.cn/library/alpine:3.11``` - 编译运行时需指定LA架构,如 ``` docker buildx build --platform linux/loong64 -t example_image -f example . ``` ``` docker run -it --rm --platform loong64 -v /usr/bin/qemu-loongarch64-static:/usr/bin/qemu-loongarch64-static debian:11 uname -m ``` ## x86仿真运行编译LA abi2.0 (以下方式二选一即可) 1. binfmt - 获取lcr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch ``` docker pull lcr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch``` - 将qemu-loongarch64注册码注册到/proc/sys/fs/binfmt_misc下,qemu-loongarch64存入缓存 ``` docker run --rm --privileged lcr.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch --install loongarch64``` - 拉取LA镜像,如 ``` docker pull --platform=linux/loong64 lcr.loongnix.cn/library/alpine:latest``` - 编译运行时需指定LA架构,如 ``` docker buildx build --platform linux/loong64 -t example_image -f example . ``` 2. qemu-user-static - 获取multiarch/qemu-user-static:latest qemu-loongarch二进制 ``` docker pull multiarch/qemu-user-static:latest wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-loongarch64-static ``` - 将qemu-loongarch64注册码注册到/proc/sys/fs/binfmt_misc下, 手动下载qemu-loongarch64 并放置到/usr/bin ``` docker run --rm -it --privileged multiarch/qemu-user-static:latest --reset mv qemu-loongarch64-static /usr/bin/qemu-loongarch64-static ``` - 拉取LA镜像,如 ``` docker pull --platform=linux/loong64 lcr.loongnix.cn/library/alpine:latest``` - 编译运行时需指定LA架构,如 ``` docker buildx build --platform linux/loong64 -t example:example -f example . ``` ``` docker run -it --rm --platform loong64 -v $(pwd)/qemu-loongarch64-static:/usr/bin/qemu-loongarch64-static debian:11 uname -m ``` ## 注意: abi 1.0和abi 2.0的qemu并不一致,因此需要在不同的地址下载镜像及二进制,但由于在qemu中loongarch64的magic和misk恒定,因此在x86平台下不能同时对abi1.0和abi2.0进行仿真 在使用abi1.0(2.0)之后如果想要切换为2.0(1.0) - 如果使用binfmt镜像,需要先清理当前内存中注册的qemu 执行```docker run --rm --privileged xx.loongnix.cn/tonistiigi/binfmt:x86_add_loongarch --uninstall loongarch64 ``` - 如果使用qemu-user-static,需要删除/usr/bin下的qemu-static-loongarch64 ## LA abi1.0仿真运行编译x86 (以下方式二选一即可) 1. binfmt - 同x86方式相同,使用镜像不同 ``` docker pull cr.loongnix.cn/tonistiigi/binfmt:loongarch64_other_arch ``` 2. qemu-user-static - 同x86方式相同,使用镜像不同 ``` docker pull cr.loongnix.cn/library/qemu-user-static:latest-loongarch64 ``` - 全部架构的qemu-static二进制tar包地址 ``` https://github.com/Loongson-Cloud-Community/qemu-user-static/releases/download/abi2.0/qemu-static-8.2.0-rc2.tar.gz``` ## LA abi2.0仿真运行编译x86 (以下方式二选一即可) 1. binfmt - 同x86方式相同,使用镜像不同 ``` docker pull lcr.loongnix.cn/library/binfmt:latest ``` 2. qemu-user-static - 同x86方式相同,使用镜像不同 ``` docker pull lcr.loongnix.cn/library/qemu-user-static:latest ``` - 全部架构的qemu-static二进制tar包地址 ``` https://github.com/Loongson-Cloud-Community/qemu-user-static/releases/download/abi2.0/qemu-static-8.2.0-rc2.tar.gz```