- 创建者: 虚拟的现实,上次更新时间:11月 18, 2024 需要 5 分钟阅读时间
简介
NanoPi R5S(简称”R5S”)是友善电子团队设计出品的一款双2.5G+千兆三网口的开发板, 它采用瑞芯微RK3568B2作为主控处理器, 配备2GB/4GB LPDDR4x内存,和8GB eMMC闪存,并支持TF卡启动和运行FriendlyWrt等系统。
R5S接口丰富,布局紧凑,主板尺寸只有90x62mm,可选配安装一体化CNC氧化铝外壳。它带有1个HDMI输出接口,可运行Android, Buildroot和Ubuntu桌面等系统,也可以用作极客喜欢的命令行模式;并且可解码播放4K60p H.265/H.264等格式视频。
R5S还带有1个M.2 NVME固态硬盘接口,和2个USB 3.0接口,并支持USB C口PD快充电源供。
提前参照官方说明刷入 FriendlyWRT 固件,默认使用 emmc 的空间(不知为啥我这显示 16G 的存储空间,实际应该是 32G 才对)该固件基于 openwrt 修改调整编译,后面相关的配置操作可以参考 openwrt 的内容。
目标
- 将该设备配置为网关盒子,除路由功能外增加 DNS 解析和 Nginx 代理服务器,新增的配置通过容器实现
- Nginx 使用 nginxWebUI 组件,原计划用 NPM 容器。在 arm 架构下 NPM 容器在解压阶段使用超过了 9G 空间,导致空间不足无法使用。
- DNS 解析通过 pihole 组件实现
配置 pihole 代替默认的 DNS
在 WRT 上禁用 ipv6 的 DHCP
uci -q delete dhcp.lan.dhcpv6 uci -q delete dhcp.lan.ra uci -q delete network.lan.ipv6 uci commit /etc/init.d/odhcpd stop /etc/init.d/odhcpd disable /etc/init.d/network restart
配置 macvlan 接口
修改 /etc/config/network 配置文件。其中 lan 接口是系统的默认配置,macvlan 相关的是新增配置
config interface 'lan' option device 'br-lan' option proto 'static' option ipaddr '192.168.2.1' option netmask '255.255.255.0' option ip6assign '60' config interface 'macvlan' option proto 'static' option defaultroute '0' option netmask '255.255.255.255' option device 'lan.20' option ipaddr '192.168.2.2' config device option type 'macvlan' option ifname 'br-lan' option mode 'bridge' option name 'lan.20' option acceptlocal '1' config route option interface 'macvlan' option target '192.168.2.3' option netmask '255.255.255.255'
调整防火墙的配置
配置文件是 vi /etc/config/firewall 。增加了 list network 'macvlan' 内容
config zone option name 'lan' list network 'lan' list network 'macvlan' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT'
重启网络和防火墙
/etc/init.d/network restart /etc/init.d/firewall restart
pihole.yml
services: pihole: container_name: pihole image: pihole hostname: pihole environment: TZ: 'Asia/Shanghai' WEBPASSWORD: 'Www.lfang123.com' volumes: - '/data/pihole/etc-pihole/:/etc/pihole/' - '/data/pihole/etc-dnsmasq.d/:/etc/dnsmasq.d/' - '/data/pihole/var-log/:/var/log' cap_add: - NET_ADMIN restart: unless-stopped networks: internal: lan: ipv4_address: 192.168.2.3 networks: internal: lan: name: lan driver: macvlan driver_opts: parent: lan.20 ipam: config: - subnet: 192.168.2.0/24
mkdir -p /data/pihole/etc-pihole/ mkdir -p /data/pihole/etc-dnsmasq.d/ mkdir -p /data/pihole/var-log/ mkdir -p /data/pihole/var-log/lighttpd chown 33:33 /data/pihole/var-log/lighttpd docker pull dockerpull.com/pihole/pihole #通过代理方式下载容器 docker compose -f pihole.yml up
调整配置文件
完成初始启动后,进入 /data/pihole/etc-pihole/ 调整配置文件
cd /data/pihole/etc-pihole sed -i -e 's/REV_SERVER.*//; s/REV_SERVER_CIDR.*//; s/REV_SERVER_TARGET.*//; s/REV_SERVER_DOMAIN.*//; s/PIHOLE_INTERFACE.*//' setupVars.conf echo 'REV_SERVER=true REV_SERVER_CIDR=192.168.2.0/24 REV_SERVER_TARGET=127.0.0.11 REV_SERVER_DOMAIN=lan PIHOLE_INTERFACE=eth0' >> setupVars.conf docker compose -f pihole.yml restart
测试和验证
ping 192.168.2.3 nslookup pihole.lan 192.168.2.3 nslookup openwrt.org 192.168.2.3
配置 DNS 和 DHCP 设置
调整内网的 DHCP 设置中的 DNS 项,对于的配置文件 vi /etc/config/dhcp 。在该文件中增加 dhcp_option ,对应的 DNS 服务器是 192.168.2.3
config dhcp 'lan' option interface 'lan' option start '100' option limit '150' option leasetime '12h' option dhcpv4 'server' option ra_slaac '1' list ra_flags 'managed-config' list ra_flags 'other-config' list dhcp_option '6,192.168.2.3'
解决内网 IP 无法上网故障
原因:macvlan 配置了 192.168.2.2 的 IP 地址,pihole 的容器默认路由使用 192.168.2.1 地址,该地址在容器环境中无法通讯,需要调整默认路由为 192.168.2.2
docker exec -it pihole /bin/bash ip route ip route change default via 192.168.2.2 dev eth0
nginxWEBui 实现代理访问
openwrt 默认配置 uhttp 实现 web 访问,当然也可以重新编译整合 Nginx 组件。一方面每次升级都需要重新编译一次,另一方面标准的 Nginx 没有图形管理界面,在操作执行上不太方便。通过 nginxWEBui 组件实现 GUI 方式的管理操作新增反向代理的一些操作可以直接通过 web 页面实现。
如果是 X86 的环境推荐使用 NPM 组件,更成熟更方便,但是 NPM 在 arm 架构下空间占用巨大,推测应该是基于标准的 Linux 系统构建的,在 OpenWRT 这样的简化环境中需要加载更多的层和对应的环境资源。
调整 OpenWRT 的 web 页面
最终实现的效果是通过外网的 IP 地址解析到 Nginx 服务实现按不同的域名访问对应的后端网站,因此需要调整 OpenWRT 内网启用的80端口(其实也可以不用调整,为了方便检查和避免误会这里将80端口调整为8001)。配置文件是 vim /etc/config/uhttpd
调整后需要重启 uhttpd 服务
映射外网端口
如果实现外网(这里的外网是相对于 OpenWRT 的 WAN 口来说)按域名访问,先要确保 80 端口能被正常解析。OpenWRT 的端口映射非常简单。完成映射后确保输入外网的 IP + 对应的端口能够正常访问。如果无法正常访问可以通过内网的 PC 访问确定 web 服务是否正常。
配置 NginxWebUI
- 下载对应的镜像文件
- 配置相关的目录用于保存信息
- 启动该镜像
docker pull registry.cn-hangzhou.aliyuncs.com/cym19871102/nginxwebui:latest docker run -itd -v /data/nginxui:/home/nginxWebUI -e BOOT_OPTIONS="--server.port=8080" --net=host --restart=always nginxwebui
如果是内外直接访问 http://192.168.2.1:8080 即可打开 Nginx 的 web 管理界面。输入注册用户名和密码登录后打开 web 管理界面。
- 查看【运行状态】
- 点击【反向代理】添加对应的域名和后端的服务器地址
- 进入【启用配置】先【检验文件】确保配置文件内容格式正确
- 选择【替换文件】然后在【启动 Nginx】
验证域名访问效果
docker-compose 配置使用扩展卡
将容器环境整合到扩展卡(SD卡)中,同时配置 docker-compose 运行环境,确保通过 docker-compose 加载容器配置文件。
R5S 的 CPU 显示是 ARMv8 ,在下载对应的 docker-compose 文件时选择 aarch64 架构的可执行文件
- 挂载 SD 卡,确保 openwrt 可访问识别
- 调整 docker 的配置文件,迁移已有的容器镜像内容
- 下载并安装 docker-compose
- 验证 docker-compose 和 挂载的 SD 内容
挂载 SD 卡
可以将 SD 卡 插入 R5S 的卡槽,然后通过磁盘指令完成磁盘的分区和格式化。详细的分区格式操作可以参考 Photon 虚拟机调整硬盘容量。
项目 | 描述 |
---|---|
容量 | 32G |
分区格式 | btrfs |
挂载目标 | /data1 |
设备名称 | /dev/mmcblk0 |
配置 docker-compose
通过 opkg 方式安装 docker-compose 组件比较繁琐,组件的依赖性比较高。可以直接通过下载相关版本的方式安装。需要注意的是请确保 docker 的版本大于 24。
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker} mkdir -p $DOCKER_CONFIG/cli-plugins curl -SL https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-aarch64 -o $DOCKER_CONFIG/cli-plugins/docker-compose chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose docker compose version
调整容器镜像文件存放位置
容器的配置文件是 /etc/docker/daemon.json ,这里面有记录容器镜像的存储路径,可以直接修改配置文件也可以通过 GUI 的界面完成调整。详细的 openwrt 容器配置文件内容可以参考官网的说明
1、通过 rsync 备份原有的数据
opkg install rsync mkdir /data1/docker service dockerd stop rsync -r -avz /opt/docker /data1/docker mv /opt/docker /opt/docker.old service dockerd start
2、调整容器镜像的存储位置
有2种方式,一是可以直接在 GUI 界面调整,也可以直接在 CLI 的命令行界面调整,如下图所示。
root@R5S_WRT:/data/pihole# cat /etc/docker/daemon.json { "registry-mirrors": ["https://hub.rat.dev"], "data-root": "/data1/docker" }
3、重启容器服务并验证
Seafile 配置
seafile-pro 11.06 在 ARM 环境(4核+4G)能够正常运行。从测试的情况看(单用户访问)速度和响应相比 X86 要慢一些,当然也可能是 Seafile 的存储使用 SD 卡的原因导致。Seafile ARM 版本的 IDA 可以参照原有的方式处理。
需要注意:elasticsearch:8.6.2 这个容器在 ARM 环境无法正常运行,应该和 ARM 架构有关,后续有时间再研究。
seafile.yml
version: '3.0' services: db: image: mariadb:10.6 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=password # Requested, set the root's password of MySQL service. - MYSQL_LOG_CONSOLE=true volumes: - /data1/seafile/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store. networks: - seafile-net memcached: image: memcached:1.6.18 container_name: seafile-memcached entrypoint: memcached -m 256 networks: - seafile-net seafile: image: docker.seafile.top/seafileltd/seafile-pro-mc:11.0-latest container_name: seafile ports: - "8002:80" volumes: - /data1/seafile/data:/shared - /data1/seafile/deps/seafile-controller:/opt/seafile/seafile-pro-server-11.0.16/seafile/bin/seafile-controller - /data1/seafile/deps/seaf-server:/opt/seafile/seafile-pro-server-11.0.16/seafile/bin/seaf-server - /data1/seafile/deps/licenseparse.py:/opt/seafile/seafile-pro-server-11.0.16/seahub/seahub/utils/licenseparse.py environment: - DB_HOST=db - DB_ROOT_PASSWD=password - TIME_ZONE=Asia/Shanghai - SEAFILE_ADMIN_EMAIL=13609796771@139.com - SEAFILE_ADMIN_PASSWORD=password - SEAFILE_SERVER_LETSENCRYPT=false - SEAFILE_SERVER_HOSTNAME=yunpan.lfang.me depends_on: - db - memcached networks: - seafile-net networks: seafile-net:
常见问题
问题1:opkg 更新和安装提示 wget (8) 错误
解决方法:将源调整为 openwrt 的官方源 /etc/opkg/distfeeds.conf
# # Use the following command to switch to the default source: # sed -i -e 's/mirrors.ustc.edu.cn\/openwrt/downloads.openwrt.org/g' /etc/opkg/distfeeds.conf # opkg update # src/gz openwrt_base https://downloads.openwrt.org/releases/23.05.5/packages/aarch64_cortex-a53/base src/gz openwrt_luci https://downloads.openwrt.org/releases/23.05.5/packages/aarch64_cortex-a53/luci src/gz openwrt_packages https://downloads.openwrt.org/releases/23.05.5/packages/aarch64_cortex-a53/packages src/gz openwrt_routing https://downloads.openwrt.org/releases/23.05.5/packages/aarch64_cortex-a53/routing src/gz openwrt_telephony https://downloads.openwrt.org/releases/23.05.5/packages/aarch64_cortex-a53/telephony src/gz friendlywrt_packages file://opt/packages
问题2:切换到 data1/docker 目录后,原有的镜像查询为空
解决方案:未具体定位,推测是 overlay 在 openwrt 中的挂载问题。重新下载镜像处理。
问题3:大文件60M云盘上传一直停留在 5%
原因:默认情况下 Nginx 的上传限制为 1m ,调整该值对应的配置即可
解决方案:
- 进入 nginxui 设置界面,找到 yunpan.lfang.me 对应的配置,增加高级配置项
- 进入【启用配置】栏,检查配置文件后,选择【替换文件】-【重新装载】
- 无标签
0 评论