qemu-user-static, 在x86机器上编译arm架构docker
Posted gangeqian2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qemu-user-static, 在x86机器上编译arm架构docker相关的知识,希望对你有一定的参考价值。
台式机上编译arm架构的docker镜像,但是手头上没有现成的arm架构的机器环境,可以使用qemu实现,在网上找了几个教程后,比如:
qemu教程1
qemu教程2
操作了半天在 注册qemu-user-static虚拟机这一项存在问题。主要是multiarch/qemu-user-static:register 主要问题如下:
运行 $docker images
可以看到multiarch/qemu-user-static:register 只有1.27MB,当然注册的虚拟机也就无法work。
正确的流程如下:
qumu-user-static
项目地址:multiarch/qemu-user-static
qemu-user-static是一个用于利用当前操作系统来运行其它架构的一个仿真器,这个github项目可以通过x86的机器编译出其它各个架构的docker镜像。
支持的指令集架构:
armv7l
ppc64le
s390x
aarch64
armv7l
ppc64le
docker 安装
docker file
很多开发环境提提供 Dockerfile
sudo docker build . -t aarch64/ubuntu:v1
正常情况下会遇到如下问题:
---> [Warning] The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
---> Running in 0f611656574e
standard_init_linux.go:228: exec user process caused: exec format error
解决方法
(1)安装qemu相关
sudo apt-get install qemu binfmt-support qemu-user-static
(2)注册qemu-user-static虚拟机
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
运行
$ docker ps -a
可以看到:
说明注册成功,
然后继续运行上面dockerfile 镜像生成
小X与机器人 (betago) 题解
题目描述
输入
输出
输出一行包含一个整数 ans, 表示小机器人从 (x1, y1) 移动到 (x2, y2) 的最少步数。
样例输入
样例输出
【数据范围】
题解
方法一:分类讨论
三种情况:
(1)对面两个点,要分两路比较
(2)相邻直线上的两个点(x横坐标y纵坐标)abs(x1-x2)+abs(y1-y2)
(3)同一条线上abs(x1-x2)或abs(y1-y2)
参考代码
1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 int solve(int x,int y){ 5 if(x-y>=0) return x-y; 6 return y-x; 7 } 8 signed main() 9 { 10 //freopen(".in","r",stdin); 11 //freopen(".out","w",stdout); 12 int x1,y1,x2,y2,a,b; 13 scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2); 14 if(abs(x1-x2)==18){ 15 a=18+y1-1+y2-1; 16 b=18+19-y1+19-y2; 17 } 18 else if(abs(y1-y2)==18){ 19 a=18+x1-1+x2-1; 20 b=18+19-x1+19-x2; 21 } 22 else if(x1==x2) a=solve(y1,y2); 23 else if(y1==y2) a=solve(x1,x2); 24 else a=solve(x1,x2)+solve(y1,y2); 25 if((a>b)&&(b!=0)) printf("%lld ",b); 26 else printf("%lld ",a); 27 return 0; 28 }
方法二:广度优先搜索(BFS)
参考代码
1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 queue<int>x,y,sum; 5 int vis[20][20],sx,sy,tx,ty,xx,yy,summ; 6 signed main() 7 { 8 //freopen(".in","r",stdin); 9 //freopen(".out","w",stdout); 10 scanf("%lld%lld%lld%lld",&sx,&sy,&tx,&ty); 11 if(sx==tx&&sy==ty){ 12 printf("0 "); 13 return 0; 14 } 15 x.push(sx),y.push(sy),sum.push(0); 16 while(!x.empty()){ 17 xx=x.front(),yy=y.front(),summ=sum.front(); 18 vis[xx][yy]=summ; 19 if(xx==1||xx==19){ 20 if(yy<19&&vis[xx][yy+1]==0) 21 x.push(xx),y.push(yy+1),sum.push(summ+1); 22 if(yy>1&&vis[xx][yy-1]==0) 23 x.push(xx),y.push(yy-1),sum.push(summ+1); 24 } 25 if(yy==1||yy==19){ 26 if(xx<19&&vis[xx+1][yy]==0) 27 x.push(xx+1),y.push(yy),sum.push(summ+1); 28 if(xx>1&&vis[xx-1][yy]==0) 29 x.push(xx-1),y.push(yy),sum.push(summ+1); 30 } 31 if(xx==sx&&yy==sy) vis[xx][yy]=1; 32 x.pop(),y.pop(),sum.pop(); 33 } 34 printf("%lld ",vis[tx][ty]); 35 return 0; 36 }
以上是关于qemu-user-static, 在x86机器上编译arm架构docker的主要内容,如果未能解决你的问题,请参考以下文章