RISC-V技术论坛
直播中

jf_84565653

1年用户 13经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[经验]

【昉·星光 2 高性能RISC-V单板计算机体验】在Docker 中运行 OpenWrt

【昉·星光 2 高性能RISC-V单板计算机体验】在Docker 中运行 OpenWrt

目标

采用在Docker中运行OpenWrt的方式,将开发板作为软路由。

获取固件

本来是打算自行编译的,但是在论坛里看到有网友编译好的固件,所以就直接拿来就用了。

编译固件

下载固件

  • 固件下载:
    https://share.weiyun.com/hxCyR6sI
    image-20240223171158717.png
  • 来源:https://forum.rvspace.org/t/visionfive2-v1-3b-openwrt-10/3275

传送固件

下载好以后,在主机上利用 scp 发送到开发板

scp openwrt-visionfive2-generic-visionfive2-ext4-sdcard.img.gz ubuntu@192.168.0.101:~

注意:文件路径和开发板ip请自行更改。

重新打包固件

解压固件

gzip -d openwrt-visionfive2-generic-visionfive2-ext4-sdcard.img.gz

# 重命名
mv openwrt-visionfive2-generic-visionfive2-ext4-sdcard.img opwnwrt.img

得到 .img 后缀文件

ubuntu@ubuntu:~$ ls
openwrt-visionfive2-generic-visionfive2-ext4-sdcard.img

也可以现在主机上解压好,再传入。

重新打包

新建挂载点

sudo mkdir /mnt/openwrt

启用nbd

sudo modprobe nbd

安装qemu-utils

sudo apt install -y qemu-utils

挂载镜像

sudo qemu-nbd -c /dev/nbd0 -f raw openwrt.img

查看分区

lsblk -f /dev/nbd0

这里需要 nbd0p4 分区,其他都可以忽略

NAME FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nbd0
├─nbd0p1
│
├─nbd0p2
│
├─nbd0p3
│    vfat   FAT16        649E-CEB9
└─nbd0p4
     ext4   1.0   rootfs ff313567-e9f1-5a5d-9895-3ba130b4a864    1.2G    16% /mnt/openwrt

挂载所需分区

sudo mount /dev/nbd0p4 /mnt/openwrt

# 查看挂载情况
ubuntu@ubuntu:~$ ls /mnt/openwrt
bin  etc   lib    lost+found  overlay  rom   sbin  tmp  var
dev  init  lib64  mnt         proc     root  sys   usr  www

创建压缩包

# 创建压缩包输出到~
sudo tar -czvf ~/openwrt.rootfs.tar.gz /mnt/openwrt/*

转换为docker镜像

cat openwrt.rootfs.tar.gz | sudo docker import - starfive2/openwrt

导入成功:

ubuntu@ubuntu:~$ sudo docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
starfive2/openwrt   latest    6588f57ace5b   11 seconds ago   247MB

创建容器

查看网卡名称

ifconfig -a
# 或者
ip addr

可以看到,两个网卡分别是 end0end1

image-20240223172848156.png

打开网卡混杂模式

sudo ip link set end0 promisc on 
sudo ip link set end1 promisc on

开启 IPV4转发

sudo vim /etc/sysctl.conf
# 取消注释
net.ipv4.ip_forward=1

如果需要ipv6也可以一并开启

image-20240223173454509.png

# 重新加载配置
sudo sysctl -p /etc/sysctl.conf

以旁路由形式接入已有网络

  • 优点:配置简单,仅需路由器一个网口,即使故障也不影响已有的网络及设备。
  • 缺点:可能会造成网络瓶颈。

网络拓扑

仅需一条网线,将路由器的任意lan口与开发的任意一个网口相连即可。

我这里选择外侧的网口,即 end0

配置网卡

sudo docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=end0 maclan

注意: --subnet--gateway 这里要根据你上级路由器的子网划分来修改。

例如:end0 分配到的 ip192.168.3.35,通常情况下请修改为 --subnet=192.168.3.0/24 --gateway=192.168.3.1

# 查看网卡情况
ubuntu@ubuntu:~$ sudo docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
25eba153ce4d   bridge    bridge    local
d31758ea4303   host      host      local
45c48221eac3   maclan    macvlan   local
ad74e12035d9   none      null      local

启动容器

sudo docker run --restart always --name openwrt -d --network maclan --privileged starfive2/openwrt /sbin/init

进入容器

sudo docker exec -it openwrt sh

修改网络配置

vi /etc/config/network

注意这里要根据你上级路由器的网段进行修改。

192.168.0.x 修改为自己的网段。ipaddr 可以指定为任意不冲突的地址。

config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd07:22db:4d69::/48'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ip6assign '60'
        option ipaddr '192.168.0.130'
        option netmask '255.255.255.0'
        option gateway '192.168.0.1'
        option broadcast '192.168.0.255'
        option dns '192.168.0.1'

重启网络

/etc/init.d/network restart

登录控制面板

通过同一网段下的任意主机,输入http://192.168.0.130 访问。即刚刚为 lan 设定的ip。

用户名和密码均为:root

注意及时修改密码。

image-20240224174046697.png

关闭DHCP

防止与主路由的DHCP 服务冲突。

选择 网络 - 接口 - 编辑 lan - DHCP 服务器 - 常规设置

勾选 忽略此接口

保存并应用。

image-20240224180617995.png

使用方式

单独应用于某个设备

比较推荐,就算开发板出问题,也不会影响整个网络。

以 iOS 为例:

手动设置

  • ip : 可以与原来一致
  • 子网掩码:255.255.255.0
  • 路由:192.168.0.130 (即旁路由的ip)
  • DNS:改为手动,填入 192.168.0.130
    image-20240224181141403.png

应用局域网内所有设备

开发板出问题,会影响整个网络,不算很推荐。

打开主路由管理面板,这里以普联路由器为例:

将网关与首选DNS都设成刚刚的lan口地址即可。image-20240225004550566.png

代替主路由接入已有网络

在进行下面的步骤之前,最好按照上面的方式,配置好lan口。

网络拓扑

按照下图连接好路由器。

光猫lan ---- 开发板 end1 (用作wan)

​ 开发板 end0 (用作lan)---- 之前的主路由器 lan (用作AP)

​ 之前的主路由器lan ----- 其他设备

配置网卡

注意:

  • 如果是光猫拨号上网,--subnet , gateway 需要与光猫分配的子网保持一致。
  • 如果是光猫桥接上网,原路由拨号,则与lan口分配的不一致即可。

查看:

ifconfig

# 我这里就是 192.168.1.X
end1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.38  netmask 255.255.255.0  broadcast 192.168.1.255

新建:

# 新建网卡
sudo docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=end1 macwan

# 挂载网卡
sudo docker network connect macwan openwrt

在接口中创建wan

输入http://192.168.0.130 访问控制面板。

网络 - 接口 - 添加新接口

  • 名称:wan
  • 协议:光猫拨号选 DHCP 协议 | 光猫桥接选 PPPoE
  • 设备:eth1

image-20240225010900543.png

保存并应用,如果是路由拨号,填写好账号密码后保存。

正常的话如下图:

image-20240225011410583.png

将原主路由设置为AP

关闭原主路由 DHCP 服务

以普联路由器为例,输入 http://192.168.0.1 访问主路由:

找到路由设置中的 DHCP 服务器,关闭并保存

image-20240225011700719.png

更改原主路由lan口地址

找到 LAN口设置

  • LAN口IP设置:手动
  • IP地址:如果更改为除192.168.0.1 以外的不冲突地址,例如我这里设置为 192.168.0.200
  • 子网掩码:255.255.255.0

注意:以后如果需要访问原主路由,需要键入http://192.168.0.200

保存即可。

image-20240225011832157.png

将软路由设置成主路由

开启LAN口 DHCP 服务

输入 http://192.168.0.130 访问控制面板

网络 - 接口 - 编辑 lan - 常规设置

将lan IPv4 地址修改为 192.168.0.1/24

image-20240225012537161.png

在DHCP 服务器的常规设置中

取消勾选忽略此接口

image-20240225012741337.png

保存并应用即可。

至此配置完成。

---- end ----

常见问题

宿主机可能无法联网

# 查看网络连接状况
ifconfig

# end0没有ipv4地址
end0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet6 xxxxxxxxx  prefixlen 64  scopeid 0x20<link>
        ether xxxxxxxxx  txqueuelen 1000  (Ethernet)
        RX packets 2620307  bytes 2239374342 (2.2 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3214847  bytes 3337392441 (3.3 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 78

给end0连上网

安装network-manager
sudo apt install network-manager
备份
# 备份原网络文件,****根据自己设备而定
sudo cp /etc/netplan/****.yaml /etc/netplan/****.yaml.bak
修改/etc/netplan/****.yaml
sudo vim /etc/netplan/****.yaml
network:
    renderer: NetworkManager
    ethernets:
      end0:
        dhcp4: no
        addresses:
          - 192.168.0.150/24 # 手动指定ip,网段要符合openwrt中lan口的设定
        routes:
          - to: default
            via: 192.168.0.1 # 注意修改
        nameservers:
          addresses: [192.168.0.1] # 注意修改
      end1:
        dhcp4: true


    version: 2
应用网络
# 检查
sudo netplan try

Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 110 seconds

# 检查无误,应用
sudo netplan apply
ifconfig

# 连接成功
end0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 192.168.0.150  netmask 255.255.255.0  broadcast 192.168.0.255

参考

https://www.cnblogs.com/luoshuifushen/p/16989469.html

https://mlapp.cn/376.html

更多回帖

发帖
×
20
完善资料,
赚取积分