明日复明日,明日何其多。
我生待明日,万事成蹉跎。

了解:docker和qemu模拟器

从恩山看到一篇文章,转过来,主要想学习一下他提到的相关知识。


0x01 qemu模拟器

本帖隐藏的内容

甜糖目前只有ARM 架构的程序,ARM 架构的程序无法直接在 x86 架构计算机上运行,目前的处理思路都是用qemu-user-static模拟,这就需要开启 Linux 内核的 binfmt 功能,该功能可以让 Linux 内核在检测到 ARM、MIPS 等架构的程序时,自动调用 qemu-user-static。开启该功能,并且注册 qemu-user-static 虚拟机后,运行 ARM 程序就和运行 x86 程序一样,对用户来说毫无差别。在一般的教程中开启这个功能都是用下面的代码

  1. docker run –rm –privileged multiarch/qemu-user-static –reset -p yes

复制代码

这样确实可以,但是有个问题,就是系统重启后就必须手动运行一次,再开启甜糖的docker,比较麻烦,虽然也可以放到系统服务中,但是每次都跑个docker来开启这个功能也不优雅,其实开启这个功能有一个官方脚本
https://github.com/qemu/qemu/blob/master/scripts/qemu-binfmt-conf.sh
这个脚本的基本用法是

  1. #wget https://raw.githubusercontent.com/qemu/qemu/master/scripts/qemu-binfmt-conf.sh –no-check-certificate
  2. wget https://cdn.jsdelivr.net/gh/qemu/qemu/scripts/qemu-binfmt-conf.sh –no-check-certificate
  3. ./qemu-binfmt-conf.sh –qemu-path /usr/bin –qemu-suffix -static –systemd aarch64

复制代码

运行完这个,每次机器自重启的时候都会自动注册aarch64的模拟器,路径是/usr/bin/qemu-aarch64-static,这是对于带systemd的系统(比如debian,ubuntu),其他系统要自己研究一下。
其实这条命令就是在/etc/binfmt.d下增加了一个文件qemu-aarch64.conf,内容是

  1. :qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:

复制代码

感兴趣的可以自己研究一下,每次系统启动systemd-binfmt.service服务都会读这个配置文件,注册对应的模拟器。
qemu-aarch64-static大家需要从这里https://github.com/multiarch/qemu-user-static/releases/下载,下一步要用到

  1. cd /usr/bin/
  2. wget https://github.com/multiarch/qemu-user-static/releases/download/v5.1.0-5/qemu-aarch64-static –no-check-certificate
  3. chmod 755 qemu-aarch64-static

复制代码

0x02 docker上场
一般只要你用x86设备,估计都是有点追求的,都是想多开的,为了让每个容器都有自己独立的IP和mac地址,需要用到macvlan,
有关macvlan的知识我建议大家看看某404网站的大神的视频,讲得非常好,https://youtu.be/jXMgAz_GQxI


下面直接上代码
第一步创建macvlan,subnet就是你的子网的网段,gateway就是你的路由器的ip,parent就是你的网口的名字(可以运行ip addr查看),我说的情况是跑docker的宿主机不是路由器,在路由器上跑docker的都是高手,应该也轮不到我来告诉你怎么操作。

  1. docker network create -d macvlan –subnet=192.168.2.0/24 –gateway=192.168.2.88 -o parent=ens18 -o macvlan_mode=bridge macnet

复制代码

第二步创建容器

  1. docker run -itd \
  2.   -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
  3.   -v /srv/dev-disk-by-label-ttnode/ttnode1:/mnts \
  4.   –name ttnode \
  5.   –net=macnet –ip=192.168.2.29 –dns=114.114.114.114 –mac-address B3:F1:9C:C5:A2:95 \
  6.   –privileged=true \
  7.   –restart=always \
  8.   ericwang2006/ttnode

复制代码

注意每个容器的ip和mac不能相同,不能相同,不能相同,这样你喜欢创建几个实例就创建几个实例。

第二行usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static不能少,不能少,不能少,左侧是你宿主机的路径,右侧是容器路径。

第三行-v /srv/dev-disk-by-label-ttnode/ttnode1:/mnts,左侧是数据存储的路径,不同的实例要用不同的路径


有关这个docker的具体使用方法大家可以参考我的另外一个帖子 https://www.right.com.cn/forum/thread-4059329-1-1.html

0x03 UPNP不能用
帮人帮到底,给个一键获取端口的脚本吧

  1. netstat -tnlp|grep -v ‘127\|Proto\|Active’|awk ‘{print $4}’|sed ‘s/0.0.0.0://’

复制代码

————————————————————————————————
如果不出意外的话,你会发现你创建的实例网络都是未配置的,原因就是upnp不起作用,需要自己做端口映射,
我们进入容器,运行下面的命令,

QQ截图20201111012836.jpg (63.61 KB, 下载次数: 7)

下载附件  保存到相册

2020-11-11 01:28 上传


注意把后面带LISTEN的,监听的还不是127.0.0.1的端口找出来,一般就是3个,把这个3个端口都映射到容器的ip上,包括TCP和UDP
怎么进入容器运行命令和路由器端口映射我就不说了,都是基础知识。
做完端口映射一般网络就是优质网络了。


0x04 查找自己的ID

进入容器运行以下命令

  1. # /usr/node/ttnode -p /mnts
  2. 2020-11-11 10:36:10.817 getmac C2D23BB4A254 from /sys/class/net/eth0
  3. uid = 6960fdf1ffe40519333f719671af34b2
  4. 2020-11-11 10:36:10.878 node [6960fdf1ffe40519333f719671af34b2,/mnts] exist,error = 11
  5. #

复制代码

注意uid后面的那个guid  6960fdf1ffe40519333f719671af34b2,这个就是你的id,把6960fdf1ffe40519333f719671af34b2生成二维码,用甜糖app扫描添加iu可以了。

赞(0) 打赏
未经允许不得转载:致明日 » 了解:docker和qemu模拟器
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

坚持,总会看见蓝天和白云

联系我们你来了,你就是最棒的!

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏