在树莓派上直接安装openwrt系统时,使用4G内存时,之后只能占用20%左右,且CPU常年只会占用20%。比较浪费性能。可以考虑采用Docker部署Openwrt的方式,这样既满足要求,也能使用树莓派进行一些其他工作。

下载镜像

需要到官网下载镜像:[在树莓派上安装Ubuntu | Ubuntu](https://raspi.debian.net/tested-images/) 建议下载树莓派Ubunut服务器版本

然后下载软件:Raspberry Pi OS – Raspberry Pi

安装完成后,打开软件:

image-20220529155805897

首先要选择os,要选择自己刚刚下载的os,如下

image-20220529160123169

然后选择自己的SD卡,最后在执行write之前,需要先配置下ssh登录信息:

image-20220529160234852

然后配置下Enable SSH和设置用户名和密码

image-20220529160410260

最后再执行写入过程。写入完成后,插上SD卡和网线,然后等待30s左右,在路由器中查看树莓派对应的IP,就可以通过ssh登录树莓派了。

安装docker

切换源:

1
vim /etc/apt/sources.list

替换的内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy main restricted
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-updates main restricted
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy universe
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-updates universe
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy multiverse
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-updates multiverse
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-backports main restricted universe multiverse
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-security main restricted
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-security universe
deb http://mirrors.cloud.tencent.com/ubuntu-ports jammy-security multiverse

执行指令:

1
2
3
4
5
6
7
8
sudo apt update -y
sudo apt install docker.io -y
sudo systemctl enable docker
sudo systemctl start docker
# 将当前用户加入docker用户组
sudo gpasswd -a $USER docker
newgrp docker
sudo modprobe veth

可能会出现的问题:

报错:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

需要将当前用户加入docker用户组

安装OpenWrt in Docker

1. 开启网卡混杂模式

1
sudo ip link set eth0 promisc on

注意,上述指令在树莓派重启时会失效,需要将其添加到启动参数中,步骤如下:

  1. 首先需要新建一个/etc/rc.local并添加可执行权限

    1
    2
    
    sudo touch /etc/rc.local
    sudo chmod +x /etc/rc.local
    

​ 内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

ip link set eth0 promisc on
exit 0
  1. 添加systemd程序

    1
    
    sudo vim /etc/systemd/system/rc-local.service
    

    内容如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    [Unit]
     Description=/etc/rc.local Compatibility
     ConditionPathExists=/etc/rc.local
     After=network.target
    
    [Service]
     Type=forking
     ExecStart=/etc/rc.local start
     TimeoutSec=0
     RemainAfterExit=yes
    
    [Install]
     WantedBy=multi-user.target
    
  2. 启动systemd程序

    1
    2
    3
    
    sudo systemctl enable rc-local
    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    

然后重启树莓派,执行ifconfig,如果内容包括PROMISC则表示上述操作成功

image-20220529162048802

2. 安装Openwrt

创建网络

1
docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet

注意:subnet,gateway需要根据树莓派所处的网段进行修改,使用ifconfig命令,如果树莓派所处的网络在192.168.0.x网段内,则可以根据上述命令进行操作,如果在192.168.1.x网段内,则需要将192.168.0修改为192.168.1

可以使用docker network ls查看建立的网络

image-20220529162530234

macnet就是刚刚建立的网络。

拉取镜像:

1
2
3
arch # 查看系统内核架构,最好拉取和系统架构相符合的镜像
# 拉取镜像,可以从https://hub.docker.com/r/sulinggg/openwrt查看
docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8

启动镜像

启动命令如下

1
sudo docker run --restart always --name openwrt -d --network macnet --privileged registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8 /sbin/init

--restart always参数表示容器退出时始终重启,使服务尽量保持始终可用;

--name openwrt参数定义了容器的名称;

-d参数定义使容器运行在 Daemon 模式;

--network macnet参数定义将容器加入 maxnet网络;

--privileged 参数定义容器运行在特权模式下;

registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8为 Docker 镜像名,因容器托管在阿里云 Docker 镜像仓库内,所以在镜像名中含有阿里云仓库信息;

/sbin/init定义容器启动后执行的命令。

如果启动没有报错,则可以通过docker container ps -a看到我们刚刚启动的镜像

image-20220529163104932

但是如果启动失败了,报错如下

docker: Error response from daemon: failed to create the macvlan port: operation not supported.

则可以通过如下指令来解决这个问题

1
2
sudo apt install linux-modules-extra-raspi
sudo reboot

reboot后,可以通过执行docker container ps -a查看镜像是否启动成功。

修改容器相关参数

进入容器

1
docker exec -it openwrt bash

编辑OpenWrt的网络配置文件

1
vim /etc/config/network

修改lan的相关内容

1
2
3
4
5
6
7
8
config interface 'lan'
        option ifname 'eth0'
        option proto 'static'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option ipaddr '192.168.0.99' #修改一个静态地址,可以通过这个地址访问到树莓派
        option gateway '192.168.0.1' #修改为路由器地址
        option dns '192.168.0.1'     #修改为路由器地址

修改上述三项后,需要重启网络,指令如下:

1
/etc/init.d/network restart

配置OpenWrt

通过上述配置的ipaddr,访问树莓派控制页,用户名为:root,密码为:password

首先需要配置下OpenWrt的网络,网络->接口->LAN修改按钮

image-20220529163919016

基本设置中,勾选忽略此接口

image-20220529164006657

物理设置中,取消勾选桥接接口。【这个比较重要,要不然会导致无法上网】

image-20220529164111040

3. 将OpenWrt作为旁路路由

进入路由器后台,修改路由器默认网关和DNS服务器设置为树莓派静态IP

image-20220529164623141