之前用了大概半年的 RX580,黑苹果 4K 输出,感觉挺好,只是机器有点浪费,毕竟 CPU 和内存都还不错的,想搞个双系统游戏主机,买了 1T 的 SSD,顺利安装上了 Win11,这样短板就来到了显卡 RX580。
PDD 上比较了半天,觉得 RX6600-XT 也不错,价钱不错,性能主流,就入手了。也用了一阵子了,感觉不错,相比 RX580 耗能要少,散热压力小一些,关键是主流游戏 1080、甚至 2K 都还行,现在闲暇时间,不少都是切换到 Win11 下玩游戏了。
黑苹果可加上 NTFS 的 KEXT 驱动,读写 Win11 分区不成问题,所以对于黑苹果来说,也算是扩大了硬盘容量。虽然 SATA 3.0 600MB 的速度远不如 M2 的速率,但总比没有好嘛,可惜主板是 ITX,只有一个 M2 的接口,要不谁不想接双 M2 呢。
之前的 ITX 机箱散热不大行,于是换成了一个大一点的机箱,一整面都是钢化玻璃,算是海景房配置了。
这个便宜的机箱虽然有开机键,但是没有电源指示灯,主板是否上电,得仔细看风扇才能知道,这样子不如搞个 ARGB 灯呢,再说之前都没玩过。
主板是支持 ARGB 灯的,PDD 上也很便宜,不到 10 块钱一个的 9cm 风扇就有带灯的了。
而且主板打开 ARGB 后,默认配置的 ARGB 幻彩就很好看,各种颜色无缝转换真的挺好看的,windows 系统下面不用设置,我就用默认的,但是问题来了,重启进入 mac 后,幻彩变成了单色灯,如果再重启,灯就不亮了,估计是 mac 下面覆写了 ARGB 灯的配置,而主板支持在操作系统上面做配置。
但是主板没有提供这个比如说固定配置,或者只读的模式,防止操作系统覆盖,这个就很蛋疼了。
我是找了不少 mac 下面配置 ARGB 的,貌似华硕在 mac 下有专门的 app,但是我这个牌子的没有,而且我这个牌子的在 windows 下使用厂商提供的 ARGB 软件,都无法设置 ARGB 灯,感觉都没用心做,至少几家主板厂家上层配置的 app 是不通用的。
还好 PDD 上面有独立供电,不依赖主板 5v3 针 ARGB 接口的控制线,还支持无线设置,我没买无线的,买的就是几块钱便宜的线控设置,线控设置好后,重启也不影响。控制线的电源可以是 USB、大 4 pin 或者 sata 线,另外一端就直接当成 5v3 针的公口,风扇的 ARGB 控制线直接接了上去,避免了主板、操作系统的介入操作,配置直接在线控按钮上切换就好。
默认的颜色不好看,换了好几种,终于换到了幻彩,那就可以了,大赞🥰
不用 docker 的原因是,有些时候需要创建不同版本库的开发环境,这个时候,其实只是引用路径的不同,文件系统甚至是 directory 的,而不是 image,当然 LXD 貌似也没有提供类似 docker 的分层的文件系统,主要是我也不大懂 docker。
有一说一,后面其实发现 alpine 除了空间占用小一些,其他都是劣势,比如 musl 的 CRT,居然不能打印调用栈,我也是服气了,下面的内容来自之前的学习,大概是能建立起一个可以用的系统容器。
下面比如 a1、a2 是 alpine instance。
这个 profile 就是 default profile,后续从不同 image(发行版本)创建 container 时,会使用这里的 storage、network 等的配置
这里使用了 alpine 3.18 的 image,由于 container 可以直接保存东西,所以直接拉起来,这里 ash 是不会运行 ~/.profile
的,如果是从 sshd 登陆进去的才会,所以这种情况下需要 source 一下 shell 的配置文件。
$ lxc launch images:alpine/3.18 a1
$ lxc exec a1 ash
比如挂载 host /wwwdata
到 a1 相关目录,之后删除这个挂载,这里的前提是文件其实是只读的,如果需要挂载读写的文件系统,需要创建一个用户权限 map 配置,在容器内的 /etc 相关配置中,不过感觉也不是很方便。
$ lxc config device add a1 sharedwww disk source=/wwwdata/ path=/var/www/html/
$ lxc config device remove a1 sharedwww
用 alpine 容器还遇到问题,比如拉起 cincau 映射 host 端口到容器,容器内的 proxy,居然一直长连接到内部服务器,从不关闭连接,人家 ngnix proxy 就做得很好,由于遇到上面说的 musl CRT 不能打印堆栈,就没有继续研究下去了。
作为封闭的开发环境感觉还行,作为 production 的容器,首先不能用 alpine image,其次,还有不少需要摸索调整的东西吧。
先记录一下。
学习了一下 OTP 这个东西,比如用的是 LuaOTP。
区分为 OTP、TOTP、HOTP 这三种,OTP 英文展开为 One Time Password,是服务端对客户端的一次性密码,属于双因素验证的范畴。
TOTP 这里,公式中的一个参与计算的因子是时间,比如这个时间因子,可以 30 秒更新一次,那这个一次性密码,也是 30 秒更新一次。
HOTP 有一个 counter 的概念,每次用过后都会变化,每次都生成新的,对应的是该一次性密码的使用次数。
上述 LuaOTP 支持 Google Authenticator,浏览器 JS 这边用的是菜鸟教程介绍的qrcodejs,用来生成二维码图片。
当然也可以不生成图片,而是导出字符串,Google Authenticator 也同样支持字符串导入。
之前不大理解这一套,搞了一下,发现也没有那么难。
自从 mnet 在 Mac/Linux 下支持了多进程模型,cincau 也支持上了。
luajit 会检测是否增加了多进程的配置,如果有多进程的配置,将创建了一个控制面用的 UDP。然后 monitor 根据 worker 的存活数量,fork() 足够数量的 process。
控制面之所以选用 UDP 而不是 TCP,是因为 UDP 是按帧发送的,不需要再做一层协议的解析,系统内也不存在丢帧,只要发送的数量不多就没啥问题,缺点是一帧的数据长度有限。
另外,monitor 通过 fork() 拿到了 worker pid 后,需要将 pid 传递给调用的 luajit 做记录。而 worker 在被 fork() 后,需要往 monitor 控制面的 UDP port 发送数据,传递自己的 port 和 index 的对应关系。
每个 process 都有控制面的 UDP 用来收发内部数据,接口部分是提供了类似 worker index 来指明需要发送到的 worker port。之所以用 worker index,是因为 worker 被重新创建后,绑定 port 是会变化的(配置文件中不需要指明每一个 worker 的 port)。worker index 序号将会从 1 到 worker count,其他的序号代表 monitor。
而且在每个 worker process 内,是不知道其他 worker 的控制面端口的,只能通过 monitor 来转发,monitor 毕竟拥有所有 worker 的 index 和 port 的对应关系。
之所以 monitor 需要占据其他非 worker 的 index,举个例子,比如搜集当前所有 worker 的某项数据。
可以向 worker 1 发送事件,worker 1 接收到后,往 worker 序号为 index + 1 的发送,一直到最后一个 worker 发送给序号 worker count + 1,最后就是 monitor 收到了,你可以认为数据是被不断叠加的,一直到 monitor 收到结果。
这样本轮就搜集完了。如果需要传递收集的结果,monitor 可以广播到所有的 worker ,这样就完成了一个数据的循环。
假若某个 worker 挂掉后,拥有 cookie 的客户端如果继续访问,接管的其他 process 为了保持登陆态(比如拥有服务端定义的最新的 cookie 数据),可以事先通过某个事件同步 cookie,monitor 也一样接收。这样当 worker 被 fork() 后,拿到的将是跟其他 worker 一样的的 cookie 数据。
上述的 monitor 模型依赖 mnet 的多进程模型,虽然持有 listen fd,但是不处理 accept 事件,只有一个系统内的控制面 UDP 来传递数据,其他的工作,只是检查、拉起 worker process,状态相对稳定。
另外在 .mooc 配置文件上,透出来了多进程配置中的数据回调、发送函数,除了 WORKER_ONLINE
、WORKER_ROUTE
、WOREKR_SESSION
是保留事件外,其他的可以自行添加处理。
mnet 目前还未原生支持多线程,比如在同一进程内持有所有 socket 列表,无法独立区分不同线程,反正把这个区分交给调用方来解决。
而对于 mnet 多进程模型,之前也无法区分,比如无法在不同进程 listen 同一个 fd。
当然现在可以了,是基于 Mac/Linux 的 fork() 和 waitpid() 等系统调用做的,Windows 下面没有实验,也不打算实验了。
上面链接的例子,是基于 Linux 的 fork() 系统调用,子进程可以访问父进程的所有资源,比如打开的 fd 等等,在代码方面,指针、fd 在 fork() 后看起来跟父进程是一摸一样的。
多进程模型下,fork() 出来的子进程会有多个,由于 event queue(epoll/kqueue)在内核中唯一,虽然子进程拥有该 event queue 的 fd,但实际上无法操作,验证得自己重新创建一条才行,所以子进程被 fork() 出来后,立即自己新建立一条 event queue,将之前拥有的 fd 都添加上去。
其次由于 listen fd 实际上也是父子进程都拥有的,在多条 event queue 中被监听,如果新的链接进来,其实只能 accept 一次,其余进入 accept 函数的实际上会 accept 失败,貌似较老版本的 Linux 会造成其他的问题,具体我也没有进一步地了解。这些是我从网上不知名博客搜到的,当时是想借鉴 nginx 的多进程模型的,就搜到了这个问题。
解决的办法是使用进程间锁,创建只有一个临界资源的 semaphore,子进程们在进入实际 accept 前,尝试独占该 accept 系统调用,如果尝试失败,将放弃此次 accept。该系统 API 在 Mac/Linux 下面的接口是一样的,
对于父进程,在这个多进程模型中,将上升为 monitor,并放弃对该 listen fd 的 accept,所以判断较为简单,不需要争夺关联 accept 的临界锁。因为多次 fork() 而拥有所有子进程的 pid,转而 waitpid(),在子进程崩溃后,可以重新 fork() 出新的子进程接着服务。
多进程模型相较于多线程,优势在于资源的隔离。进程之间通过操作系统的进程模型来隔离,子进程崩溃后还可以再次拉起来。劣势在于资源共享,如果子进程之间需要大量的资源同步和共享,因为都需要通过系统的 IPC,消耗会变大,而且也不方便。
大概 ¥800 左右的家用 Win11 4K 电脑,配件什么都是 2 手 PDD,毕竟有保修。
在 B 站上看了太多的相关评测,想着可以自己动手试下,之前就有想法将老家的几台电脑换成 Win11 4K,这里就给摸索一下,排一下雷。
因为我还有旧的额外机箱,这个后面看看要不要换新吧,排雷期间可以先用旧的顶住。
以上配件搭配出来的电脑,目前价格大概 ¥800 左右,我预估跑 Win11 + 4k 的基本办公应该没啥问题吧。
另外在 D3H 的主页上面看不到第二条 PCIEx4 的版本,但即便是 PCIE 2.0,转接 NVME 后速度也有 1000MB+,虽说是 NVME PCIE 3.0 下的半速,但也要比 SATA 3.0 的 550M 或者 600M 快一倍,挺值的;另外还可以选一些直接支持 nvme 的寨板,也是办法,这里不做比较了。
大概花了几个晚上的业余时间,才装了好这台电脑,时间都花费上升级 BIOS、安装 Win11 上面了。
先是用闲置的 SSD 安装了 Win10 拉起系统,之后下载 GA 的 @BIOS 软件,读出本来就是最新版本 F4 的 bios.bin,然后用 MMTool 编辑 bios.bin,按照教程删除用不到的组件,再插入 nvme 组件。
当然如果你都用 U 盘升级 BIOS,而且有额外的电脑来操作的话,其实也不需要先用 SSD 安装 Win10 给这套主板拉起系统,我这么操作的原因,是想先用 Win10 验证一下这个二手主板再说。
和所有按照教程操作的博主一样,我也遇到了 MMTool 在 Win10 和 Win11 下面的 UI 显示问题,部分按钮被遮挡了,无法删除组件、插入组件。
按照某个 B 站视频介绍的方法,下载 Resoureces 软件修改 .exe,视频介绍的是修改字体,但仅仅这样作是不够的,我是继续调整了几个展示区域的大小。
BIOS 升级成功后,启动认出了 NVME,显示为 PATA:SS,顺利当上了启动盘,那可以拔掉之前的 Win10 SSD 了。
然后继续使用之前的 U 盘安装 Win10 到 NVME。本来想在 Win10 上一步到位直接升级到 Win11 的,结果 ISO 解压缩后本地点击 setup.exe 升级,等了半天提示失败,说硬件不支持。不大明白之前 B 站博主在 775 主板上面是怎么从 Win10 setup.exe 升级到 Win11 的。
后来按照鲁大师介绍的方法来操作,需要使用 U 盘安装,这样就只能重新安装了。
试了一下,i3-4170 + RX560 鲁大师跑分 30 多万,开 Edge 播放 B 站 4K 视频有点卡,特别是从小窗打开放到到全屏这个操作,其他基本勉勉强强,搞得我有点心慌。
换成 e3-2170v3 后,鲁大师跑分 40 多万,CPU 分数提升其实没有很多,但看 B 站 4K 不卡了,就系统启动时候 CPU 占用有点高,大概有 70% ~ 80%,后面稳定在 15% 左右,看视频、刷网页大概半个小时,感觉基本的办公需求应该挺挺顺畅的,而且内存占用也不高。
原本我预计是要使用 16G 内存的,现在觉得 8G 应该够了。我还试了一下 4G,系统虽然能启动,但一上来就用了 2.5G,随便开几个网页就 3G 多了,罢了罢了。
那先给家里人配置这套 Win11 + 4k 组合,如果后续系统升级,或者软件吃紧,应该会选择全套替换,毕竟这个 CPU 已经是主板配置的顶天了,到时再看看有什么可选吧。
电脑总是要更新的,主板平台升级之后,旧的机箱、主板、CPU 就沦为了其实不常开机的所谓 NAS 辅助机。作为大差不差的家用网络服务器,SMB 一定是要配置的,即便是机器不常开机。虽然不常开机,但是配置也得搞好不是,毕竟偶尔救急,或者要实验一些奇怪想法的时候,这台机器可是绝好的实验场所。毕竟有好几个数据盘,而系统盘是独立的,这样系统可以随便搞,坏了重装就是,再说也没那么容易坏。
上次升级 RX580 之后,好早之前的一条 GTX1060 就落下了(如今版本的苹果不支持 RTX 显卡了),就一并给装到这台 NAS 辅助机上。除此外,原有的搭载的技嘉 B85M 主板,支持的是 LGA1150 针脚的 CPU。
主板状况还很好,灰都不多,原来的 CPU 是 i3-4150,属实有点烂了,SSH 登陆上去,链接都觉得慢。在 PDD 上买了 E3-1271v3,4 核 8 线程。内存原来就有 16G 的 1600,现在内存那么便宜,再给加到 32G。算下来升级的钱也不到 ¥300,怕原来的 CPU 下压式风扇顶不住,给搞了 4 热管的塔式风扇,要 ¥30+ 呢。
各项准备好之后,拆机折腾吧(虽然已经拆过无数遍,螺丝都有点滑丝了):
这里因为机箱是 M-ATX,所以一般的塔式 CPU 风扇能支持,没啥问题,如果是更小的机箱,就得考虑用不了普通的塔式机箱,而得使用下压式 CPU 风扇了。
给技嘉主板升级 BIOS 得做好心理准备,国内技嘉网站可能下不到所需要的 BIOS,而得开梯子到其台湾网站上下载,台湾网站上能搜到的主板 BIOS 要比其大陆网站多多了。
为啥现在的散热硅脂那么稀,而且只送了那么一点,好多年前的硅脂,多到溢出为止,不大习惯。
其实一开始我的拆装顺序不对,BIOS 没升级,显卡没插,而新 CPU 是不带核显的,要不怎么会这么便宜。
反正最后一通折腾下来,顺利点亮跑起来了,SSH 上去,嘿,这链接的速度真的快,git clone 了一个不算小的 C++ 工程,make -j8 对比了一下之前的 i3,时间少了一半多,看了下 CPU 温度,挺低的。
那就先这样吧。
保存下面的文件为 microsoflt.edge.mobileconfig
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadDisplayName</key>
<string>Microsoft Edge Policy</string>
<key>PayloadIdentifier</key>
<string>com.example.edge-sensible</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>6BAC9A8B-19F3-4876-99D9-BCA6C8B30238</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>TargetDeviceType</key>
<integer>5</integer>
<key>PayloadContent</key>
<dict>
<key>PayloadDisplayName</key>
<string>Microsoft Edge Policy</string>
<key>PayloadIdentifier</key>
<string>com.microsoft.Edge.13D4EE1D-74BF-4963-AE69-88E61F9FD9EA</string>
<key>PayloadType</key>
<string>com.microsoft.Edge</string>
<key>PayloadUUID</key>
<string>9FCEF286-C20B-4708-A8C0-FB728C75B677</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>HubsSidebarEnabled</key>
<false/>
<key>DiagnosticData</key>
<integer>0</integer>
<key>EdgeCollectionsEnabled</key>
<false/>
<key>EdgeShoppingAssistantEnabled</key>
<false/>
<key>PersonalizationReportingEnabled</key>
<false/>
<key>ShowMicrosoftRewards</key>
<false/>
</dict>
</dict>
</plist>
在系统偏好设置 -> 描述文件,点击 +
添加这个描述文件
在 Edge 地址栏里面输入 edge://policy/
,点击重新加载策略,就可以看到效果
--
教程在这里 https://zhuanlan.zhihu.com/p/614089321,只不过上面的描述文件需要删掉注释。
PDD 淘了一张矿难迪兰 RX580 8G 2304SP,Hacktonish 免驱一次点亮了,拆机装机不到 20 分钟,原来的亮机卡 RX560 4G 虽然支持 4K,但在 B 站 4K 以及大量弹幕下,感觉有点吃力,没过多久风扇就开始呼呼的。
在这之前做了不少功课,首先只是想升级一下原来的 RX560,毕竟原来的也不是不能用,就是风扇有点吵而已,所以价格嘛要压住。
然后是要免驱,要不升级系统后就很麻烦,而苹果是很规律的一年一升级。我之前就有一张 GTX 1060,但是随着系统升级,渐渐用不了了,记得最开始还能用 NV 的 WebDriver 的。
另外其实 PDD 还有挺多的是 RX590,完全版也能免驱,完全版指的是非 GME 的版本。对应之下 RX580 的完全版是 2304SP,一般的都是 2048SP。看评测实际运行起来后,两者差别不大,但 RX590 的价格是真上去了,要 45x,而 RX580 的价格,我买了之后还一直在跌。
我其实要求简单,4K 稳稳压住就好了,最后是 28x 买下的,店家说店保 2 年,感觉这个价格还是挺香的。
另外 RX580、RX590 的非完全版也不是不能用,需要自己刷相应的 BIOS,伪装成完全版,貌似要在 Win 下操作,对我来说这个条件不大好搞,所以就一心想要完全版的,价格限制下,RX580 2304SP 就香起来了。
现在稳定运行 3 天了,大部分情况下风扇声音很轻几乎听不见,是优势;劣势是跑了几个小时后,感觉温度其实挺高的。然后我压测了一下,风扇全力运转后的声音是真的大,像个风箱一样,但这种情况不大容易遇到吧。
不管这么说,这个价格下,大部分的情况下很不错的,可喜可贺,😁
玩起了 Win11,搞的是 Ubuntu-18.04 LTS,其实 Ubuntu 的版本对我来说不是那么重要,之所以选 18.04 因为其他虚拟机上面用的也是这个版本,而不同版本的 glibc 库不同,会导致同一个程序编译后在其他虚拟机上面跑不了,为了避免这个麻烦,就都用同一套吧,要升级就一起升级。
另外 WSL2 不再依赖系统功能里面的 Linux 子系统组件,而是提供了一个单独的更新包,这个 URL 是固定的,下载后更新,可以解决 WSL 下面固定 IP 地址的难题。
安装完成后,WSL 版本是 1.0 以上,比如我的:
> wsl --version
WSL 版本: 1.1.3.0
...
首先建立一个虚拟交换机:
我们刚创建的 WSLBridge 虚拟交换机,分配地址是外部物理网络的 DHCP,接着我们指定 Ubuntu-18.04 使用刚建立的虚拟交换机做桥接设备,Powershell 下面在用户目录下(%USERPROFILE%目录下)创建 .wslconfig,内容是下面
[wsl2]
networkingMode=bridged # 桥接模式
vmSwitch=WSLBridge # 你想使用的网卡
ipv6=true # 启用 IPv6
这样 Ubuntu-18.04 虚拟机的 IP 地址就固定了(由外部路由分配)。
访问 WSL 上的 Ubuntu 18.04 还挺方便,文件管理器地址栏上面输入 \\wsl$
就能访问 Linux 系统的 \
目录,可太方便了。
虽然我的是家庭版 Win11 22H2,但并不妨碍我使用 WSL,之前网上找的一个脚本,保存内容为 xx.cmd 并以管理员权限运行,就能获得 WSL 的能力。
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
不过我后面改成从 github 上下载更新了,去掉了 Windows 系统功能里面的 Linux 子系统的钩,不知道这个还有没有影响。
不管了,先玩着吧,😊