博客¶
VR 对现实的影响
2024 年 10 月 27 日,我终于实现了很久以来的一个心愿——在现实中打一场乒乓球,以此检验我在 VR 里打了 4 个多月球后的水平(我在游戏中目前分数为 1848)。 Eleven Table Tennis
L3 负载均衡实现网速叠加
- 公司有 wifi 和 网线接入。但是每条链路都严格限制成了 8 Mbps 的速度。
- 同时连接 wifi 和 网线,修改路由表,让不同目的地址走不同链路,再结合 aria2c 的多源地址下载,可以实现网速叠加。示例命令:
aria2c -c -x 1 -s 2 https://alist.yfycloud.site:4433/d/Guest/Aria2/grpc.tar.xz\?sign\=JzEpqFm02IlJUuYfCQY3RZdU-NxYVyMElvQShef8Wy0\=:0 http://192.168.36.254: 8000/grpc.tar.xz
- -s 2 表示文件被分成 2 份并行下载,-x 1 表示每个 host 最大创建 1 个连接。这里指定了 2 个源 url,因此意思就是从每个源各创建 1 个连接。
- 其中源 alist.yfycloud.site 为公网地址,走以太网。源 192.168.36.254 走 wg(底层基于 wifi)
但是上面使用了两台服务器提供相同的文件,由于有两个公网地址(使用 LAN 地址的链接底层 wg 仍然需要一个公网地址),因此分流比较简单。如果要缩减为 1 台服务器,就得有让即使是只有一个公网地址,也可以走不同路由的方法(即分别从以太网和 wifi 出去)
我开始的想法是本地使用一个 nginx 反向代理远程的链接,使得请求不同本地地址 127.0.0.x bind 到不同出口出去。nginx 支持 proxy_bind
参数,支持绑定到不同源 ip 地址。但是没想到 Windows 的路由非常不灵活,无法实现源地址的路由1
后面我利用一个简单的千兆路由器(xiaomi 4A gigabit version)将多台设备连接起来,并在每台设备上开启 nginx 反代,实现了只有一个公网地址的情况下,对同一个服务器的网速叠加效果。
nginx 的方法虽然有效,但是整个 setup 有点复杂(windows 需要配置 nginx,设置路由表),并且只能针对一个目的地址叠加网速。访问网页其它内容就无法加速了。
之后又去了解了 ECMP 技术,其中 per flow 和 per packet 分流的想法看上去确实很美好。如果可以实现的话,可以真正实现针对任意协议的网速叠加。(单连接在 per flow 情况下还无法提升速度,但是能够对不同单连接负载均衡也足够了)
各方案总结
- 单机器 wifi 有线叠加
- 方法:aria2c 指定多个源地址,不同地址使用不同路由。
- 优点:简单,只需要使用 aria2c
- 缺点:
- 需要有多个公网 ip,否则无法根据目的地址路由
- 几个链路就需要几个公网 ip (windows 不支持源地址路由导致的)
- 多机器使用 nginx 反代
- 方法:对上面方法的扩展,每台机器使用 nginx 反代,类似于 CDN 节点。叠加所有机器的链路
- 优点
- 提升了扩展性,不同机器可以使用相同的公网 ip 反代
- 缺点
- 设置相对复杂
- 只能代理 HTTP(S)
- 只能对设置的单个公网 ip 叠加链路,没设置的 ip 仍然只能使用一个链路
- ECMP 负载均衡
- 方法:利用 linux 的等效多径路由,在路由器上就流量负载均衡到各节点出去
- 优点
- 设置好后,对所有流量都可以负载均衡到不同链路。多线程下载就可以叠加网速。
- 缺点
- windows 垃圾的网络能力,无法 masqerade 导致方案一度不可行(因为只有一个网段,最后回来的流量必然还是得走一个链路)
- 利用 wg 在 openwrt 路由器和 windows 间创建额外的局域网段,将 SRC NAT 转移到 openwrt 上,规避了 windows 的限制。
- ECMP 的不足
- 第一个问题是不知道怎么配置 ECMP 检测失效的链路。 wg 断开连接后,ECMP 并不会删除掉坏掉的 nexthop。在这种情况下,总是导致网络不可用(虽然其它 nexthop 是可用的)
- 第二个问题是链路利用率低,因为是 per-flow 进行负载均衡。计算 L4 hash 后,每个连接等可能分配到每个链路,并不保证不使用相同链路。而简单的数学计算我们可以得到 3 个链路,3 个连接时,使用全部链路的概率仅为 2/9,4 个连接时仅为 9/16。这也是为什么 iperf3 -P 3 每次结果可能不一样。n 个 链路 n 个连接情况下,利用率随着 n 增大,下降到极限值 \(1 - 1/e \approx 0.63\)
- ECMP 节点作为下载机器时,只能使用本地链路。
- 如果路由器可以作为一个反代节点就可以解决,可惜我的 mi4a 只有 16M 的 flash,应该装不下(TODO:可以试试自己编译镜像)
下载 windows11 镜像,从一小时二十分钟,下降到二十分钟
利用 mi4a + 两台 windows 共 3 个路径进行 ECMP,手机播放 B 站 4K 视频时的效果,CPU 有 %30-40 的占用。
使用其它设备作为扩展屏幕
假如入你刚好有两台笔记本,或者笔记本和一个大屏的平板。有什么办法把其中一台计算机的屏幕作为另一台计算机使用呢?
调研后,常见的选择是 spacedesk,效果还可以。不过我使用过程中,即使两台笔记本有线连接到路由器,还是遇到了卡顿的情况。因此在考虑是否有其他选择,要是能够有 sunshine+moonlight 那么顺滑就好了,突然一个想法冒入脑海中——是否能用 sunshine 实现扩展屏幕呢?于是尝试起来。
在第一台笔记本上安装好 sunshine 作为服务端。笔记本 CPU 为 i5 1135g7,轻薄本。由于 intel 的编解码都挺强,外加两台笔记本都是千兆网线连接,所以不太担心性能问题。
第二台笔记本安装好 moonlight,连接。结果发现只串流了第一台笔记本的主屏幕,并且是镜像模式。和所想要的效果不一样。我想要的是新增一个屏幕。怀着这理论上应该是可以做到的想法,搜索了 github 的 issue。结果看到有人讨论能否串流多个显示器。确实,我笔记本连接的另一个 27英寸显示器都无法串流。应该有办法切换吧,我这么想着。
讨论中有人提到 sunshine 默认串流主屏幕,可以运行多个 sunshine instance,每个设置串流不同屏幕。这令我突然想到,岂不是可以在第一台笔记本上安装一个虚拟屏幕,第二台笔记本串流这个虚拟屏幕就可以达到扩展的效果了?
结果非常 Amazing 啊,居然真的就 work 了,效果非常丝滑。甚至我觉得比 spacedesk 的效果还要好,毕竟画面的码率都可以调整。
此文主要记录下这个 usecase,并简单记录配置方法。
体验纯 IPv6 网络
起因是给 wolf 的开发者提建议时,涉及到了通过 HE(Hurricane Electric) 提供的 6in4 服务接入 ipv6 网络 。既然给别人介绍了,感觉自己不能没有实操过,因此就尝试在自己的网络连入 HE。
I want to streaming over ipv6 network. However wolf only listen on ipv4 for now.
ABeltramo — 2024/10/06 23:42
Probably not, I don't have IPv6 in my LAN/WAN so not sure how to implement it.. Might be worth opening up an issue in Github!
TheRainstorm — 2024/10/06 23:49
Doesn't your ISP provide IPv6? Otherwise, enabling IPv6 should only require enabling it on the home router.
ABeltramo — 昨天00:59
Nope, no IPv6 over here..
TheRainstorm — 昨天14:56
If you want to try out IPv6, there's another way to get the full IPv6 experience, which is through a 6in4 tunnel. Some free services, like Hurricane Electric, allow you to connect to the IPv6 network. However, this requires you to have a public IPv4 address and a router that supports 6in4 functionality (if you're using open-source router firmware like OpenWRT, it is supported by default).
I can provide you with some useful links:
https://www.youtube.com/watch?v=LJPXz8eA3b8&t=64s
https://openwrt.org/docs/guide-user/network/ipv6/ipv6tunnel-luci
ABeltramo — 昨天15:02
Thanks, that's probably my best bet on trying IPv6. I have a WAN IPv4 IP and I use OPNSense in my custom router so it should be possible.
I'm working on a few other bits at the moment, not sure when I'll have the time to look properly into this
接着意识到到,既然我可以 6in4 到国外,岂不是可以直接访问国外 v6 网站?不过由于只有 v6 地址,因此只能访问纯 ipv6 网站。于是我就好奇,在 2024 年纯 ipv6 的体验是怎么样的,因此就有了这篇博客。
秀下最后大大的 No IPv4 address detected
并且 /48 的前缀,我可以划分 65536 个子网!
linux 创建代理
我自己的机器配置了透明代理,因此配置开发环境等非常方便。但是实验室服务器等其它机器则通常没有自由的网络环境。因此如果能够让其它机器通过我内网的一台 linux 机器(通常是 VM)上网就很方便了。
由于并不需要绕过 GFW,传统的代理协议如 HTTP 代理和 Socks 即可,并且许多软件都对这两种协议有支持。比如 linux 命令行下的软件大部分支持通过环境变量启用代理,如 curl, wget, git。浏览器甚至 windows 操作系统自身通常也支持设置系统代理(也是对浏览器生效)。因此本片文章主要总结了搭建这两种代理服务器的常见软件。
总结:调研下来,虽然这两种协议历史悠久,有成熟的软件工具。但是目前大部分软件功能都太多了,这导致配置很复杂(比如 squid 9000 行的配置文件)这对简单使用代理功能有点 overkill 了。不过虽然配置复杂,学习后至少能用,因此就先不纠结了。**要我说感觉可以使用 python 简单糊一个单文件脚本,支持 1)密码认证 2)基于 ip 的访问控制 3)并且端口复用,同时支持 http 和 socks。可以放在 TODO list 里。
看奥运会的各种姿势
作为第一次认真观看奥运比赛,觉得有必要记录下我的观看方法。
平台总结
所有平台
官方列出了各个国家观看奥运的平台:Where to watch Paris 2024 Olympic Games live (olympics.com)
以中国和日本为例:
- TV 平台
- 中国是 CCTV 5, CCTV 5+, CCTV 1, CCTV 16
- 日本 NHK
- 网络平台
- 中国:咪咕视频、央视频
- 日本:主要是 NHK:NHK パリ オリンピック2024
各个平台大部分都推出了手机 APP 版本,功能更加丰富,比如咪咕视频支持分屏同时播放 4 条视频流,观看不同的解说。查看比赛项目等也非常方便。
不过我更习惯使用电脑观看,因此主要关注 Web 平台。
点评
- 咪咕视频
- 优点
- 多个视频流随时切换。包含平台嘉宾解说版本、央视版本、现场原始画面版本(无广告)、AI 字幕版本(为了听障人士)、各种网络 UP 解说版本(目的是直播带货,但是许昕的直播间分析还是很专业的)。
- 页面布局还算合理,可以方便按照项目和时间找到直播的比赛。
- 有弹幕,更有参与感
- 缺点
- 延迟高。以奥林匹克官网比分数据为基准,差了有 20-30 s。以乒乓球比赛为例,这个延迟可能相差 2-3 分
- 1080p 需要会员才能看(但是好像登录就是 vip)
- 1080p 很糊
- 优点
- 央视频 /央视网
- 优点
- CCTV 5 视频流比咪咕视频嘉宾解说版本延迟低 5-10 秒左右。
- 央视解说比较亲切。咪咕视频解说看嘉宾水平,有的喜欢有的不喜欢。
- 1080p 不需要会员,不需要登录
- 央视频页面最精简
- 缺点
- CCTV 5 视频流,一场比赛一小局结束的 1-2 分钟会插入广告,会错过一些现场画面。
- 1080p 同样很糊
- 优点
- NHK
- 优点
- 延迟相对于奥林匹克官网 < 10s 延迟。比 CCTV5 快了近 10 s
- 1080p 免费,清晰度比国内高一档
- 可以随时回放
- 英语解说(主要是乒乓球的英语解说员太经典了,感觉一直是他。推荐同时打开国内解说和英语解说,不同的解说风格)
- 缺点
- 网页限制日本 IP 访问
- 优点
VR 多人观影
VR 比较常见的一个功能便是拿来看看视频,巨大的屏幕以及可以切换的各种拟真场景,都可以带来非常高的沉浸感。而多人观影,则使得这个功能更近一步。在多人观影应用中,玩家可以创建虚拟房间,别人可以加入这个房间观看同一部电影。在虚拟场景中,玩家可以看到对面的虚拟形象做出的各种动作,也可以听到对面带有方位感的立体的声音,让人感觉对方仿佛就在眼前一样。
对我来说,VR 多人观影的最大优点可能是可以突破时间空间的限制,加强人与人之间的连接。毕竟现实中想要和好友特别是异地的好友一起看电影实在太难了,而在 VR 中却可以轻易做到。 我相信,这种加强人与人的链接,必然是 VR 未来发展的很重要的一个方向。(比如在 VRChat 中,玩家能做到的不仅是一起观影,还能一起玩游戏、一起逛图甚至一起陪伴睡觉。确实能瞥见一点元宇宙的影子)
回到正题,由于目前 VR 还处于一个开拓区,许多应用都没有完全明确的形态。针对 VR 多人观影,并没有非常成熟的应用,不同软件侧重的功能不同。以下是我对试过的一些方案的总结
现有方案总结
- Pico 视频多人观影
- 播放内容
- Pico 视频内的资源
- 各类支持 tv 投屏的应用。特别的,支持网盘(因此可以投用户下载的资源)
- 优点
有简易的 avatar(2024/06 Pico 更新 Avatar SDK v2.0.0 后,社区可以上传自定义的模型,数量非常丰富。比如全员使用假面骑士形象看特摄)- 支持若干场景切换:电影院、沙滩等
- 投屏支持 4K,清晰度比较高
- 头戴端应用,不需要 PC
- 支持 3d 视频
- 缺点
- 只能 DLNA 投屏少数白名单网站:B 站、爱奇艺(目前不支持,之后会支持),百度、
阿里(别用了,会被永久封号)、夸克网盘等。并且官方没有将其公布在网上。 - 有内容审查(虽然也算不上缺点,但确实自由度没有那么高)
- 需要网盘会员才有好体验:网盘投屏方式不充对应软件会员,基本只能 720p 投屏
- 不支持字幕,视频必须提前将字幕烧录到画面中
- 没测:不知道是否支持音轨切换
- 只能 DLNA 投屏少数白名单网站:B 站、爱奇艺(目前不支持,之后会支持),百度、
- 播放内容
- VRChat
- 播放内容
- 视频直链(类似于
http://something.com/video.mp4
) - 各种流媒体网站(如
https://youtube.com/watch?v=VIDEOID
,原理是使用 yt-dlp 工具解析出视频直链):包含 B 站、youtube、twitch直播等
- 视频直链(类似于
- 优点
- 不只是看电影;无数的 avatar 和 无数的 world(场景)可以选择,在场景中可以有丰富的交互
- 直链意味着可以自己使用服务器 host 想要分享的视频
- 没有审查。默认有白名单机制,非白名单的域名默认不会播放,但是用户可以手动关闭白名单
- 缺点
- 观感不太清晰
- VRChat 本身渲染分辨率的缘故,需要很高端的显卡才能提高分辨率
播放器貌似本身也限制分辨率,只有 480p, 720p, 1080p 可选(感觉可能只是一个外观按钮,毕竟自己服务器 streaming 的内容,码率等都是服务端控制的,播放器端不应该会再转码一次)
- 播放器不完善
- 不支持外挂字幕,只支持将字幕烧录到视频中。(有项目支持了,但是我没成功)
- 不支持切换音轨
- p.s. VLC 播放器使用同样的 url 是均支持的,说明问题是可以解决的,所以未来可期
- 目前没有 3d 的播放器,只能分享 2d 视频
- 观感不太清晰
- 播放内容
- bigscreen:一个专门用于多人观影的软件Steam 上的 Bigscreen Beta (steampowered.com)
- 播放内容
- 电脑屏幕
- 电脑本地视频
- youtube,twitch 等内容
- 优点
- 播放内容很开放,很容易播放自己下载的内容。甚至分享电脑屏幕
- 场景很丰富:有付费场景和免费场景(其中一个教室场景观感很不错)
- 支持 3d 视频
- 缺点
- 清晰度还是低了点,最高码率为 5m
- 播放内容
其实从原理上,上面应用可以分为两类。
- 一类是应用厂商提供串流服务器的。bigscreen 就属于这种,它的最大优势是用户可以分享自己的屏幕。过程其实是房主将自己的画面推流到 bigscreen 服务器,其它用户再从 bigscreen 获得画面。这本质上是一种直播。
- 另一类就是像 Pico 视频和 VRChat 这种不提供串流服务器的。它们本身不需要服务器存储视频,用户都是通过视频链接访问已有的视频网站,因此成本更低些。
理论上最方便最强大的肯定是 bigscreen 这种,但是由于串流服务器存储和带宽的高昂成本,免费用户必然会受到许多限制。因此我觉得更实际的还是后者。其实对于观看大部分正规正版资源,pico 视频已经没什么问题(要么观看 Pico 视频自带的资源,要么使用其它软件投屏)。然而因为国内的审查政策,导致很多即使正规的内容国内平台不一定引进,引进了也可能删减。因此 VRChat 更加开放这一点还是不可缺少的。
视频链接又可以分为两类
- 一类是视频直链,也就是链接直接指向 .mp4 或者 .webm视频文件。而要取得这样的链接有许多方法
- 自己购买服务器存放视频,并创建 HTTP 服务器提供访问(比如使用 nginx)
- 使用 youtube,bilibili 等流媒体平台的链接。这些链接虽然不指向视频文件,但是 VRC 播放器内部会使用 yt-dlp 工具解析出其中的视频直链。
- 使用云盘存储视频,并获得直链。虽然云盘通常不提供视频直链,甚至会打击获取直链的插件(比如百度网盘)。但是还是有一些云服务商提供了直链的功能,比如 googledrive
- 使用一些视频托管网站比如 Vimeo(VRC 官方支持的网站)。用户上传视频到网站,网站提供视频链接。同样,免费用户一般有存储空间限制。
- 另一类是直播链接。直播链接通常采用 HLS 协议,链接指向一个 m3u8 文件,文件存储了切片后的视频直链(通常封装成 ts 格式)。VRC 播放器(如 USharpVideo)都支持 m3u8 链接的播放,需要在界面选择为 Streaming。
- 直播链接和视频直链的区别在于,视频直链的文件内容是固定的,而直播链接中 m3u8 内容是动态生成的。
- 以 B 站直播为例,直播者通过 OBS 等软件将画面编码后,通过 RTMP 协议推流到 B 站的服务器(
rtmp://dl.live-send.acg.tv/live-dl
),B 站可以对视频进行存储(也就是直播回放功能),同时提供 HLS 访问。观看者使用浏览器通过 HLS 协议从 B 站服务器获取直播内容。
以下是它们优缺点的介绍
视频直链
- 优点
- 简单直接
- 自己 host 简单,只需要搭建一个 HTTP 服务器即可
- 缺点
- 为了获得最好的兼容性,对视频格式有许多要求。封装格式建议使用 mp4,编码格式建议使用 h264。字幕建议直接烧录到画面中。
- 无法随时调节视频码率。由于播放器是直接请求视频文件,因此对网络带宽有很高要求。对于下载的码率很高的电影文件,直接播放基本上是不可能的。这也是为什么如今各种云盘为了提供在线播放功能,会对用户上传的视频进行转码,保存 480p, 720p, 1080p 等不同分辨率清晰度的版本。而直播不同,直播源可以随时调节码率
直播链接
- 优点
- 兼容性最好,由于直接串流电脑画面,因此使用电脑上的播放器基本可以播放任意视频文件,字幕切换、多音轨都不是问题。
- 按需调节码率
- 缺点
- VRC 中无法随时调节播放进度,需要电脑上操作
- 画质不如原始视频文件。直播其实是在对画面进行实时编码,通常使用核显或者独显加速。而压制组压制的视频资源是使用 CPU 花费大量时间压出来的,会对各种参数进行调节,二者质量上肯定是后者更高。而且直播通常采用 CBR(固定码率) 或者 VBR(可变码率)编码方式。优化的是码率,而不是画质,因此画质也是不如使用 CRF(Constant Rate Factor)压出来的高码率视频。
- 但是其实只要抛弃画质有损失这样的想法,直播编码出来的画面是足够观看电影的。
方案介绍
最后经过研究,围绕 VRChat 确实有许多方案。最简单的,使用 twitch 直播电脑画面,当然同样会遇到码率限制等问题。所以最好的还是利用自己的上传带宽,因此可以在家宽上搭建一个 HLS 的服务器。绑定域名,提供给外网访问。可以使用 OBS 将电脑屏幕、视频播放器等画面推流到自己的 HLS 服务器上。
- 优点
- 能够播放自己下载的内容,不需要经过网盘
- 基本不会存在视频兼容性问题,因为推流的是电脑画面
- 缺点
- 国内可能有法律问题?相当于在家宽上搭建直播服务器
- 上传带宽受限(国内家宽目前上行普遍只有20-40Mbps 水平),按照 2.5Mbps 的码率,最多只能 10 人同时观看。想要 8Mbps 码率,就只能 4 人观看了。
- 没有 cdn 优化,不一定每个地方都有很好的播放体验
便携路由器
背景
很多时候,我们想要出门在外也能方便地连入我们的内网。我最近就遇到了到朋友那玩 VR 结果串流不成功的问题。虽然理论上我可以在那慢慢配置 wireguard 啥的,但是通常一下午并没有这么多时间让我折腾。所以就在想是否可以随身携带一个便携路由器,只需要插上网线,连上 wifi 就能快速接入我的内网呢?这便对路由器提出了一些需求:
- 最重要的,需要便携性,能放入书包里
- 能刷 openwrt 跑 wireguard
- 有 wifi 6
- 最好是主线 openwrt
- 性能联发科 mt7981 以上
2)和4)主要是我设想的组网方案会用到 wireguard,而一些硬件主线还没有支持(比如 360t7 和 wr30u 都是 23 下半年才支持的,我买的时候还没有)。虽然有一些第三方的 openwrt 魔改版固件,比如 QWRT,XWRT 等等。但这些系统有一些我无法接受的点,比如使用闭源 wifi 驱动,这导致无法和主线的 openwrt 组 mesh 和 fast roaming 等。另外 wireguard 需要内核模块,如果第三方固件没有的话,也没法自己安装。
3)和 5)主要是因为 VR 串流对于带宽要求是比较高的,在一些高端硬件情况下,码率设置成 500 mbps 都是可行的。我的硬件一般 60 - 100 Mbps 就够了。由于 wg 需要加解密是需要吃较多 CPU 资源的,mt7981 能够跑到 350-400 Mbps 左右(见cyyself/wg-bench: WireGuard Benchmark using netns and iperf3 (github.com))。而经典的 mt7261 MIPS SoC 则只能跑到 100 Mbps 左右就明显不够用了。因此为了保障有较好体验,wifi 6 和 mt7981 我觉得是个基准线了。
最终实现的效果
- 设备通过 wg0 接口连接入我的内网
- (三层接入)连接 5G wifi SSID1,被分配一个本地局域网地址 192.168.1.x,然后通过 wg0 NAT 后上网
- (二层接入)连接 5G wifi SSID2,通过 vxlan 二层接入我的 op1 内网,获得 op1 的内网地址
测速
- 有线 wg:420/430 (up/down,下同)
- 无线(-60dBm signal/-90dBm noise)
- L2: 257/320
- L3:300/340
最后的接口示例:
台式机升级-硬件篇
随着做种资源原来越多,原本 4T + 2T 的机械硬盘配置不够用了。即使已经做了很多缓解措施,比如将比较大的视频文件转成 av1 编码(4k h264可以达到30G -> 6G的效果),仍然是捉襟见肘。随着最近想要下载一些 VR 游戏资源,硬盘不够用了越来越明显,看来添加硬盘是必须做的了。
同时我也觉得现有的数据管理有点不安全。目前只对一些文档数据做了备份,然而一些虚拟机磁盘镜像,比如主力使用的 windows 虚拟机的磁盘镜像,由于数据量太大,只存了一份。这些都是单点故障点,一旦硬盘坏了,对我的影响是非常大的。
为了解决容量和安全性的问题,决定在台式机上添加一些机械硬盘组 raid10。
为什么是 raid10
有两个原因,一个是 raid 10 重建时更安全。不像 raid 5 重建时存在 URE 问题(指需要读取阵列全部的数据,数据量大,有很大概率遇到 URE 错误导致重建失败),raid 10 只需要读取一个 mirror 中另一块盘的数据,数据量很小。第二是 raid 10 远比其它 raid 灵活。raid 10 两块硬盘为 1 组,只需要保证两块硬盘容量相同即可。而其它 raid 均需要所有盘容量相同,这意味着我得一次性把所有的盘都买来,而一块 14T 的企业盘需要一千多,3-4 块一次购入显然成本太高。另外,raid 10 后续扩容也非常容易,插入即可扩容。而其它 raid 则需要重建整个阵列,非常费时。
这篇文章主要记录下硬件的升级点,以及人生第二次装机总结的一些经验。
epilogue
经过 1 周的规划与实践,台式机终于升级完成。现在它真的成了一个 all in one 完全体了
- AMD 5800x + 96 GB 内存,PVE 系统
- 拥有 1G, 2.5G 双网卡,搭建了 openwrt 软路由
- 拥有 zotac GTX 1063, 公版 GTX 1070 双显卡,分别直通给 linux 和 windows 两个虚拟机系统。
- 插满 8 块机械硬盘,提供 6T + 8T (6 盘 zfs raid 10) 的存储空间
然而也有一些之前没有考虑到的:
- 没想到换主板、机箱是一件非常费时费力的事情,从下午 3 点搞到了晚上 11 点。遇到问题有:清洗总共 9 把风扇太费时。插电开机没有一次点亮,差点以为主板翻车。进 BIOS 后系统还要修复引导,zfs 作为 root 分区不太熟悉等。
- 功耗高了 70 w,从 130 w -> 200 w,从每日 3.3 度涨到 4.4 度。购买硬盘时没有考虑到硬盘的功耗,没想到硬盘功耗可以有 1 倍的差距(最低 4.4 w,最高 8.0 w)。当有 8 块硬盘时,总的差距就可以相差 20-30 w。
- AMD PBO2 的降压功能非常重要,开与不开功耗相差可能 50 w
Update 2024/10/31
- 突然觉得硬盘位不是越多越好了,其实 HC520 这种 12 T 的盘,单位容量价格是一样的(甚至更低)。那么组少数几块大容量的盘和组多块盘小容量的盘总价格是一样的。
- 组小容量盘
- 优点:
- 单次购入价格低。增加 4 T 空间,需要 400 元,能够承受
- 盘更多,RAID 速度更快。单块机械盘可能只有 200-300MB。6 盘 RAID10 可以达到 600-700MB。
- 缺点:
- 部件越多,越容易坏,维护成本上升
- 优点:
- 组大容量盘
- 优点:
- 维护更容易,比如 4 块 12T 盘,容量有 24T,却只需要 4 块盘。
- 捡垃圾更好捡?毕竟服务器总有退役下来的盘
- 缺点
- 单笔花费巨大。组 raid10 起码 4 块盘,10 T 起步,开销达到 4 x 550 = 2200 级别,相当于买张新显卡了。学生党基本承受不起,工作了作为一次性投入倒是适合。
- 优点:
- 组小容量盘
- 所以感觉 8 盘位已经是家用最适合的数目了,扩展会遇到很多问题
- SATA 数据接口不够:我的 X570 有 8 个 SATA 口,这也是家用主板基本上最高的数目了。虽然可以通过 PCIeX1 转 SATA,但是这存在一些问题:
- PCIeX1 转接卡价格并不便宜,转 4 个 SATA 需要 80-100 元
- 很多 mATX 主板 PCIeX1 槽不多:PCIeX1 可能和第二个显卡槽共享通道,插了显卡就要降速(比如变成 x2 通道数)。另外 PCIe 还可能用于:接无线网卡、接万兆网卡。因此 PCIe 槽往往是不够用的
- 机箱显卡限长问题:半岛铁盒F20 正面有 8 个硬盘仓,背面还有 2 个。对于显卡限长的问题,还可以通过移除前面的硬盘笼解决。而插满的情况下话就麻烦了。
- SATA 供电接口数量:我的安钛克 650 W 电源,提供了 2 条 P6 转 4 个 SATA 的电源线。插 8 个盘正好,插 10 个则另需购入 SATA 1 分多 电源线,有点麻烦。(不过价格只要10 元,另外我的电源还有 P6 是 IDE 的电源线,也可以购买 IDE 转 SATA 电源线。因此电源接口方面,极限硬盘数为 12 个)
- 电源 12v 功率问题:机械硬盘启动时需要使用 12v,电流可以达到 2A,因此单盘有 24W,8 块盘就是 192 W,12 块 288 W,16 块 384 W,20 块 480 W,这还不包括 CPU 和显卡功率(虽然开机时显卡功率可能不高)。因此多块硬盘需要考虑电源 12v 功率(电源功率是分开的,有 3.3v, 5v, 12v)是否达标,硬盘是不能无限叠加的。
- 使用 1 分多的线时还要考虑单条线承载的电流,因此也不能分太多(参考后面显卡 6 pin 供电只能承载 12A,感觉 1 分 4 是比较稳妥的,1 分 6 感觉就有点风险了)
- 所以我现在的策略是,维持 8 块盘不变,逐步把小盘换成大盘。
- 目前结构 4+3+(2+3+3)x2,RAID 中 1 块 3T 有报错。由于盘还没坏,坏了可以立马用外面的 3 T 替换,因此不太担心,还可以苟一苟。
- 等坏了之后,就空出了 1 个硬盘位。此时可以再购入 1 块 4 T 的,和原本单独的 4T 构成一个组,然后替换原来的 2T 的组,替换出来的 2 T 放在外面。
- (4+3+3)x2 + 2 + 2
- 希望下次坏就是 2 T 的了,这样又可以购入大盘
- 上面的升级策略感觉还挺巧妙的,当我们想要升级 RAID10 组的容量时:
- 如果使用朴素的升级策略
- 一次性购入两块大盘,替换掉原来的一组 RAID,这样就会多出两块盘,需要有额外的空闲硬盘位。而二手出机械硬盘感觉还是挺麻烦的。
- 而使用我的策略:
- 维护若干非 RAID 盘位 (比如 采用 6 raid + 2 非 raid,或者 8 + 4 布局)
- 非 RAID 盘位可以维护一个大盘,用于平时非关键数据存储。这样就能用一半的价格享受大容量存储
- 当 RAID 盘位有盘损坏时,此时再购入一块大盘组成一组,替换 RAID 有损坏的组,小盘就放到外面继续工作。可以发现上述操作不需要额外的硬盘位,相当于原地升级。而且小盘由于工作时间更长,因此下次更有可能坏掉,而坏掉就又可以空出一个空闲盘位了。还想要升级的话,可以继续购入比 RAID10 组中最小盘大的盘,等待下次升级即可。
- 如果使用朴素的升级策略
MTU 的那些坑(二层隧道组网)
背景
背景:串流软件不支持手动添加 ip,导致需要二层隧道连接两个路由器。
通过 mDNS proxy 实现本地发现
之前还研究过这类软件一般是怎么发现server的。发现确实有一些方法可以实现跨网络的发现。比如常见的“发现”协议(不知道术语是什么)有mDNS和upnp。是通过ipv4 multicast实现的,所以只要能proxy多播包,就可以实现在两个网络互相发现。
2024/4/17 update: 今天在搜索 vxlan 时发现了一篇博客也遇到了这个问题。他的解决方案是通过设置 bridge-nf-call-iptables 使得桥接的数据包也通过 iptable,然后再通过 iptable 修正 MSS。因此其方案对于 UDP 仍然存在问题。不过将 bridge 的包进行三层的处理的思路是一样的。在 OpenWrt 设备间使用 VXLAN 创建隧道 – t123yh's Blog 看来这个问题并不是 gre 才会有的。那有没有更加现代的二层隧道协议,能够自动解决这个问题呢?
二层隧道方案
隧道方案如下图所示:
- 两个路由器间通过 WAN 口 IPv4 建立 GRE Tap 隧道
- op1 上将直接将 tap 接口桥接到到原有 br-lan 上
- op2 保留了原本自己的 lan,然后创建了一个新的 br-lan2,连接了 gre tap 接口和 eth2 接口。
op2 是 PVE Host 上一个容器
op2是PVE上的一个LXC容器,分配了eth0, eth1, eth2分别对应wan, lan1, lan2
- op2 侧将一个无线路由器连接到 PVE host(软路由)一个网口,该网口位于 PVE vmbr2 下。op2 eth2 也连接到了 vmbr2。
- 通过切换无线路由器连接到 PVE host 不同网口(对应 vmbr1 和 vmbr2),可以控制无线路由器位于 lan1 还是 lan2。
VLAN 切换 SSID 方案
刚开始想了一个更复杂不用改动AP网线的方案。将AP通过一根线和软路由连接,然后创建2个vlan。AP上,创建两个不同SSID绑定到不同VLAN接口上。这样就可以通过更改连接的WiFi来切换lan1和lan2了。不过PVE上vlan貌似配置有点复杂:可能需要创建一个vlan awareness的vmbr1,然后op2连接到vmbr1的eth1和eth2指定不同vlan id。但是我没想清楚vmbr1下untagged的接口怎么办?vmbr1设置了awareness后还能连接untagged的端口吗?因为不太了解PVE VLAN awareness bridge的更详细内容,加上路由器就在手边,换条线也很快,因此就没有使用该方案。
遇到的问题
实现上述方案后,确实让一开始的 VR 串流软件可以工作了,但是确遇到了一些意外的问题。
我发现我的手机平板都无法使用 moonlight 串流我位于 op1 下的台式机 KVM-win10 了。
- moonlight 显示在线(这个需要开启 MSS clamping),但是一连接就报错。报错让检查 UDP 端口 478000 是否开放。
- 笔记本同样连接的 WiFi,却确能够正常串流
以前也遇到这样能 ping 通,但是一发送数据就出问题的现象。问题一般是哪里的接口 MTU 设置不正确导致的,因此这次也是往 MTU 这方面排查问题。 加上之前遇到的 MSS 问题,于是这次相当于把我知道的都结合起来,看能否解决这个问题。
为设备分配静态 v6 基于 ndppd
背景
学校提供了 ipv6,我的许多服务都可以使用 v6 访问。但是学校提供的 PD 可能会变,虽然使用 ddns 可以将 v6 地址映射到固定的域名,但是 ddns 有延迟性。因此最好的解决办法仍然是给机器设置静态 ip。
p.s. 短期重启网卡 PD 不会变,但是如果长期离线再上线就可能变,类似于 dhcp。
宿舍的 v6 wan 口无法设置静态 ip,因为学校路由器要求设备必须发了 RS 才会路由该包。
信智楼则可以静态设置。当访问外网时,学校路由器不会检查源地址,会直接路由出去。等接收到回包时,学校路由器看到目的地址为设置的静态地址,会在广播域上发送 NS,我自己路由的 wan 口接收到 NS 后响应 NA(v6 版的 ARP 过程)。学校路由器便知道了我路由器 wan 口的 mac 地址,于是将包发送给我的路由器 wan 口。
虽然信智楼可以静态设置 v6,但是仅限于 wan 口。lan 下面的设备如果手动设置了静态 v6,是无法正常上网的。重复上过程会发现学校仍然会正常把包路由出去,但是收到回包后,会像之前一样发送 NS。而我们路由器的 wan 口接收到 NS 后,根本不会响应 NA(因为不是自己的 v6 地址)。LAN 和 WAN 又不是一个广播域,因此收不到 NS。从而导致学校路由器并不会把回包交给我们。
但其实上面的需求是可以实现的,我们需要一个叫做 NDP proxy 的软件。
hexo 迁移到 mkdoc
我比较喜欢 hexo 的 tags 字云的效果,不过由于以下原因,我打算迁移到新的静态博客框架 mkdocs material theme
- hexo nodejs 的依赖实在是太麻烦了
- hexo 展示的信息量太少了(也可能是我使用的模板的问题)
- 我感觉这一点上 mkdoc 效果就很好,在大显示器上能够显示更多信息,查阅博客的效率更高
TODO
参考方案
- 杰哥的{运维,编程,调板子}小笔记 (jia.je)
- jiegec/blog-source: The source of my blog. (github.com)
- ヾ (▽*))) 欢迎回来~ (shaojiemike.top)
p.s. 由于我使用的 markdown 编辑器的原因,才发现标准 MD 中 list 前面需要有一个空行。也就是迄今写的博客均踩了这个坑。。。而 mkdocs 不支持这个非标准行为,以后慢慢更正吧
NAS 无法扫描到涉及的网络知识
背景
tsj 的 NAS 插墙上网口,笔记本同样插墙上网口,然后使用 NAS 官方工具扫描不到设备。由于扫描不到设备所以不知道设备 ip,也就无法进一步配置。
那么是什么原因导致扫描不到呢,照理来说,NAS 和笔记本应该接在同一个交换机下,理应是互通的。在研究该问题过程中,查缺补漏了很多网络知识,特记录。
疑问一:学校为何插在相邻墙上的网口的机器分配到不同网段的 ip?比如 114.xxx 和 210.xxx 疑问二:宿舍路由器查看 wan 口邻居表,为何不同 ip 的 mac 地址是相同的?
openwrt x86 升级
我的台式机 pve 充当软路由功能,包含一个 openwrt LXC 容器。该容器使用了很长时间,配置了 wiregurad,以及复杂的防火墙和路由规则。但是在一开始创建 lxc 容器时,rootfs 选择了 x86/generic 版本。该版本实质上是 32 位的系统
Generic is for 32-bit-only hardware (either old hardware or some Atom processors), should be i686 Linux architecture, will work on Pentium 4 and later. Use this only if your hardware can't run the 64-bit version.
虽然不知道会对性能等有多大影响,但是对于有点完美主义的人来说还是无法接受。因此研究如何将其升级到 64 位版本。
本来以为应该是一件很简单的事情,但是阅读 openwrt wiki 后,发现并没有想象中的简单。并且也学习到了一些关于镜像、分区、文件系统的知识。特此记录。
IPv6 知识和 openwrt relay 模式的坑
ipv6 协议详细介绍了 ipv6 几种获得地址模式的区别:SLAAC, 无状态 DHCPv6 和 有状态 DHCPv6
另外介绍了下 openwrt 使用 relay 模式导致需要 ping wan 口才能通的原因
服务器上运行switch模拟器(linux 云游戏)
服务器有一些老计算卡如 P40,TitanV 都是有图形能力的,并且貌似性能还不错(比如 TitanV 有 3070 的性能)。还有一些老卡如 1080Ti 很少有人用,闲置太浪费了。
因此本着科学求实的精神,想探究下实验室这些卡的性能水平,为之后科研做铺垫。。。好吧,我编不下去了,就是想白嫖实验室显卡玩游戏。加上最近塞尔达王国之泪出了,之前捡垃圾时,见过用 P106 这种 100 块的 “1060” linux 下玩 switch 模拟器效果不错。而自己的显卡 rx550 根本带不动,流下了没钱买卡的泪水。
声明
- 所有配置都是在 docker 等隔离的虚拟化环境中,不会对系统环境造成污染,影响其它人使用
- 只在使用人数不多的机器上实验,不会在 A100 等主力机器上实验
- 只在没人用时实验
效果
- docker gow
wolf 即插即用效果
捡垃圾-rk3399 DIY KVM
由于我的台式机承载了 NAS,做种,Jellyfin,博客,文件同步等功能,已然成为一台服务器,因此其可靠性非常重要。但是我还是经历过几次由于网络故障导致其无法访问的情形,此时则只能去实验室维护比较麻烦,因此需要一个 IPMI 的管理功能,使得网络出故障情况下也能远程访问。
而家用 PC 主板很少有支持 IPMI 功能的,支持的板子一般都要 2000 元以上。因此需要一个成本低廉的方案,在网上搜索一阵后发现确实有基于树莓派 DIY 的方案,并且有一个比较大的开源项目 PI-KVM。
然而由于树莓派 400-500 昂贵的价格,使得 DIY 的成本仍然很高。直到我看到使用普通 arm 板子的方案。甚至可以使用 40 元的电视盒子。因此价格完全可以保证在 200 元以内,我觉的是一个可以接受的方案。
最后成本
- king3399 开发板:咸鱼 120
- ms2130 USB 采集卡,支持 1080p 60 帧:淘宝 60
具体数学
具体数学公式小册子
推广一个自己的 github 仓库,期望共同完善。 阅读具体数学电子书籍时,由于经常需要查看某个编号的公式因此产生了这个项目,用于阅读时查阅公式 https://github.com/TheRainstorm/concrete_math_formulas
成套方法
在具体数学 (Concrete Mathematics) 课本中,在解约瑟夫递推方程时,第一次介绍了成套方法 (repertoire method)。之后也使用这种方式求解各种递推方程。相信很多人第一次看到这种方法时都会感觉到不可思议——还能这样?虽然每一步都能看懂,但是就是不知道这种方法是怎么想到的。在查阅了一点资料后,我对该方法有了更多的认识。先说明一点,该方法并不是一种万能方法,实际上要求问题要有线性结构。
参考:linear algebra - Mathematical explanation for the Repertoire Method - Mathematics Stack Exchange
CUDA 编程&工具
参考资料
- Tutorial 01: Say Hello to CUDA - CUDA Tutorial (cuda-tutorial.readthedocs.io)
- 北京大学高性能计算平台 (pku.edu.cn)
CUDA 安装
总结:
- 最简单方式是看 cuda 下载页面提供的安装命令
- deb 安装貌似无法只安装 cuda,不安装驱动
- runfile 安装可以做到不重启
- cuda-toolkit-12-1 包含 cuda
- nvidia-driver-530 包含驱动