【昉·星光 2 高性能RISC-V单板计算机体验】在Docker 中运行 OpenWrt
目标
采用在Docker中运行OpenWrt的方式,将开发板作为软路由。
获取固件
本来是打算自行编译的,但是在论坛里看到有网友编译好的固件,所以就直接拿来就用了。
编译固件
略
下载固件
- 固件下载:
https://share.weiyun.com/hxCyR6sI
- 来源: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
可以看到,两个网卡分别是 end0
和 end1
打开网卡混杂模式
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也可以一并开启
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
分配到的 ip
为 192.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
option device
option proto
option ipaddr
option netmask
config globals
option ula_prefix
config device
option name
option type
list ports
config interface
option device
option proto
option ip6assign
option ipaddr
option netmask
option gateway
option broadcast
option dns
重启网络
/etc/init.d/network restart
登录控制面板
通过同一网段下的任意主机,输入http://192.168.0.130
访问。即刚刚为 lan
设定的ip。
用户名和密码均为:root
注意及时修改密码。
关闭DHCP
防止与主路由的DHCP 服务冲突。
选择 网络
- 接口
- 编辑 lan
- DHCP 服务器
- 常规设置
勾选 忽略此接口
保存并应用。
使用方式
单独应用于某个设备
比较推荐,就算开发板出问题,也不会影响整个网络。
以 iOS 为例:
手动设置
- ip : 可以与原来一致
- 子网掩码:255.255.255.0
- 路由:192.168.0.130 (即旁路由的ip)
- DNS:改为手动,填入 192.168.0.130
应用局域网内所有设备
开发板出问题,会影响整个网络,不算很推荐。
打开主路由管理面板,这里以普联路由器为例:
将网关与首选DNS都设成刚刚的lan口地址即可。
代替主路由接入已有网络
在进行下面的步骤之前,最好按照上面的方式,配置好lan口。
网络拓扑
按照下图连接好路由器。
光猫lan ---- 开发板 end1 (用作wan)
开发板 end0 (用作lan)---- 之前的主路由器 lan (用作AP)
之前的主路由器lan ----- 其他设备
配置网卡
注意:
- 如果是光猫拨号上网,
--subnet
, gateway
需要与光猫分配的子网保持一致。
- 如果是光猫桥接上网,原路由拨号,则与lan口分配的不一致即可。
查看:
ifconfig
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
保存并应用,如果是路由拨号,填写好账号密码后保存。
正常的话如下图:
将原主路由设置为AP
关闭原主路由 DHCP 服务
以普联路由器为例,输入 http://192.168.0.1
访问主路由:
找到路由设置中的 DHCP 服务器,关闭并保存
更改原主路由lan口地址
找到 LAN口设置
- LAN口IP设置:手动
- IP地址:如果更改为除
192.168.0.1
以外的不冲突地址,例如我这里设置为 192.168.0.200
- 子网掩码:255.255.255.0
注意:以后如果需要访问原主路由,需要键入http://192.168.0.200
保存即可。
将软路由设置成主路由
开启LAN口 DHCP 服务
输入 http://192.168.0.130
访问控制面板
在 网络
- 接口
- 编辑 lan
- 常规设置
中
将lan IPv4 地址修改为 192.168.0.1/24
在DHCP 服务器的常规设置中
取消勾选忽略此接口
保存并应用即可。
至此配置完成。
---- end ----
常见问题
宿主机可能无法联网
ifconfig
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
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