树莓派docker运行openwrt-成功篇

缘起

接上一篇文章,在树莓派上使用docker时,遇到了创建bridge网络由于docker非常老不支持的情况。

因此这次又折腾更新最新版本docker,然后使用docker的方法。

ps:其实树莓派本身,直接运行openwrt是完全没有问题的,网上也很多教程,因此理论上docker运行是完全没有问题的。

折腾过程

安装最新版本的docker社区版本

docker官方由于各种变更的原因,软件名字从dockerdocker.iodocker.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就写局域网的路由器地址。

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://toplz.cn:444/?p=1853

https://www.right.com.cn/forum/thread-584050-1-1.html

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。