本帖最后由 阿曼 于 2022-8-25 10:26 编辑
前言
花了接近一周的时间终于将网心云部署到了树莓派4b上。也许有人会问:“怎么花了这么久?这不就是几条命令的事情吗?“
确实刚开始我也以为是几条命令的事情。先是在B站上偶然刷到打着“家中宽带也能挣钱”旗号的视频;先出于好奇开始尝试;从开始移动硬盘的”蜜汁丢失“,到“稳如狗”的 NAT/UPNP 未知状态,再是为openwrt开启UPNP,直到最后终于树莓派可以稳定在公网映射型并且 UPNP 处于可用状态。在此整理下这些遇到的坑,希望可以帮助大家节约点时间和精力。
选择操作系统
我手边正好有一台闲置的树莓派 4b 8GB 版本以及一块祖传的 2TB 机械硬盘。所以就考虑在树莓派上通过docker 的方式部署网心云。 很多人会建议直接将树莓派刷成网心云系统。我没有这样做主要是:
- 尝试给树莓派4b直接刷网心云系统不识别手上的机械硬盘。也尝试过另外一块 SSD 的移动硬盘同样没有成功。这两块都是通过移动硬盘盒自制的 USB 3.0 移动硬盘,也试过 U 盘,同样无法识别因此放弃。(有这样情况的同学千万不要放弃或者去采购其他的移动硬盘,白白多花了银子。)
- 其实选择docker 最主要还是希望树莓派在跑网心云的同时还可以跑些其他的应用( 如果直接刷网心云系统是没有办法访问系统的命令行登陆后台的 )
所以如果选择 docker 方式部署的话就要先选择一个靠谱的系统。这里遇到了此行的第一个“天坑”。。。因为对 ubuntu 比较熟悉,我选择了官方的22.04 64bit版本。 但是安装完成后遇到了一个至今没有想明白的问题:NAT 以及 UPNP 始终显示未知和不可用。我在同样的网络环境下有另外一台群晖,在群晖上尝试通过docker 部署网心云可以很顺利的拿到公网映射型的NAT和可用的 UPNP。期间花了很多时间在拨号路由器(openwrt)上进行排错,但是问题最终解决是放弃了ubuntu 而改用了 raspbian!
raspbian 的话也一定要选择 32bit 版本,因为 docker 目前并不支持它的 64 bit 版本。最后再嘱咐大家一句,千万千万千万不要在 openwrt 上部署网心云。我的经历是网心云的docker 镜像在 openwrt上可以跑,但是里面的很多任务无法成功运行或者是可以运行但是没有流量,会出现很多奇怪的问题!我花了好几天选择不同的 openwrt 镜像以及各种配置,但是最终都无法得到满意的效果。
移动硬盘挂载接下来我们需要解决的第二个坑就是移动硬盘的挂载。移动硬盘的挂载我遇到了各种奇葩问题:比如硬盘无法识别;或者可以识别但/dev/sda时不时会"飘成"/dev/sdb;或者是开始稳定但是运行一段时间后硬盘会随机从系统中消失。期间也想过再花钱买一块比较新 NVME 的硬盘但是最终找到了解决方案!
移动硬盘之所以会出现上面的情况其实罪魁祸手就是供电和 UAS!首先树莓派4b的几个 USB 接口据说可以提供 1.2A的电量。但是许多的移动硬盘盒需要花费1.4A 左右的电量,因此这里大家最好选择是独立供电的移动硬盘盒。我手上有一块几年前买的三星 EVO 850,上面的参数标称 1.4 A。。。跪了。。。
另外移动硬盘盒都带有 UAS 的功能,这个功能大致的意思就是在硬盘空闲时可以使其处于休眠的状态从而起到保护硬盘的作用。但是这个功能会导致硬盘时不时从系统中丢失的情况。所以我们需要通过以下方式将其关闭:
1.查看自己硬盘的信息. 其中 JMS578 就是系统识别的 USB 硬盘, 其 ID 号是 0080:a001
root@pi:~# lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 002: ID 0080:a001 Unknown JMS578 based SATA bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
2.编辑 /boot/cmdline.txt,在 console= 前添加:usb-storage.quirks=0080:a001:u
usb-storage.quirks=0080:a001:u console=serial0,115200 console=tty1 root=PARTUUID=dc77c2e2-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
3.完成后重启 PI 4.重启后可以尝试分区,格式化硬盘并挂载到 /etc/fstab,如果不放心的话可以再次重启确保每次系统启动后都可以看到硬盘自动挂载成功。这里提一下挂载最好用 UUID 的方式更加稳定: root@raspberrypi:~# blkid /dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="F021-066F" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="783657e4-01" /dev/mmcblk0p2: LABEL="rootfs" UUID="99f9cf68-e6fa-4b90-aeee-7fa3e9ed5c2d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="783657e4-02" /dev/sda: UUID="adc0b8fe-2b19-4954-99bc-069e7a3461c2" BLOCK_SIZE="4096" TYPE="ext4"
root@raspberrypi:~# cat /etc/fstab proc /proc proc defaults 0 0 PARTUUID=783657e4-01 /boot vfat defaults,flush 0 2 PARTUUID=783657e4-02 / ext4 defaults,noatime 0 1UUID=adc0b8fe-2b19-4954-99bc-069e7a3461c2 /mnt ext4 defaults,nofail 0 0
创建 macvlan官方建议网心云直接通过 host 方式运行。但是这里我选择跑 macvlan。因为 macvlan 下的每个 docker 容器都可以有一个内网的 IP地址。比如你的内网是 192.168.1.0/24, 这样每个 docker 都可以拿到一个 192 的地址而不是默认docker0 网络下的172 地址。这点也经过测试对于 NAT 和 UPNP 的判断也非常重要。而且 macvlan 也更加适合跑多个docker 的场景。 创建 macvlan的命令如下: docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 -o macvlan_mode=bridge macnet
这里我们假设网络是 192.168.1.0/24, 网关是 192.168.1.1,Pi的网卡是 eth0,创建完毕后记得将 Pi 的 eth0 设置为混在模式 - 在crontab 中添加:@reboot /usr/sbin/ifconfig eth0 promisc
路由器拨号和UPNP最后就是拨号路由器了!目前电信,联通和移动宽带默认都是不给公网IP的。具体情况每个地区不同,有的可以申请到,有的不行。大家可以联系自己当地的宽带师傅或者拨打客服进行询问。另外就是要路由器上的 UPNP 了,每个类型的路由器方法都不同但是大同小异,大家可以自行查找如何开启UPNP的方法。至此网心云应该可以顺利地在网络中跑起来了,初期可能需要初始化任务所以流量不会太高。只要在app中看到端口类型是公网映射型即可。如果有疑问欢迎讨论!
|