R86S 万兆版折腾日志

发表于 2022-05-01   |   分类于 Openwrt   |   访问: 9,687 次

前几天整了台 R86S 万兆版来当软路由,图的是这玩意儿够小并且有光口,这样就能自己整个猫棒多合一了。

R86S 评价

先说说 R86S 万兆版的一些小遗憾:

  1. 首先不支持扩展 NVME。其实这东西还有一个 PCIE x1 的空口。但是由于位置有限所以不能再加一个 NVME 了。不过讲道理 PCIE x1 性能也有限,应该带宽跟内置的 EMMC 差不多(具体没看这个 EMMC 的吞吐)。不过存储颗粒这种东西寿命有限而且很看蓝,还是希望能自行更换扩展的。128G 对于一个小的软路由而言倒是够用,而且有 USB 3.1 接口(具体带宽不知道,应该是还是只有 3.0),扩展也不是太难。
  2. 发热严重。这玩意儿发热其实挺严重的,对比之前的软路由(8605)而言,热太多了。虽然有主动散热,但是无济于事。目前应该 60 - 80 摄氏度左右。虽然对它自己没什么影响,但是插拔接口时候摸上去还是太烫手了。
  3. 万兆网卡坑。虽然有个万兆光口,但是这个光口出了名的坑。版本千奇百怪,兼容性差。SFP+ 的万兆网卡是不支持 2.5G 的,只能掉到千兆。但它本身又是 2.5G 的 RJ85 口,掉到千兆又太可惜了。目前还没有找到魔改 2.5G 的驱动,只能说有空时候看看了。驱动是内核的 mlx4。
  4. 网口有限,需要交换机。当然如果一堆 2.5G 网口那成本和体积必然会上来的。这也无可厚非。只能再多买一个 2.5G 交换机了(目前还很贵),不能真正多合一。
  5. 接口标注有点不太清晰:Eth0 是千兆口,Eth1,2 是 2.5G 口。两个光口,右边是主口左边是副口(也就是说在系统中右边的口编号会比左边小/少后缀)。

规划

首先规划一下使用。PVE 作为主系统。不用 ESXI 是因为我更熟悉折腾 Debian 系的 Linux。然后 PVE 可以安装各种虚拟机了。首先需要 OpenWRT 作为路由系统。这里我选择使用 LXC 形式安装,性能更好而且没有直通的烦恼。当然 LXC 不用网桥依然会独占整个设备的,所以感知不强。但是 LXC 少跑一个内核、少了层虚拟层、驱动由强大的 Debain 宿主管理,还是方便太多了。然后例牌装个 LXC 的 Privileged 的 Ubuntu 用来跑点 docker 服务。

PVE 安装 ^1

  1. 下载 PVE ISO 镜像,然后使用 RUFUS 给 U 盘制作启动盘。注意如果有弹窗的话使用 DD 模式。
  2. 目前 PVE 还不能识别 EMMC(因为会不断写入日志所以对 EMMC 损耗比较大目前 PVE 官方还没正式支持 EMMC 安装,所以 万兆 + NVME 什么时候能有啊啊),所以 BIOS 首页面狂按 F7 选 U 盘启动后,安装时候选择 Debug 模式。
  3. Debug 模式下,第一次进入 shell 时候直接退出 shell 让它继续安装,第二次进入 shell 之后,编辑 /usr/bin/proxinstall 脚本(pve8 下是 /usr/share/perl5/Proxmox/Sys/Block.pm),然后修改:
     } elsif ($dev =~ m|^/dev/[^/]+/hd[a-z]$|) {
         return "${dev}$partnum";
     } elsif ($dev =~ m|^/dev/nvme\d+n\d+$|) {
         return "${dev}p$partnum";
    +  } elsif ($dev =~ m|^/dev/mmcblk\d+$|) {
    +      return "${dev}p$partnum";
     } else {
         die "unable to get device for partition $partnum on device $dev\n";
     }

    退出 shell 即可继续安装。

  4. 继续安装时候,选择安装到 EMMC 上,Option 设置 swap 大小为 0 减少 swap 分区对 EMMC 损耗(反正我内存够大)。如果这时候安装失败(提示 EMMC 失败)的话,跑个 live 系统用脚本重置 EMMC 分区表。
  5. 安装成功之后,还会进入一次 shell,直接拔掉 U 盘然后退出即可。重启就能进入 PVE 系统了。

安装 LXC 版 Openwrt ^2

  1. 从 openwrt 官方下载 rootfs.tar.gz 直接导入 PVE 的 templates 中(可以下载导入功能)。

  2. 由于 PVE 默认不认 openwrt,所以无法从 uci 中创建容器。进入 PVE 的 shell,然后手动 cli 创建:

    pct create 100 local:vztmpl/openwrt-21.02.3-x86-64-rootfs.tar.gz --rootfs local-lvm:8 --ostype unmanaged --hostname Openwrt --arch amd64 --memory 2048 --swap 0 -net0 bridge=vmbr0,name=eth0

    其中 100 为 vmid;*-rootfs.tar.gz 为上传的 template 的文件名;:8 表示 rootfs 的大小为 8G;-net0 bridge=vmbr0,name=eth0 表示把容器内的 eth0 给桥接到 vmbr0 上;剩下的都很显然。不过需要注意这里的 ostype 不能省略。

  3. 编辑文件 /etc/pve/lxc/100.conf,追加以下行:

    features: mknod=1,nesting=1
    lxc.include: /usr/share/lxc/config/openwrt.common.conf
    lxc.cgroup.devices.allow: c 108:0 rwm
    lxc.mount.entry: /dev/ppp dev/ppp none bind,optional,create=file
    lxc.net.1.type: phys
    lxc.net.1.link: enp4s0
    lxc.net.1.flags: up
    lxc.net.2.type: phys
    lxc.net.2.link: enp2s0
    lxc.net.2.flags: up
    lxc.net.3.type: phys
    lxc.net.3.link: enp3s0
    lxc.net.3.flags: up
    lxc.net.4.type: phys
    lxc.net.4.link: enp4s0d1
    lxc.net.4.flags: up

    这里我把 eth0 以外的口都给「直通」给了容器(其实是共享了设备文件),并且允许容器使用 major=108,minor=0 的设备,这个设备其实是 ppp 设备(ls -l /dev/ppp 就能看到了)。另外引入了 openwrt.common.conf,这个是 PVE 给 openwrt 的一些通用配置。

  4. 然后启动容器就能访问 192.168.1.1 了。

  5. 检查一下内核版本如果是 5.15+,并且发现 firewall 没有任何条目,这是 firewall 的一个 bug。具体可以看这封邮件这个包加上了这封邮件的提交。装上即可。

  6. 拨 PPPoE 时候,我的猫棒使用的是透明 vlan 模式,所以需要在 openwrt 里指定 vlan。具体做法是在添加 PPPoE 接口时候手动输入物理接口:iface.vlan。广东电信的上网 vlan 是 41、IPTV 是 45。另外如果拨号 IPTV 时候,由于电信不响应 LCP echo,所以需要关掉它。具体做法是在加入 option keepalive '0 5'

  7. 目前我的猫棒在一段时间零流量的情况下,会自动 ifdown 掉。需要设置手动猛 ping 它。这里写了个 init.rc

    #!/bin/sh /etc/rc.common
    # Ping pon stick
    START=99
    STOP=99
    
    start() {
            ping 192.168.0.1 >/dev/null 2>&1 &
            echo $! > /var/run/ping_stick.pid
    }
    
    stop() {
            if [ -f /var/run/ping_stick.pid ]; then
                    kill -9 $(cat /var/run/ping_stick.pid)
                    rm -f /var/run/ping_stick.pid
            fi
    }
  8. 不知为何我的 dnsmasq 在使用 smartdns 之后,它的 DHCP 不会广播 DNS 了,这里手动给 br-lan 设置一个:6,192.168.1.1

已有 2 条评论


  1. 白鲨

    按你的方法在proxinstall文件中加入+ } elsif ($dev =~ m|^/dev/mmcblk\d+$|) {

    return "${dev}p$partnum";(+号是不用加入的吧)还是安装不了,我用的是7.2的版本。
    白鲨  May 6th, 2022 at 03:38 am回复
  2. H@rry

    你不如直接装个功能强点的openwrt docker都带上了 pve在中间夹生着意义不大 除了造成额外发热

    H@rry  May 21st, 2022 at 12:19 am回复

发表新评论

© 2024 Powered by Typecho & Theme Quark
粤ICP备17055048号