简介

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 的内容。

目标

  1. 将该设备配置为网关盒子,除路由功能外增加 DNS 解析和 Nginx 代理服务器,新增的配置通过容器实现
  2. Nginx 使用 nginxWebUI 组件,原计划用 NPM 容器。在 arm 架构下 NPM 容器在解压阶段使用超过了 9G 空间,导致空间不足无法使用。
  3. 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

  1. 下载对应的镜像文件
  2. 配置相关的目录用于保存信息
  3. 启动该镜像
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 管理界面。

  1. 查看【运行状态】
  2. 点击【反向代理】添加对应的域名和后端的服务器地址
  3. 进入【启用配置】先【检验文件】确保配置文件内容格式正确
  4. 选择【替换文件】然后在【启动 Nginx】

验证域名访问效果

docker-compose 配置使用扩展卡

将容器环境整合到扩展卡(SD卡)中,同时配置 docker-compose 运行环境,确保通过 docker-compose 加载容器配置文件。

R5S 的 CPU 显示是 ARMv8 ,在下载对应的 docker-compose 文件时选择 aarch64 架构的可执行文件

  1. 挂载 SD 卡,确保 openwrt 可访问识别
  2. 调整 docker 的配置文件,迁移已有的容器镜像内容
  3. 下载并安装 docker-compose 
  4. 验证 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 ,调整该值对应的配置即可

解决方案:

  1. 进入 nginxui 设置界面,找到 yunpan.lfang.me 对应的配置,增加高级配置项
  2. 进入【启用配置】栏,检查配置文件后,选择【替换文件】-【重新装载】



  • 无标签
写评论...