树莓派docker运行openwrt-成功篇
缘起
接上一篇文章,在树莓派上使用docker时,遇到了创建bridge网络由于docker非常老不支持的情况。
因此这次又折腾更新最新版本docker,然后使用docker的方法。
ps:其实树莓派本身,直接运行openwrt是完全没有问题的,网上也很多教程,因此理论上docker运行是完全没有问题的。
折腾过程
安装最新版本的docker社区版本
docker官方由于各种变更的原因,软件名字从docker
到docker.io
到docker.engine
发展了很多版本,但目前都是老的不维护的,最新的docker是docker.ce
(即社区开源版本)
安装方法如下,参考https://docs.docker.com/engine/install/debian/:
# 删除老版本的docker sudo apt-get remove docker docker-engine docker.io containerd runc #安装依赖 sudo apt-get install ca-certificates curl gnupg lsb-release # 增加gitlab的source curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装docker sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
至此,最新版本的docker已经安装完成。
创建docker的桥接网卡
在真实开始前,需要创建macvlan网卡,用来给openwrt使用,这样的话docker内的openwrt可以连接到局域网,否则是无法对局域网提供路由器的。
使用如下步骤操作:
1、开启混杂模式(这里的eth0根据实际网卡改动)
sudo ip link set eth0 promisc on
2、创建macvlan
sudo docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet
这里的eth0是物理网卡,subnet写和局域网一样的网段,gateway就写局域网的路由器地址。
更新于240503
经过测试wifi网卡是不支持macvlan的
docker运行官方openwrt镜像
openwrt官方提供了rootfs的docker镜像,参考https://github.com/openwrt/docker,因此使用如下的命令,就可以运行了:
sudo docker run --restart always --name armvirt-32 -d --network macnet --privileged openwrtorg/rootfs:armvirt-32 /sbin/init
大家可能注意到了,这里使用的并不是arm架构,而是armvirt-32
架构,这个是通用的arm虚拟架构,经过验证在树莓派上是可以运行的。
究其原因,是openwrt官方不提供arm32位架构的运行了,如果系统是64位的,可以使用aarch64_generic
架构
docker导入官方/自编译的rootfs镜像
可以使用如下的docker命令,把某个版本的release导入到docker然后运行(因为通过openwrtorg/rootfs
运行的不是release版本,而是日常版本)
sudo docker import https://downloads.openwrt.org/releases/21.02.2/targets/armvirt/32/openwrt-21.02.2-armvirt-32-default-rootfs.tar.gz openwrt-21.02.2-armvirt-32-default-rootfs
然后运行方式和上一步一样,只不过运行docker容器变成openwrt-21.02.2-armvirt-32-default-rootfs
这里也参考其他博文的说法,docker镜像是一个没有内核的rootfs
,也确实是这样的,相当于是openwrt的各种文件,没有引导,没有内核而已,所以直接导入官方的rootfs就可以跑了。
注意:askfirst高cpu占用问题解决
最近发现采用导入官方的rootfs运行docker的方式,存在cpu非常高占用的情况,通过ps发现是/sbin/askfirst /usr/libexec/login.sh
在狂占cpu,通过strace看到一直在死循环的打印按任意键进入shell的语句,如下:
writev(1, [{iov_base="Please press Enter to activate t"..., iov_len=44}, {iov_base="\n", iov_len=1}], 2) = 0
经过网上搜索,没看到具体原因,但看到一个解决方法,可以进入docker后,进行如下操作:
vi /etc/inittab 注释后边三条带askfirst的项目 #ttyAMA0::askfirst:/usr/libexec/login.sh #ttyS0::askfirst:/usr/libexec/login.sh #hvc0::askfirst:/usr/libexec/login.sh reboot
重启后就正常了,猜测是docker运行哪里的shell环境不对导致。
设置openwrt
运行起来后,openwrt默认的ip地址是不对的,需要通过如下命令进入到命令行进行设置:
sudo docker exec -it 0da67f60a6
其中0da67f60a6
是docker的id,可以使用命令sudo docker ps -a
查看。
进入后,通过如下命令进行网络设置:
vi /etc/config/network # 设置正确的局域网ip地址 # 保持文件后退出 # 重启生效 reboot
通过网络访问openwrt
至此我们已经可以通过网页访问设置的ip地址,然后进行其他的设置了,比如网关、dns等,至此已经安装完成了。
列举一个设置中文的安装包:
opkg update opkg install luci-i18n-base-zh-cn
总结
测试下来,树莓派运行openwrt的docker,性能上比qemu要好太多了,目前看能够完全跑满树莓派3b的100M网卡带宽的,达到了预期的目的。
参考文档
https://docs.docker.com/engine/install/debian/
https://blog.isayme.org/posts/issues-65/
https://touchren.pub/2020/11/16/openwrt-in-docker/
https://www.right.com.cn/forum/thread-958173-1-1.html
https://downloads.openwrt.org/snapshots/targets/armvirt/32/
https://www.bgegao.com/2020/02/1570.html
https://github.com/openwrt/docker
https://openwrt.org/docs/guide-user/virtualization/docker_openwrt_image
https://www.right.com.cn/forum/thread-584050-1-1.html
发表评论